选举机制

PPG007 ... 2021-12-28 About 2 min

# 选举机制

# 第一次启动时选举机制

假设有五台服务器:

  1. 第一台服务器启动,发起一次选举,投自己一票,此时这台服务器票数不够一半(3),选举无法完成,服务器保持 LOOKING。
  2. 第二台服务器启动,发起选举,两台服务器先把票投给自己并交换信息,第一台服务器发现第二台服务器的 myid 比自己大,就将票重新投给了第二台服务器,此时第一台 0 票,第二台 2 票,此时还是没有服务器达到一半票数(3),全部保持 LOOKING。
  3. 第三台服务器启动,发起一次选举,与上面相同,票都到了三号服务器,此时达到了半数以上,三号服务器成为 leader,状态为 LEADING,1、2 号服务器状态为 FOLLOWING。
  4. 第四台服务器启动,发起一次选举,此时服务器 1、2、3 不是 LOOKING 状态,不会更改选票信息。服务器四有一票,服从多数把票投给三号服务器,状态变为 FOLLOWING。
  5. 第五台服务器启动,与第四台服务器流程相同。

# 非第一次启动时的选举机制

当 ZooKeeper 集群中一台服务器出现以下两种情况之一,就会开始进入 Leader 选举:

  • 服务器初始化启动。
  • 服务器运行期间无法和 Leader 保持连接。

当一台服务器进入选举流程时,集群可能的状态:

  • 集群中已经有 Leader。
  • 集群中确实没有 Leader。

SID:服务器 ID,与 myid 一致,唯一标识。

ZXID:事务 ID,用来标识一次服务器状态的变更。

Epoch:每个 Leader 任期中的代号,每次投完一次票这个值就会增加。

现在假设 3、5 号服务器掉线,1、2、4 号服务器开始选举。

选举规则:

  • Epoch 大的直接胜出。
  • Epoch 相同,ZXID 大的胜出。
  • ZXID 相同,SID 大的胜出。
Last update: December 28, 2021 13:51
Contributors: PPG007