image-20260404154453920

一、影响选举的因素

整个集群必须有大多数节点存活;被选举为主节点的节点必须:

  • 能够与多数节点建立连接
  • 具有较新的 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 的身份。