
复制集使用的异步同步方式,复制集成员直接每隔2s发送一次hearbeat(pings).当主节点与其它成员通信超时10s后,一个secondary节点将会被选举为primary节点.在新的版本中,如果存在多个secondary节点,当第一个节点被选举为primary后,其它的secondary节点将从它开始复制数据.
二.创建replica sets
下面是搭建一个一主两从三节点replica sets的具体步骤(1).添加replSet参数
在你所有节点的mongodb实例添加replSet参数,在一个group中的replSet参数需要一致,有点类似于oracle dg中的db_name参数. 然后启动所有节点的mongodb实例 例如我的主机名为mongodb1的配置文件:然后启动所有的实例:[root@mongodb1 ~]# cat /etc/mongod.confport=27017dbpath=/data/dblogpath=/data/log/mongod.logfork = trueoplogSize=500replSet = rs0
[root@mongodb1 ~]# mongod -f /etc/mongod.confabout to fork child process, waiting until server is ready for connections.forked process: 2722child process started successfully, parent exiting
(2).初始化replica set
使用rs.initiate()来初始化复制集,在一个节点而且只能在一个节点进行初始化,例如我们这里在mongodb1上进行初始化,那么这个节点将会成为primary节点. 这里我们没有配置config参数文件,那么系统会使用默认的配置文件.> rs.initiate(){"info2" : "no configuration specified. Using a default configuration for the set","me" : "mongodb1:27017","ok" : 1}rs0:OTHER>
当然你也可以先配置一个配置文件,然后使用rs.initiate(rsconf)来初始化,例如:
rsconf = {_id: "rs0",members: [{_id: 0,host: "<hostname>:27017"}]}
(3).检查初始化配置文件
使用rs.conf()来查看初始化配置文件:可以看到当前的members只有一个,即_id为0的,即我们刚刚初始化的这个节点.rs0:OTHER> rs.conf(){"_id" : "rs0","version" : 1,"protocolVersion" : NumberLong(1),"members" : [{"_id" : 0,"host" : "mongodb1:27017","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1}],"settings" : {"chainingAllowed" : true,"heartbeatIntervalMillis" : 2000,"heartbeatTimeoutSecs" : 10,"electionTimeoutMillis" : 10000,"getLastErrorModes" : {},"getLastErrorDefaults" : {"w" : 1,"wtimeout" : 0},"replicaSetId" : ObjectId("575647b35e9005faa0e8d690")}}
(4).将剩下的成员添加到复制集
使用rs.add()方法将成员添加到复制集.你必须连接到primary节点来执行添加成员的操作.你可以使用rs.status()查看主节点信息:添加成员:rs0:PRIMARY> rs.status(){"set" : "rs0","date" : ISODate("2016-06-07T04:16:20.542Z"),"myState" : 1,"term" : NumberLong(1),"heartbeatIntervalMillis" : NumberLong(2000),"members" : [{"_id" : 0,"name" : "mongodb1:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 1184,"optime" : {"ts" : Timestamp(1465272244, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2016-06-07T04:04:04Z"),"electionTime" : Timestamp(1465272243, 2),"electionDate" : ISODate("2016-06-07T04:04:03Z"),"configVersion" : 1,"self" : true}],"ok" : 1}
rs0:PRIMARY> rs.add("mongodb2:27017"){ "ok" : 1 }rs0:PRIMARY> rs.add("mongodb3:27017"){ "ok" : 1 }
再次查看复制集配置,可以看到members有三个成员了.
rs0:PRIMARY> rs.conf(){"_id" : "rs0","version" : 3,"protocolVersion" : NumberLong(1),"members" : [{"_id" : 0,"host" : "mongodb1:27017","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1},{"_id" : 1,"host" : "mongodb2:27017","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1},{"_id" : 2,"host" : "mongodb3:27017","arbiterOnly" : false,