: ISODate("2018-10-01T04:14:13Z"),
"optimeDurableDate" : ISODate("2018-10-01T04:14:13Z"),
"lastHeartbeat" : ISODate("2018-10-01T04:14:17.405Z"),
"lastHeartbeatRecv" : ISODate("2018-10-01T04:14:16.418Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "11.1.1.11:27017",
"syncSourceHost" : "11.1.1.11:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 3
},
{
"_id" : 2,
"name" : "11.1.1.11:27019",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 4,
"lastHeartbeat" : ISODate("2018-10-01T04:14:17.405Z"),
"lastHeartbeatRecv" : ISODate("2018-10-01T04:14:17.424Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 3
}
],
"ok" : 1,
"operationTime" : Timestamp(1538367253, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1538367253, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
副本集中三个节点的状态应该是:
端口
节点
状态
27017
主节点
1,PRIMARY
27018
从节点
2,SECONDARY
27019
仲裁节点
7,ARBITER
3.副本集的读写分离
在Mongodb副本集中,主节点负责数据的全部写入操作,也可以读取数据。从节点只能读取数据,而仲裁节点不能读和写数据。
因此,在主节点27017上可以进行数据的读取和写入操作。
图5
但是这个时候从节点上并没有真正的成为这个副本集的正式成员。在从节点执行任何有关数据的操作将会产生一个错误:
图6
只需要在从节点上执行一下这个而操作即可解决问题:
图7
图8
在仲裁者节点上同样需要执行类似的操作,但是仲裁者节点是不保存副本集中的数据的。
图9
在从节点或者仲裁者节点上写入数据将会失败。
图10
4.副本集的故障转移
现在通过将副本集中的主节点27017节点停止运行来演示mongodb副本集的故障转移功能。
(1)停止主节点27017。
图1
图11
查看节点状态。
此时原来的主节点27017处于不可用状态,而原来的从节点27018节点成为了新的主节点。
图12
三个节点的新状态如下所示:
端口
节点
状态
27017
主节点
8,(not reachable/healthy)
27018
从节点
1,PRIMARY
27019
仲裁节点
7,ARBITER
因为27018节点成为了新的主节点,因此可以进行写数据的操作了。
图13
在重新启动27017节点后发现这个原来的主节点成为了从节点。
图14
至此,Mongodb的副本集方式的集群部署成功。
4.副本集的优点
(1)部署简单。
Mongodb的副本集方式的集群,相对于MySQL的MHA或者MM方式的集群而言,部署方面简单,仅仅使用Mongodb官方软件的内置功能进行安装部署,不需要第三方的脚本或者软件即可完成部署。
(2)故障转移后,主节点的IP地址发生变化。因此需要客户端程序来处理这种IP变化。Mongodb的java客户端 SDK正好提供了这种功能,因此只需要将一个副本集中的主节点和全部从节点都加入到连接地址中即可自动完成这种读写分离和故障转移的功能,即不需要程序员自己写代码来检测和判断副本集中节点的状态。
Mongodb的副本集的Java SDK和Redis Cluster的Java SDK对于故障转移的自动化处理方式,都相当的人性化。
5.副本集的缺点
Mongodb的副本集方式的集群架构有如下的缺点:
(1)整个集群中只有一个主节点。因此写操作集中于某一个节点上,无法进行对写操作的负载均衡。