MongoDB集群与LBS应用系列(一)
MongoDB集群与LBS应用系列(一)
1. 概念
MongoDB作为著名的NoSQL,早已非常流行。它的地理应用也非常成熟,被foursquare用于生产环境也已经多时。本文主要记录今年6月份的一个地理产品中,使用MongoDB的过程和遇到的一些问题以及解决方案。我们在原型系统搭建时候,使用了三台机器,搭建MongoDB ReplicationSet 集群,作为地理数据库以使用。
2. 集群部署
2.1 硬件资源
三台操作系统为CentOS 64bit version6.4的服务器,IP地址和域名
192.168.2.22 mongodb0.ventlam.com
192.168.2.23 mongodb1.ventlam.com
192.168.2.24 mongodb2.ventlam.com
2.2 软件安装
2.2.1 创建MONGODB专有的软件源
下载并安装mongo 2.4.5版本,(3台机器分别执行)
vim /etc/yum.repos.d/10gen.repo
- 添加以下源列表
[10gen] name=10gen Repository baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64 gpgcheck=0 enabled=1
* 安装MongoDB
yum install mongo-10gen mongo-10gen-server
2.2.2 REPLICATION SET 集群搭建
部署生产环境下的MongoDB ReplicationSet ,需要数据库部署在尽可能隔离的机器上(每个数据库部署在不同的物理机器,使用不同的网络和不同的电源)。
2.2.2.1 需要配置mongodb 通过域名能够访问
修改/etc/host或者配置DNS实现(3台机器分别执行)
vim /etc/host
添加如下命令
192.168.2.22 mongodb0.ventlam.com
192.168.2.23 mongodb1.ventlam.com
192.168.2.24 mongodb2.ventlam.com
修改数据库配置文件(3台机器分别执行)
vim /etc/mongod.conf
在配置文件加入以下参数:
port = 27017 dbpath = /mnt/mongo replSet = rs0
启动数据库 (3台机器分别执行) 创建数据目录 mkdir /mnt/mongodb/,并修改配置文件启动mongodb
vim /etc/rc.d/init.d/mongod
启动
mongod service mongod start
添加开机启动
chkconfig mongod on
2.2.2.2 检查三台机器数据库是否可以互联
首先开放27017端口 (3台机器分别执行)
/sbin/iptables -I INPUT -p tcp --dport 27017 -j ACCEPT
/etc/rc.d/init.d/iptables save
然后分别检查连接情况,在所有机器输入以下命令:
mongo --host mongodb1.ventlam.com --port 27017 mongo --host mongodb2.ventlam.com --port 27017
如果都可以进入mongo shell界面,即可。否则,请检查防火墙规则。
2.2.2.3 配置repilcation set
进入mongo shell mongo 输入以下配置命令(只需要在任意一台机器执行)
rsconf = { \_id: "rs0",
members: [ { _id: 0, host: "mongodb0.ventlam.com" },
{ _id: 1, host: "mongodb1.ventlam.com" },
{ _id: 2, host: "mongodb2.ventlam.com" } ] }
2.2.2.4 初始化
rsconf rs.initiate(rsconf)
查看rsconf配置情况
rs.conf()
如果返回下列值,证明mongodb集群搭建成功
{ "_id" : "rs0", "version" : 1,
"members" : [ { "\_id" : 0, "host" : "mongodb0.ventlam.com:27017" },
{ "\_id" : 1, "host" : "mongodb1.ventlam.com:27017" },
{ "\_id" : 2, "host" : "mongodb2.ventlam.com:27017" } ] }
2.2.2.5 添加删除数据实例
rs.add("<hostname>:27017") rs.remove("<hostname>:27017")
本作品由VentLam创作,采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。
MongoDB学习之--增删改查(2)
昨天简单介绍了官方驱动操作MongoDB进行增删查操作的,今天继续介绍更新操作.....
方法简介
官方驱动中更新操作使用collection的Update方法,有泛型和非泛型两个版本:
其签名如下(列出了两个简单并常用的的重载,还有几个):
public virtual WriteConcernResult Update(IMongoQuery query, IMongoUpdate update);
public virtual WriteConcernResult Update(IMongoQuery query, IMongoUpdate update, UpdateFlags flags)
首先分析一下方法参数:
IMongoQuery 和 IMongoUpdate只是两个约束接口,实现了该接口的类均可作为该方法参数,对于前者,在这里我们主要通过Query类的静态方法和 QueryBuilder<T>这个泛型类的实例方法来构造
IMongoQuery ;对于IMongoUpdate我们主要通过Update类以及其泛型版本的静态方法来构造,其静态方法返回值类型为UpdateBuilder,该类恰好实现了IMongoUpdate接口。
分析类比调用
基础实体类:
在我们关系数据库中,比如oracle或者sqlserver中按照实体类设计,表结构应该是两个,学生信息表以及地址表,但是我们假设存储在一个表中方便我们类比;我要更新数据库中信息,通常关系数据库中我们是这么做的:
update tableName set a='a' and b='b' where c='c'
在mongodb中我们就是向下面这样做:
use dbName; db.CollectionName.update({query:"query"},{"$set":{update:"update"}})
现在看我们通过C#驱动怎么构造这样一种结构:关于IMongoQuery的构造上一篇我也介绍过一些,这里只谈下上次没说的部分 ,
首先构造IMongoQuery:
a.通过QueryBuilder<T>构造
var t1 = queryBuilder.EQ<String>(t => t.Address.City, "北京");//where city="北京"
b.通过Query构造
var t2 = Query.EQ("Address.City", "北京");//where city="北京"
var t3 = Query<Student>.EQ<String>(t => t.Address.City, "北京");//where city="北京"
其次,构造IMongoUpdate
var u1 = Update<Student>.Set<String>(t => t.Address.City, "上海");//set city="上海"
var u2 = Update.Set("Address.City", "上海");//set city="上海"
这样可以往下调用update方法了
collection.Update(t1, u2);//只更新满足t1的一个文档对象
collection.Update(t1, u2, UpdateFlags.Multi);//更新满足t1的所有文档对象
今天就到这里了,另:Update类还有其他用于设置的方法不单set方法,这里有兴趣的可以看下api,加深下了解。。。
MongoDB集群与LBS应用系列(一)的更多相关文章
- MongoDB集群与LBS应用系列(二)--与Hadoop集成
长期以来,我每开个系列,只有兴趣写一篇,很难持之与恒.为了克服这个长久以来的性格弱点,以及梳理工作半年的积累.最近一个月会写两篇关于Mongo在地理大数据方面的实践和应用,一篇关于推荐系统的初期准备过 ...
- mongodb系列~mongodb集群介绍与管理
mongodb 集群维护1 简介 谈谈mongodb的集群架构2 常用的维护命令 1 查看状态 sh.status() 1 version 2 shards: ...
- 搭建高可用mongodb集群(四)—— 分片(经典)
转自:http://www.lanceyan.com/tech/arch/mongodb_shard1.html 按照上一节中<搭建高可用mongodb集群(三)-- 深入副本集>搭建后还 ...
- [转]搭建高可用mongodb集群(四)—— 分片
按照上一节中<搭建高可用mongodb集群(三)—— 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的 ...
- 搭建高可用mongodb集群(四)—— 分片
按照上一节中<搭建高可用mongodb集群(三)—— 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的 ...
- 搭建高可用mongodb集群(四)—— 分片
按照上一节中<搭建高可用mongodb集群(三)-- 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的 ...
- 搭建高可用mongodb集群—— 分片
从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出 ...
- MongoDB集群卡死问题
一年前搭了个MongoDB集群,跑得还算不错,但是有几次遇到过服务卡死的问题.处理起来已经得心应手了,拿来跟大家分享一下: 故障现象: 业务查询缓慢,而且会有连接异常: { "serverU ...
- mongodb集群安装及到现在遇到的一些问题
集群搭建 只有3台服务器,开始搭建mongodb集群里主要参照的是http://www.lanceyan.com/tech/arch/mongodb_shard1.html,端口的设置也是mongos ...
随机推荐
- hive union all 使用
功能:将两个表中的 同样的字段拼接到一起 測试: create external table IF NOT EXISTS temp_uniontest_ta ( a1 string, a2 strin ...
- Android游戏开发研究与主角在地图滚动
让人感动的地图过程平滑滚动 玩过rpg朋友应该都知道RPG的游戏地图一般都比較大 今天我和大家分享一下在RPG游戏中怎样来处理超出手机屏幕大小的游戏地图. 如图所看到的为程序效果 ...
- C#中设计Fluent API
C#中设计Fluent API 我们经常使用的一些框架例如:EF,Automaper,NHibernate等都提供了非常优秀的Fluent API, 这样的API充分利用了VS的智能提示,而且写出来的 ...
- foj 2082 树链剖分 第2天
擦,没啥好说的,这个模板至少得打10遍..纪念自己成功的打错了.. #include <iostream> #include <cstdio> #include <cst ...
- [Unity3D]Unity3D连衣裙实现游戏开发系统
大家好,我是秦培.欢迎关注我的博客,我的博客地址">blog.csdn.net/qinyuanpei. 不知从什么时候開始,国产RPG单机游戏開始出现换装,仙剑系列中第一部实现了换装的 ...
- ApacheBench(ab)使用简介
网站性能压力测试是服务器网站性能调优过程中必不可缺少的一环.只有让服务器处在高压情况下,才能真正体现出软件.硬件等各种设置不当所暴露出的问题. 性能测试工具目前最常见的有以下几种:ab.http_lo ...
- java之集合框架使用细节及常用方法
集合类的由来: 对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定. 就使用集合容器进行存储. 集合特点: 1,用于存储对象的容器. 2,集合的长度是可变的. 3,集合中不可以存储基本 ...
- jQuery EasyUI API - Base - Draggable [原创汉化官方API]
最近在学习jQuery EasyUI,发现中文的文档好少,部分文档不错但它是鸟语的,为了大家也为了自己学习吧,汉化做一下笔记. 有没有说清楚的,或者翻译不正确的地方还请大家谅解指出.. 由于工作时间原 ...
- EnterpriseLibrary 6.0(微软企业库6.0学习笔记) 之Data Access Block 配置和获取链接字符串
EnterpriseLibrary 的特点是快速开发,融合了微软工程师多年的经验,现在在微软内部有专门的一个小组在完善EnterpriseLibray,最近的更新时间是April 2013. 相关链接 ...
- WINHTTP的API接口说明
BOOL WINAPI WinHttpAddRequestHeaders( _In_ HINTERNET hRequest, _In_ LPCWSTR pwszHeaders, _In ...