zookeeper-集群leader选举

177 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

服务器状态

每一个在集群环境中的zookeeper服务器节点,都有一个服务器状态,描述集群中处于的角色或包含的信息,分别有4种:

  1. looking:寻找leader状态。当服务器处于该状态时,它会认为当前集群中没有leader,故进入leader选举状态。
  2. leading: 领导者状态。表明当前服务器角色是leader。
  3. following: 跟随者状态。表明当前服务器角色是follower。
  4. observing:观察者状态。表明当前服务器角色是observer。

服务器启动时期的leader选举

在集群的初始化阶段,只有一台zookeeper服务器节点启动时,一个节点无法进行 leader选举,当有第二台服务器启动时,此时两台机器可以相互通信,每台机器都 试图找到leader,于是进入leader选举过程。过程如下:

  1. 每个server发出一个投票。最开始的时候,为选举leader服务器来进行投票,每次投票会包含所推举的服务器的myid和zxid,此时server1的投票为(1, 0),server2的投票为(2, 0),然后各自将这个投票发给集群中其他机器。
  2. 集群中的每台服务器接收来自集群中其他服务器的投票。
  3. 处理投针对每一个投票,服务器都需要将别人的投票和自己的投票进行处理,处理 规则:
    1. 首先检查zxid。zxid比较大的服务器优先选举为leader。
    2. 如果zxid相同,那么就比较myid。myid较大的服务器被选为leader服务器。
    3. 对于Server1而言,它的投票是(1, 0),接收Server2的投票为(2,0),首先会比较 两者的zxid,均为0,再比较myid,此时server2的myid最大,于是更新自己的投票 为(2, 0),然后重新进行投票,对于server2而言,无须更新自己的投票,只是需要再次向集群中所有机器发出上一次投票信息即可。
  4. 进行投票统计。每次投票以后,服务器都会统计投票信息,判断是否已经有过半机器接受到相同的投票信息,对于server1、server2而言,都统计出集群中已经有两台机器接受了(2, 0)的投票信息,此时便认为已经选出了leader
  5. 改变服务器状态。一旦确定了leader,每个服务器就会更新自己的状态,如果是 follower,那么就变更为following,如果是leader,就变更为leading。