
一、影响选举的因素¶
整个集群必须有大多数节点存活;被选举为主节点的节点必须:
- 能够与多数节点建立连接
- 具有较新的 oplog
- 具有较高的优先级(如果有配置)
二、选举的机制: Bully算法¶
mongodb选举算法采用的是 bully算法

三、选举触发条件¶
选举不是什么时刻都会被触发的,有以下情况可以触发。
1、初始化一个副本集时。 2、副本集和主节点断开连接,可能是网络问题。 3、主节点挂掉。 4、可以通过 replSetStepDown命令下架主节点。这个命令可以登录主节点使用,或者使用 rs.stepDown(120)也可以达到同样的效果,中间的数字指不能在停止服务这段时间成为主节点,单位为秒。
- db.adminCommand({replSetStepDown:1})
如果杀不掉可以使用
- db.adminCommand({replSetStepDown:1,force:ture})
5、设置一个从节点有比主节点有更高的优先级。
#注意:
选举还有个前提条件,参与选举的节点数量必须大于副本集总节点数量的一半,如果已经小于一半了所有节点保持只读状态。
四、选举的⻆色和状态¶
在选举过程中,节点根据其状态可分为两类⻆色:有选举权节点和无选举权节点,如下有 7个有选举权节点和 2各无选举权节点。
1、有选举权节点: votes属性为 1且该节点状态为以下 5种状态之一:
PRIMARY:该状态表明节点是活跃节点,且状态正常。
SECONDARY:该状态表明节点是备份节点,且状态正常。
RECOVERING:这个状态表明节点运转正常,但是暂时还不能处理请求,当一个节点与其他节点失联时也会进入这个状态。
ARBITER:仲裁者应该始终处于这个状态。
ROLLBACK:当成员正在执行回滚操作时。
2、无选举权节点: votes属性为 0的节点,尽管这类节点在选举中无权投票,但这些成员拥有副本集数据的副本,可接受来自客户端的读取操作。另外,此类节点也可以被选举为活跃节点。
节点状态
除了 PRIMARY、 SECONDARY、 RECOVERING、 ARBITER及 ROLLBACK五种常⻅节点状态外,还有下面六种特殊状态:
1、STARTUP:刚加入到复制集中,配置还未加载。 2、STARTUP2:配置已加载完,初始化状态。 3、DOWN:节点不可到达。 4、UNKNOWN:未获取其他节点状态而不知是什么状态,一般发生在只有两个成员的时候。 5、REMOVED:移除复制集。 6、FATAL:出错。查看日志 grep “replSet FATAL”找出错原因,重新做同步。
五、选举的过程¶
第一阶段:
1、如果 X是一个 secondary,那么 X会定时检测是否需要选举自己成为 primary。其检测内容包括:
- 是否集群中有其它节点认为自己是 primary?
- X节点自己是否已经是 primary?
- X节点自己是否有资格成为 primary?
2、 X节点会向 Y、 Z节点各发起一个请求包,告知他们 ”我认为我可以接管 primary 的⻆色,你们觉得怎么样?
当 Y和 Z收到上面的请求包时,他们会进行下面几项检测:
- 他们是否已经知识集群中有一个 primary了?
- 他们自己的数据是否比 X节点更新?
- 是否有其它节点的数据比 X节点更新?
3、如果 X收到 ”停止选举! “的返回,那么他会⻢上停止选举并保持自己为 sencondary 状态。
4、如果 X收到所有其它节点都返回说 ”没问题 “,那么他会进入选举过程的第二阶段。
第二阶段:
1、 X会向其它节点发送一个包,说 ”我宣布我已经是 primary 了 “
2、 Y和 Z节点再进行一些最终的确认,
- 确认通过,会在本轮 primary 选举中向 X出赞成票,且 30秒内不会再做其它投票决定
- 如果最终确认没有通过,他们会投一个反对票, X还是保持 secondary 的身份。