1. zookeeper服务器的四种状态

  • looking:寻找Leader的状态,当前集群没有leader
  • leading:成为一个leader节点。
  • following:成为一个follower节点。
  • observing:当前服务角色是一个observer。

2. zookeeper集群启动时的选举

假如有三个节点(s1,s2,s3)组成的集群。在集群启动过程中,当有一台zookeeper节点s1启动完成后,此时集群中只有一个节点无法进行leader的选举。当第二个节点s2启动成功后,此时两个节点可以正常通信,进入leader的选举过程,具体如下:

  1. 每一个节点都是自私的,各自都投自己1票。每次投票都会包含选举服务器的myid和zxid,投票结果使用(myid,zxid)表示,此时s1的投票为(1,0),s2为(2,0)。然后各自投票给集群中其他节点。
  2. 集群中的每个节点都接受其他节点的投票,s1将(1,0)发给s2,s2将(2,0)发给s1。
  3. PK投票结果,对于每一次投票,服务器都会将自己的投票结果和其他节点做比较:
  • 首先检查zxid,zxid大的优先作为leader。
  • 如果zxid相同,则比较myid,myid大的优先作为leader。

对于s1,他的投票是(1,0),接受到s2的投票(2,0),首先它会比较自己的zxid和s2的zxid,此时相等,然后比较myid,s2的myid大,s1更新自己的投票结果为(2,0),然后重新投票,对于s2收到s1的投票(1,0),显然s2胜出,无需更新自己的投票结果。

  1. 统计投票。每次投票结束后,服务器都会统计投票信息,判断是否已经有过半机器接收到相同的投票信息,对于s1,s2,都统计出集群中已经有两台机器是(2,0)的投票信息,此时认为leader已经产生。
  2. 改变服务器状态。一旦确定了leader,每个节点都会更改自己的状态,胜出的leader将状态改为leading,败者follower更改自己的状态为following。

3. zookeeper集群运行中的leader选举

还是假如有三台服务器(s1,s2,s3)组成的集群,s2时leader。在集群运行中时,只有当集群中的leader宕机才会触发leader的重新选举,集群中follower宕机或者新节点的加入并不影响leader的地位。
选举过程如下:

  1. 状态更改。leader宕机之后,各节点将自己的状态更改为looking。然后进入leader的选举。
  2. 每个节点都会发出投票,运行期间每个节点的zxid可能不同,假设s1的zxid为122,s3的zxid也为122,在第一轮投票中s1,s2都会投自己,产生投票s1(1,122),s2(3,122),然后各自将投票发送给其他节点。
  3. 接受来自其他节点的投票。
  4. 处理投票。PK投票,与启动时相同,此时s3胜出。
  5. 统计投票。s1,s3的投票都为(3,122),已经有过半机器是(3,122),s3成为leader。
  6. 更改状态。s1,s3更改自己的状态,s1—>following,s3—>leadin