关于leader的选举,Zookeeper提供了三种方式:LeaderElection, AuthFastLeaderElection, FastLeaderElection。 其中FastLeaderElection是Zookeeper默认使用的。 当ZK服务启动的时候首先要做的事情就是Leader的选举。在选举过程中,每个zk server会有以下四种选举状态:

  • LOOKING 竞选状态
  • FOLLOWING 追随状态,同步Leader状态,参与投票
  • LEADING Leader状态
  • OBSERVING 观察状态,同步leader状态,不参与投票

各个节点在投票时,会将投票信息发送给集群中的所有节点,投票信息主要包含:

  • 服务器Id: 编号越大,权重越大
  • 数据Id:值越大,数据越新,权重越大
  • 逻辑时钟:即投票的次数,同一轮投票过程中的逻辑时钟是相同的。每投完一次票这个值就会增加,然后与收到其他节点投票信息中的值对比,根据不同的值做出不同的判断
  • 选举状态:各个节点都是独立的,当节点启动时,初始化的状态均从LOOKING开始。

每个节点在启动时都会给自己投票选举自己作为Leader,然后将投票信息发送出去,如此循环直到选出领导为止。判断是否选举胜出默认采用投票数大于半数胜出的原则。

下面从5台初始启动的节点(节点上没有数据)理解一下选举过程,serverId分别为1,2,3,4,5,依次启动1,2,3,45:

  • server1启动,给自己投票,发送投票信息,此时由于其他server还未启动而得不到反馈,server1一直处于LOOKING状态
  • server2启动,给自己投票,发送投票信息,与server1交换信息,此时server2的serverId大于server1,但因为投票数没有超过半数,server1和server2都是LOOKING状态
  • server3启动,给自己投票,发送投票信息,与server1,server2交换信息,server3的serverId最大,同时投票数超过半数,server3胜出
  • server4启动,给自己投票,发送投票信息,因为之前server3已经胜出,所以leader仍然是server3
  • server5同server4