ZooKeeper 的 Leader 选举机制

选举机制中的概念:

Serverid:服务器 ID。 编号越大在选择算法中权重越大。

Zxid:数据 ID。ZooKeeper 状态的每一次改变,都对应着一个递增的 Transaction id,该 id 称为 Zxid,由于 zxid 的递增性质,如果 zxid1 小于 zxid2,那么 zxid1 肯定优先于 zxid2 发生。

创建任意节点,或者更新任意节点的数据,或者删除任意节点,都会导致 ZooKeeper 状态发生改变,从而导致 zxid 的值增加。

Epoch:逻辑时钟。或者叫投票的次数,同一轮投票过程中逻辑时钟值是相同的。用来判断多个投票是否在同一轮选举周期中,该值在服务端是一个自增序列,每次进入新一轮的投票后,都会对该值进行加1操作。

Server 状态:选举状态。LOOKING,竞选状态;FOLLOWING,随从状态,同步 leader 状态,参与投票。OBERSERVING,观察状态,同步 leader 状态,不参与投票。LEADING,领导者状态。

服务器启动时期的 leader 选举:

以 3 台机器组成的服务器集群为例.在集群初始化阶段,当有一台服务器 Server1 启动时,其单独无法再进行和完成 Leader 选举,当第二台服务器 Server2 启动时,此时两台机器可以互相通信,每台机器都试图找到 leader,于是进入 Leader 选举过程。选举过程如下:

1)每个 Server 发出一个投票。由于是初识情况,Serve1 和 Server2 都会将自己作为 Leader 服务器来进行投票,每次投票会白喊所推举的服务器 serverid 和 zxid,使用(ServerID,zxid)来表示,此时 Server1 的投票为(1,0),Server2 的投票为(2,0),然后各自将这个投票发给集群中其它机器。

2)接受来自各个服务器的投票。集群的每个服务器收到投票后,首先判断该投票的有效性,如检查是否是本轮投票、是否来自 LOOKING 状态的服务器。

判断逻辑时钟规则:

  1. 如果发送过来的逻辑时钟 Epoch 大于目前的逻辑时钟。首先,更新本逻辑时钟 Epoch,同时清空本轮逻辑时钟收集到的其它 server 的选举数据。然后判断是否需要更新档期自己的选举 leader serverid。

  2. 如果发送公立的逻辑时钟 Epoch 小于目前的逻辑时钟。说明对方 server 在一个相对较早的 Epoch 中,只需要经本机的选举数据发送出去就行。

    一般情况下,逻辑时钟应该都是相同的。但是,由于一些机器崩溃的问题,是可能出现逻辑时钟不一致的情况的。

3)处理投票。针对每一个投票,服务器都需要将别人的投票和自己的投票进行 PK,PK 规则如下:

  • 优先检查 zxid。zxid 较大的服务器优先作为 Leader。
  • 如果 zxid 相同,那么就比较serverid。serverid 较大的服务器作为 Leader 服务器。

对于 server1 而言,它的投票是(1,0),接收 server2 的投票为(2,0),首先会比较两者的 zxid,均为 0,再比较 serverid,此时 server2 的 serverid 最大,于是更新自己的投票为(2,0),然后重新投票,对于 server2 而言,其无须更新自己的投票,只是再次向急群众所有机器发出上一次投票信息即可。

4)统计投票。每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接收到形态的投票信息,对于 server1,server2 而言,都统计出集群中已经有连你给他机器接收了(2,0)的投票信息,此时便认为已经选出了 Leader。

5)改变服务器状态。一旦确定了 Leader,每个服务器都会更新自己的状态,如果是 Follower,那么就变更为 FOLLOWING,如果是 Leader,就变更为 LEADING。

服务器运行时期的 Leader 选举

在 ZooKeeper 运行期间,但是光有非 Leader 服务器宕机或者新加入,此时不会影响 Leader,但是一旦 Leader 服务器管理,那么整个集群将暂停对外服务,进入新一轮 Leader 选举,其过程和启动时期的 Leader 选举过程基本一致。假设正在运行的 Server1、Server2、Server3三台服务器,当前Leader 是 Server2,若某一时刻Leader 挂了,此时便开始 Leader 选举。过程如下:

1)变更状态。Leader 挂后,余下的非 Observer 服务器会将自己的服务器状态变更为 LOOKING,然后开始进入 Leader 选举过程。

2)每个 Server 会发出一个投票。在运行期间,每个服务器上的 zxid 可能不同,此时假定 Server1 的 zxid 为 123,Server3 的 zxid 为 122;在第一轮投票中,Server1 和 Server3 都会投自己,产生投票(1,123)、(3,122)然后各自将投票发送给集群中所有的机器。

3)接胡搜来自各个服务的投票。与启动过程相同。

4)处理投票。与启动过程相同,此时 Server1 将会成为 Leader。

5)统计投票。与启动过程相同。

6)改变服务器的状态。与启动过程相同。

你可能感兴趣的:(ZooKeeper 的 Leader 选举机制)