一、MongoDB复制集介绍
1、如下图所示有一个数据库集群,集群中有三台数据库服务器,一台活跃服务器和两台备份服务器。当活跃服务器A发生故障时,会根据权重算法从备份服务器B和C中选出B作为新的活跃服务器,而当A恢复时当成备份服务器,继续加入到整个数据库集群中工作,这就是MongoDB的副本集。
2、配置一个副本集
2.1 在npfdev1,npfdev2,npfdev3三台机器上的mongodb.conf增加配置:
replSet=kgpcReplSet, 指定了复制集的名称. 为了使用方便,我们暂时不要使用auth启动,去掉auth参数。
2.2 启动MongoDB,使用 service mongod start 命令.
2.3 然后就需要初始化复制集。进入到这三台数据库服务器中任何一个的admin数据库,执行如下图的操作来初始化复制集:这里没有设置这三台服务器的权重,MonggoDB推选活跃服务器的策略是随机的。
2.3.1 那么使用命令mongo npfdev1:27017/admin
2.3.2 初始化复制集, 运行如下命令:
db.runCommand({"replSetInitiate":{
"_id":"kgpcReplSet",
"members":[
{"_id":1,"host":"npfdev1:27017"},
{"_id":2,"host":"npfdev2:27017"},
{"_id":3,"host":"npfdev3:27017"}
]
}}
);
2.3.4 分别进入到这三台服务器的shell界面.可以发现npfdev1的服务器被推选成了活跃服务器,而其它两台就是备份服务器.
2.3.5 在活跃服务器shell中可以使用“rs.status()”来查看副本集的状态。
kgpcReplSet:PRIMARY> rs.status();
{
"set" : "kgpcReplSet",
"date" : ISODate("2017-05-05T13:05:29.158Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 1,
"name" : "npfdev1:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 268,
"optime" : {
"ts" : Timestamp(1493989299, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-05-05T13:01:39Z"),
"electionTime" : Timestamp(1493989298, 1),
"electionDate" : ISODate("2017-05-05T13:01:38Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 2,
"name" : "npfdev2:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 240,
"optime" : {
"ts" : Timestamp(1493989299, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-05-05T13:01:39Z"),
"lastHeartbeat" : ISODate("2017-05-05T13:05:28.555Z"),
"lastHeartbeatRecv" : ISODate("2017-05-05T13:05:28.549Z"),
"pingMs" : NumberLong(1),
"syncingTo" : "npfdev1:27017",
"configVersion" : 1
},
{
"_id" : 3,
"name" : "npfdev3:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 240,
"optime" : {
"ts" : Timestamp(1493989299, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-05-05T13:01:39Z"),
"lastHeartbeat" : ISODate("2017-05-05T13:05:28.557Z"),
"lastHeartbeatRecv" : ISODate("2017-05-05T13:05:28.554Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "npfdev1:27017",
"configVersion" : 1
}
],
"ok" : 1
}
kgpcReplSet:PRIMARY>
2.3.6 复制集如下图:
复制集使用的异步同步方式,复制集成员之间每隔2s发送一次hearbeat(pings).当主节点与其它成员通信超时10s后,一个secondary节点将会被选举为primary节点.在新的版本中,如果存在多个secondary节点,当第一个节点被选举为primary后,其它的secondary节点将从它开始复制数据.
2.3.7 读写分离操作,注意:默认情况下非活跃服务器(SECONDARY)是不能进行数据库读操作的。如下图:
如果要设置SECONDARY节点也可以进行读操作,那么可以设置slaveOk参数为true。但是此属性在shell中无法完成,这个特性是被写到MongoDB的高级驱动程序中的。
参考文献
2. mongodb-创建复制集(replSet)