0%

Zookeeper选举机制

本文主要介绍Zookeeper的投票机制,回答“Zookeeper选举投票过程”以及“为什么建议使用奇数个节点”两个问题。


Zookeeper选举投票过程是怎样的?

想了解Zookeeper的选举过程,首先要了解几个概念:

  • myid:服务器的ID,编号越大在选举中优先级越高。安装时通过zkdatas/myid文件中手动设置。
  • zxid:被推举的Leader事务ID,值越大说明数据越新,在选举中优先级越高。
  • state:当前服务器的状态:
  • LOOKING : 竞选状态。
  • FOLLOWING : 随从状态,同步Leader状态,参与投票。
  • OBSERVING : 观察状态,同步Leader状态,不参与投票。
  • LEADING : 领导者状态。
  • electionEpoch:逻辑时钟,用来判断多个投票是否在同一轮选举周期中。该值在服务端是一个自增序列,每次进入新一轮的投票后,都会对该值进行加1操作。
  • peerEpoch:被推举的Leader的Epoch。

选举规则

  1. 如果集群中没有Leader节点,才开始选举。
  2. 首先比较zxidzxid更大的服务器优先作为Leader。
  3. zxid相同(如初始化时每个Server的zxid都为0),再比较myidmyid更大的服务器优先作为Leader。
  4. 节点选票数量大于集群节点总数的一半时才能成功当选Leader。

奇数个节点初始化选举投票过程简述

如果集群中节点个数为3node01:(0,1)表示 节点名:(zxid,myid),初始化选举过程如下:

第一轮投票

node01启动node01:(0,1)给自己投票,node01得1票,但因其他机器未启动,处于Looking状态。
node02启动node02:(0,2)给自己投票,node02和node01同为1票,无法得出结果,交流选票信息后开始第二轮投票。

第二轮投票
node01:根据拥有的选票信息(0,1),(0,2),比较后投票给node02。
node02:根据拥有的选票信息(0,2),(0,1),比较后投票给node02。
node02获得选票数为2,大于集群中节点个数的一半,成功当选Leader,node01则成为Follower。
node03启动,因为此时集群中已经有Leader,node03成为Follower。

偶数个节点初始化选举投票过程简述

如果集群中节点个数为4,初始化选举过程如下:

第一轮投票

node01启动node01:(0,1)给自己投票,node01得1票,但因其他机器未启动,处于Looking状态。
node02启动node02:(0,2)给自己投票,node01和node02同为1票,无法选出Leader,交流选票信息后开始第二轮投票。

第二轮投票
node01:根据拥有的选票信息(0,1),(0,2),比较后投票给node02。
node02:根据拥有的选票信息(0,2),(0,1),比较后投票给node02。
node02获得选票数为2,没有大于集群中节点个数的一半,无法选出Leader,node02处于Looking状态。
node03启动node03:(0,3)给自己投票,无法选出Leader,交流选票信息后开始第三轮投票。

第三轮投票
node01:根据拥有的选票信息(0,1),(0,2),(0,3),比较后投票给node03。
node02:根据拥有的选票信息(0,2),(0,1),(0,3),比较后投票给node03。
node03:根据拥有的选票信息(0,3),(0,1),(0,2),比较后投票给node03。
node03获得选票数为3,大于集群中节点个数的一半,成功当选Leader,node01和node02则成为Follower。

为什么建议使用奇数个节点?

根据选举规则,得到以下结论:
集群有3个节点,需要启动2个节点后选举出Leader,该集群最多允许挂掉1个节点。
集群有4个节点,需要启动3个节点后选举出Leader,该集群最多允许挂掉1个节点。
集群有5个节点,需要启动3个节点后选举出Leader,该集群最多允许挂掉2个节点。
集群有6个节点,需要启动4个节点后选举出Leader,该集群最多允许挂掉2个节点。

初始化选举角度看,奇数个节点(2N+1)对比偶数个节点(2N+2),能更快选举出Leader;从容灾(崩溃恢复模式)角度看,奇数个节点(2N+1)和偶数个节点(2N+2)容灾能力相同;从成本角度看,奇数个节点(2N+1)比偶数个节点(2N+2)成本低;从性能角度看,奇数个节点(2N+1)对比偶数个节点(2N+2),写服务性能相同而读服务性能稍弱(因为只有Leader提供写服务)。

综合考虑,Zookeeper集群建议使用奇数个节点。


参考资料
【分布式】Zookeeper的Leader选举 作者:leesf
zookeeper选举机制 作者:zivszheng