zookeeper基础(关于Leader选举,看图更直观)

Leader选举

    • Leader选举中的基本概念
      • serverId
      • 逻辑时钟
    • Leader选举算法
      • 集群启动中的Leader选举
      • 宕机后的Leader选举

在集群启动过程中,或Leader 宕机后,集群就进入了恢复模式。恢复模式中最重要的阶段就是Leader选举

Leader选举中的基本概念

serverId

这是zk集群中服务器的唯一标识,也称为sid,其实质就是zk中配置的myid。例如有三个zk服务器,那么编号分别就是1、2、3。

逻辑时钟

逻辑时钟,Logicalclock,是一个整型数,该概念在选举时称为“logicalclock”,而在选举结束后称为epoch。即epoch 和 logicalclock 是同一个值,在不同的情况下的不同名称。

Leader选举算法

在集群启动过程中的Leader选举过程(算法)与Leader断连后的选举过程稍微有一些区别,但基本相同。

集群启动中的Leader选举

若进行Leader选举,则至少需要两台主机,这里以三台主机构成的集群为例。

zookeeper基础(关于Leader选举,看图更直观)_第1张图片
在集群的初始化阶段,当第一台服务器Server-1启动时,其会给自己投票,然后发布自己的投票结果。投票包含所推举的服务器的myid 和ZXID,使用(myid,ZXID)来表示,此时的Server-1的投票为(1,0)。由于其他机器还没启动所以它收不到反馈信息,Server-1的状态一直处于Looking,即非服务状态。
当第二台服务器Server-2启动时,此时两台机器可以相互通信,每台机器都试图找到Leader,选举过程如下:

  1. 每个Server发出一个投票。此时Server-1的投票为(1,0),Server-2的投票为(2,0),然后各自将这个投票发送给集群中的其他机器。
  2. 接收来自各个服务器的投票。集群的每个服务器收到投票后,首先判断该投票的有效性,如检查是否本轮投票、是否来自LOOKING状态的服务器。
  3. 处理投票。针对每一个投票,服务器都需要将别人与自己的投票进行pk,pk规则如下:
    • 优先检查zxid。zxid比较大的服务器优先作为Leader。
    • 如果zxid相同,那么就比较myid。myid较大的服务器作为Leader服务器。
      对于Server-1而言,它的投票(1,0),接收到Server-2的投票为(2,0)。其首先会比较两者的zxid,均为0,再比较myid,此时Server-2的myid最大,于是Server-1更新自己的投票为(2,0),然后重新投票。对于Server-2而言,其无需更新自己的投票,只是再次向集群中的所有服务器发出上一次投票信息即可。
  4. 统计投票。每次投票后,服务器会统计投票信息,判断是否已有过半服务器接收到相同的投票信息。对于Server-1、Server-2而言,都统计出集群中已经有两台主机接收了(2,0)的投票信息,此时便认为已经选出了新的Leader,即Server-2。
  5. 改变服务器状态。一旦确定了Leader,每个服务器就会更新自己的状态,如果是Follower,就变为Following,如果是Leader,就变为Leading。
  6. 添加主机。在新的Leader选举出来后Server-3启动,其想发出新一轮的选举。但由于当前集群中各个主机的状态并不是Looking,而是各司其职的正常服务,所以其只能以Follower的身份加入到集群中。

宕机后的Leader选举

在zookeeper运行期间,Leader与非Leader服务器各司其职,即便当有非Leader服务器宕机或新加入时也不会影响Leader。但若是Leader服务器挂了,那么整个集群将暂停对外服务,进入新一轮的Leader选举,其过程和启动时的Leader选举过程基本一致。
zookeeper基础(关于Leader选举,看图更直观)_第2张图片
假设正在运行的有Server-1、Server-2、Server-3,当前Leader为Server-2,若某一时刻Server-2挂了,此时便开始了新一轮的Leader选举。过程如下:

  1. 变更状态。Leader挂后,余下的非Observer服务器都会讲自己的状态变更为Looking(原状态:Following),然后开始进入Leader选举过程。
  2. 每个Server会发出一个投票,仍然会首先投自己。不过,在运行期间每个服务器上的zxid可能是不同,此时假设Server-1的zxid为111,Server-3的zxid为333,在第一轮投票中,Server-1和Server-3都会投给自己,产生投票(1,111)、(3,333),然后各自将投票发送给集群中的其他服务器。
  3. 接收来自各个服务器的投票。与启动时过程相同。集群的每个服务器收到投票后,首先判断该投票的有效性。
  4. 处理投票。与启动时过程相同。
  5. 统计投票。与启动时过程相同。对于Server-1、Server-2而言,都统计出集群中已经有两台主机接收了(3,333)的投票信息,此时便认定选出了新的Leader,即Server-3。
  6. 改变服务器的状态。同启动时过程一样。一旦确定了Leader,每个服务器就会更新自己的状态。Server-1变更为Following,Server-3变更为Leading。

你可能感兴趣的:(zookeeper)