mongo replication 脑裂问题如何处理:
一、问题描述:一套mongo replication有4个节点。1个仲裁节点。在停止实例(或实例毁坏)的时候,导致所有节点都变为SECONDARY节点。不管如何重启节点。或者停止到最后一个节点。此时mongo节点都是SECONDARY。
二、出现的现象:
1、如果此时所有节点都重新起来,mongo恢复正常。
2、如果有一个节点起不来。例如只有4个节点起来,mongo复制集的PRIMARY节点则在所有节点之间不稳定的轮流为主。(此时很难去执行rs.remove或rs.add命令)
3、如果4个数据节点有2-3个起不来。此时所有节点都保持为SECONDARY。
三、难点:那么如何恢复呢?
问题:抓不住PRIMARY节点,即所有节点都为SECONDARY节点。这时候无法执行rs.remove或rs.add命令rs.add, rs.addArb()。但是mongo的操作要求在主节点上执行。
可以通过rs.reconfig(config,{force:ture}) 强制在从节点删除或者增加节点。
四、解决方法:
注意:脑裂过程中设置优先级没用。
1、删除节点至剩下1个或者3个节点,保持3个节点存活(此时mongo能正常选举出PRIMARY 。 ):
config=rs.conf()
config.members=[config.members[0],config.members[2],config.members[3]]
rs.reconfig(config,{force:true})
(注意:"_id" : 4 并不是对应下标。members 对应的是数组的下标。从0开始。)
2、如果是删除至于剩下2个数据节点。切2个数据节点都是启动状态,此时PRIMARY已然会在2个节点之间飘浮。但2个节点还算可控,可以通过 rs.addArb("192.168.1.92:29121") 方式在主节点加入仲裁节点。
3、强制加入仲裁节点:
config=rs.conf()
config.members=[config.members[0],config.members[1]....(把所有需要加入的节点列出), **{_id:5,host:"127.0.0.1:27023",priority:5,arbiterOnly:"true"}**]
rs.reconfig(config,{force:true})