当 ZooKeeper 集群中的一台服务器出现以下两种情况之一时,就会开始进入Leader选举:
- 服务器初始化启动。
- 服务器出现故障,运行期间无法和
Leader保持连接。
Zookeeper选举机制——第一次启动

(1)① 启动,发起一次选举。① 投自己一票。此时 ① 票数为1,不够半数以上(5÷2=2.5,3票),选举无法完成,① 状态保持为
LOOKING;
(2)② 启动,再发起一次选举。① 和 ② 分别投自己一票并交换选票信息:此时 ① 发现 ② 的myid比自己的myid大,把自己的票数投给了 ②。此时 ① 票数为0票, ② 票数为2票,没有半数以上结果,选举无法完成,①、 ② 状态保持为LOOKING
(3)③ 启动,发起一次选举。此时服务器1和2都会更改选票为服务器3。此次投票结果:① 为0票,② 为0票,服务器3为3票。此时 ③ 的票数已经超过半数,服务器3当选Leader。①,② 状态更改为FOLLOWING,③ 更改状态为LEADING;
(4)④ 启动,发起一次选举。此时①,②,③已经不是LOOKING状态,不会更改选票信息。交换选票信息结果:③ 为3票,④ 为1票。此时 ④ 服从多数,更改选票信息为 ③,并更改状态为FOLLOWING;
(5)⑤ 启动,同 ④ 一样,最终 ③ 为leader,其他为follower。
Zookeeper选举机制——非第一次启动要知道的概念
SID:服务器 ID。用来唯一标识一台 ZooKeeper 集群中的机器,每台机器不能重复,和myid一致。
ZXID:事务ID。ZXID是一个事务ID,用来标识一次服务器状态的变更。在某一时刻,集群中的每台机器的ZXID值不一定完全一致,这和 ZooKeeper 服务器对于客户端“更新请求”的处理逻辑有关。
Epoch:每个Leader任期的代号。没有Leader时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加。
Zookeeper选举机制——非第一次启动

假设 ZooKeeper 由5台服务器组成,
Epoch分别为1、1、1、1、1,ZXID分别为8、8、8、7、7,SID分别为1、2、3、4、5,并且此时SID为3的服务器是Leader。某一时刻 ⑤ 出现故障时:(1)集群中存在
Leader,③ 正常运行
⑤ 会试图去选举Leader,但集群中存在Leader③,会被告知当前服务器的Leader信息,对于 ⑤ 来说,仅需要和 ③ 建立连接,并进行状态同步即可。
最终,③ 为Leader,①、②、④ 为Folower(2)集群中不存在
Leader,③ 也出现故障
- 选举Leader规则:
-EPOCH大的直接胜出
-EPOCH相同,ZXID大的胜出
-ZXID相同,SID大的胜出
⑤ 会试图去选举Leader,但集群中不存在Leader③,①、②、④的EPOCH,ZXID,SID分别为(1,8,1)、(1,8,2)、(1,7,4)
最终,② 为Leader,①、④ 为Folower
