前面学习了 Replica Set 的搭建和从节点的添加,删除过程,接下来学习Replica Set 节点的切换以及 failover 相关的内容。
Replica Set 节点切换是指当出现故障或者出于维护需要,需要将主节点切换到另一台从节点,例如主节点主机需要硬件扩容时,那么需要停主节点主机, Replica Set 支持节点成员切换,其中使用的是投票竞选机制,对于投票竞选机制看了下文档,还不是非常明白,但主要是通过 priority 参数来控制的,接下来演示下。
节点切换
1.1 基础环境 ( 三节点 )
1 |
rs0:PRIMARY> rs.status(); |
备注:三节点 replica set 环境,其中最后一个节点为主节点,假如主节点由于某种原因需要切换,假设需要切换到从节点”redhatB.example.com:27018”,可以通过设置节点 priority 参数来实现,节点的 priority 值越大,切换时的优先级越高。
1.2 设置节点的 priority 值
1 |
cfg = rs.conf() |
1.3 操作日志
1 |
rs0:PRIMARY> cfg.members[0].priority = 2cfg.members[0].priority = 2 |
备注:设置好从节点的 priority 值后,调用一次 rs.reconfig 操作会导致当前主库中断,因为需要重新执行主节点竞选,大概几十秒后,新的主节点产生。
1.4 重新查看状态
1 |
rs0:SECONDARY> rs.conf(); |
备注:这时可以看到各节点优先级 priority 的值,节点默认的 priority 值为 1,不显示。
1.5 再次查看节点状态
1 |
rs0:SECONDARY> rs.status(); |
备注:此时主节点已漂移到节点 “redhatB.example.com:27018”,达到目标。
测试 Failover
MongoDB 的 replica set 特性支持自动 failover,当主节点由于某种原因掉线时,replica set的其它节点可通过竞选产生新的主节点,接下来测试下这个特性。
2.1 基础信息
1 |
rs0:PRIMARY> rs.status(); |
备注:此时的主节点为 “redhatB.example.com:27018”。
2.2 异常关闭主节点。
1 |
[mongo@redhatB data03]$ ps -ef | grep 27018 |
备注:过一会后,节点 “redhatB.example.com:27019” 竞选成为新主节点。
2.3 查看节点状态
1 |
[mongo@redhatB ~]$ mongo 127.0.0.1:27019 |
备注:可见节点 “redhatB.example.com:27019” 转变成主节点了,此时异常的节点”redhatB.example.com:27018” 不可用,接下来测试,启动异常节点是否能够自动恢复。
2.4 连接新主库,并新表一个集合;
1 |
[mongo@redhatB ~]$ mongo 127.0 :27019 |
2.5 启动原来故障节点
1 |
[mongo/pgdata_xc/mongodb/data01/mongodb_27018.conf data03]$ mongod -f |
备注:三个节点都启用日志模式(journal),否则恢复时会有异常。
2.6 再次查看节点状态
1 |
rs0:PRIMARY> rs.status();rs.status(); |
备注:节点 “name” : “redhatB.example.com:27018” 再次竞选成功。
2.7 测试数据
1 |
[mongo@redhatB ~]$ mongo 127.0 :27018 |
备注:恢复后的节点可以查到新数据了,说明已自动恢复。
总结
以上只演示三节点 Replica set 的 failover 的情况,其它情况并没演示;另外 failover 的关键点为投票机制,这点还不是非常清楚,只知道设置节点的 priority ,还需要查阅相关资料。关于奇数节点和偶数节点 Primary 宕机后 SECONDARY 是否可以接管的问题,可以参考以下帖子:
http://www.itpub.net/thread-1740982-1-1.html
四参考
http://docs.mongodb.org/manual/administration/replica-sets/
http://docs.mongodb.org/manual/core/replication/#replica-set-failover
原创文章,作者:745907710,如若转载,请注明出处:https://blog.ytso.com/237924.html