环境:
server | port | role |
---|---|---|
10.0.3.107 | 27017 | m0 (PRIMARY) |
10.0.3.107 | 28017 | ma (SECONDARY) |
10.0.3.109 | 27017 | m1 (ARBITER) |
已经配置的主从关系m0,m1并且带有密钥认证需要添加一个仲裁器,问题在于新建的仲裁器不会同步主节点数据,也就是不会同步已经创建的数据库认证信息
实现高可用性,如果条件允许,最好的方案是将仲裁器放到另外的网络环境,或者服务器中
docker run -d --restart=always -p 28017:27017 \
-v /home/tglmm/mongo-key-file:/mongo-key-file \
-v /data/db/ma:/data/db \
--name ma mongo:4.1.4 \
/bin/bash -c 'mongod --port 27017 --keyFile /mongo-key-file/keyfile --replSet rs0 --bind_ip 0.0.0.0'
进入当前主节点所在的mongo shell
docker exec -i 640ed49c16cd mongo \
--host 10.0.3.107 \
--username xxx --password 'xxx' \
--authenticationDatabase 'xxx' \
--port 27017
rs.add('10.0.3.107:28017') //先将其添加为一个辅助节点,等待一段时间会进行数据的全量复制
rs.status()
"members" : [
{
"_id" : 0,
"name" : "10.0.3.107:28017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 4988,
"optime" : {
"ts" : Timestamp(1569575425, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1569575425, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2019-09-27T09:10:25Z"),
"optimeDurableDate" : ISODate("2019-09-27T09:10:25Z"),
"lastHeartbeat" : ISODate("2019-09-27T09:10:30.930Z"),
"lastHeartbeatRecv" : ISODate("2019-09-27T09:10:31.248Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "10.0.3.107:27017",
"syncSourceHost" : "10.0.3.107:27017",
"syncSourceId" : 1,
"infoMessage" : "",
"configVersion" : 2
查看到起状态为 :SECONDARY,并从主节点同步数据库
等待一段时间基本同步完成
rs.remove('10.0.3.107:28017')
rs.status() 10.0.3.107:28017//查看已经被踢出
rs.addArb('10.0.3.107:28017') //将其添加为复制集的仲裁节点
rs.conf() //查看状态
待上面操作结束模拟主节点故障,查看辅助节点stateStr值