本文主要介绍Zookeeper的投票机制,回答“Zookeeper选举投票过程”以及“为什么建议使用奇数个节点”两个问题。
Zookeeper选举投票过程是怎样的?
想了解Zookeeper的选举过程,首先要了解几个概念:
- myid:服务器的ID,编号越大在选举中优先级越高。安装时通过
zkdatas/myid
文件中手动设置。 - zxid:被推举的Leader事务ID,值越大说明数据越新,在选举中优先级越高。
- state:当前服务器的状态:
- LOOKING : 竞选状态。
- FOLLOWING : 随从状态,同步Leader状态,参与投票。
- OBSERVING : 观察状态,同步Leader状态,不参与投票。
- LEADING : 领导者状态。
- electionEpoch:逻辑时钟,用来判断多个投票是否在同一轮选举周期中。该值在服务端是一个自增序列,每次进入新一轮的投票后,都会对该值进行加1操作。
- peerEpoch:被推举的Leader的Epoch。
选举规则
- 如果集群中没有Leader节点,才开始选举。
- 首先比较
zxid
,zxid
更大的服务器优先作为Leader。 - 若
zxid
相同(如初始化时每个Server的zxid都为0),再比较myid
,myid
更大的服务器优先作为Leader。 - 节点选票数量大于集群节点总数的一半时才能成功当选Leader。
奇数个节点初始化选举投票过程简述
如果集群中节点个数为3,node01:(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