MongoDB集群上副本集(replica set)建立
2015-04-21 11:01
671 查看
1副本集的配置
在单机上成功运行MongoDB后,要使用副本集来创建Mongodb集群,需要先关闭mongod守护进程,然后:mongod --replSet setname --fork来使用自己设置的副本集的名字setname并启动mongodb。注意,--fork可以不用,它的意义是让mongod 在后台执行,以方便在shell中运行别的程序。
如果要在配置文件中使用这些选项,可以在配置文件mongo.conf中加入
replSet=setname fork=true oplogSize=1024 #日志文件大小,兆(M)为单位。mongod启动时会创建相应大小的文件,如果设定太大会报磁盘空间不足的错误
然后使用 mongod -f mongo.conf 来启动进程
其他选项参见 http://docs.mongodb.org/manual/reference/program/mongod/#cli-mongod-replica-set
2.启动和增加节点
在各个节点上使用了1.中的配置启动后,有两种方法来建立副本集的连接:1)初始化副本集,增加节点配置
用客户端登陆进入mongo使用rs.initiate()初始化副本集,等待一段时间(主要是创建日志文件oplog)后,看到提示符显示setname:PRIMARY> 也就是成功了,然后:
rs.config()
可以查看副本集的配置状态,比如:
{ "_id" : "clover", "version" : 5, "members" : [ { "_id" : 0, "host" : "host1:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 } ] ...目前只有一个主节点(primary),在确保可以访问另外两个节点的mongo服务的情况下,在本机的mongo shell中输入:
rs.add("hostname:port")来增加节点,成功后使用:
rs.status()来查看副本状态。
2)使用集群配置文档来创建副本集
这个方法我没有验证,如果要利用配置文档,在进入mongod shell之后,先要创建一个文档:config = { "_id" : "setname", "members" : [ {"_id" : 0, "host" : "host1:port"}, {"_id" : 1, "host" : "host2:port"}, {"_id" : 2, "host" : "host3:port"}, ... ] }
然后使用这个文档来启动副本集:
rs.initiate(config)使用这种方法必须要用mongo shell来先创建配置文档,而不能使用配置文件。
3.测试副本集
首先,使用rs.isMaster()
得到:
{ "setName" : "clover", "setVersion" : 7, "ismaster" : true, "secondary" : false, "hosts" : [ "host1:27017", "host2:27017", "host3:27017" ], "primary" : "host1:27017", "me" : "host1:27017", "electionId" : ObjectId("5535c57b872d670c6331e5bf"), "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2015-04-21T05:01:31.370Z"), "maxWireVersion" : 3, "minWireVersion" : 0, "ok" : 1 }
这样来查看主节点和副本集的状态,值得一提的是,备份节点(secondary)如果设置属性hidden为0,则rs.isMaster()将不能观察到此节点,例如下面的代码:
cfg=rs.config() #获取当前的配置 cfg.members[2].priority=0 #让_id为2的节点优先级降为0 cfg.members[2].hidden=1 #设置此节点隐藏,仅当其优先级为0时有效 rs.reconfig(cfg) #应用配置将_id为2的节点设为隐藏,使得其状态不被rs.isMaster看到,但它可以被rs.status()看到。
接着,在mongo shell插入一个文档:
for(i=0;i<1000;i++){test.coll.insert({count:i})}
db.coll.count() #测试插入文档是否成功
1000
然后检查备份节点上的情况:
new Mongo("host2:27017") db.coll.count() 1000说明在host2上的数据库也更新了。
然后,尝试将host1上的mongod进程宕掉,这种情况在实际生产中可能出现,查看host2和host3的情况:
在host1的bash上:
sudo bin/mongod --shutdown killing process with pid: 15910然后登陆host2上的mongo shell,发现提示符已经变为:setname>primary 表示host2已经变为主节点,在host2上db.coll.count()得到1000,表示备份的数据还在。
重新使用之前的集群配置文件来启动mongod -f mongo.conf ,发现提示符为setname:SECONDARY>表示其变为备份节点,在host2上用rs.isMaster()测试显示:
"setName" : "clover", "setVersion" : 9, "ismaster" : true, "secondary" : false, "hosts" : [ "host1:27017", "host2:27017" ], "passives" : [ "host3:27017" ], "primary" : "host2:27017", "me" : "zookeeper2:27017",<
副本集重新变为3台主机。host2仍为主节点,host3因为设置优先级为0变为消极(passives)状态,它不会被选为主节点。
相关文章推荐
- Mongodb 副本集-集群搭建方式--Replica Set
- 搭建高可用mongodb集群 replica set—— 深入副本集内部机制
- 搭建高可用mongodb集群 replica set—— 副本集
- Replica Set副本集方式的mongodb集群搭建
- Mongodb的Replica Set 副本集集群搭建
- Mongodb Replica Set 集群
- MongoDB的副本集Replica Set
- Mongodb Replica Set + Sharding集群
- 学习MongoDB(三) Add an Arbiter to Replica Set 集群中加入仲裁节点
- 学习MongoDB(二) Replica Set集群配置
- mongodb集群之 replica sets 副本集
- mongodb集群方案:Replica Set集群的安装配置
- MongoDB Replica Set 副本集
- Mongodb集群配置(sharding with replica set)
- Mongodb安装搭建Replica Set+Sharding集群
- MongoDB 副本集自动复制 Replica Set
- MongoDB(五)-- 副本集(replica Set)
- MongoDB Replica Set搭建集群
- Mongodb设置Replica Set集群 并使用PHP来连接
- mongodb主从配置:副本集replica set