zookeeper Leader 选举

(1) Leader 选举中的基本概念

A、myid
也称为 ServerId,这是 zk 集群中服务器的唯一标识。例如,有三个 zk 服务器,那么编
号分别是 1,2,3。
B、 逻辑时钟
逻辑时钟,Logicalclock,是一个整型数,该概念在选举时称为 logicalclock,而在选举结
束后称为 epoch。即 epoch 与 logicalclock 是同一个值,在不同情况下的不同名称。

集群启动中的 Leader 选举

  • 在集群初始化阶段,当第一台服务器 Server1 启动时,其会给自己投票,然后发布自己 的投票结果。投票包含所推举的服务器的 myid 和ZXID,使用(myid, ZXID)来表示,此时 Server1 的投票为(1,0)。由于其它机器还没有启动所以它收不到反馈信息,Server1 的状态一直属于 Looking,即属于非服务状态。

  • 当第二台服务器 Server2 启动时,此时两台机器可以相互通信,每台机器都试图找到
    Leader,选举过程如下:
    (1) 每个 Server 发出一个投票。此时 Server1 的投票为(1, 0),Server2 的投票为(2, 0),然后各自将这个投票发给集群中其他机器。
    (2) 接受来自各个服务器的投票。集群的每个服务器收到投票后,首先判断该投票的有效
    性,如检查是否是本轮投票、是否来自 LOOKING 状态的服务器。
    (3) 处理投票。针对每一个投票,服务器都需要将别人的投票和自己的投票进行 PK,PK
    规则如下:

    • 优先检查 ZXID。ZXID 比较大的服务器优先作为 Leader。
    • 如果 ZXID 相同,那么就比较 myid。myid 较大的服务器作为 Leader 服务器。
      对于 Server1 而言,它的投票是(1, 0),接收 Server2 的投票为(2, 0)。其首先会比较两者
      的 ZXID,均为 0,再比较 myid,此时 Server2 的 myid 最大,于是 Server1 更新自己的投票为
      (2, 0),然后重新投票。对于 Server2 而言,其无须更新自己的投票,只是再次向集群中所有
      主机发出上一次投票信息即可。
      (4) 统计投票。每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接受到
      相同的投票信息。对于 Server1、Server2 而言,都统计出集群中已经有两台主机接受了(2, 0)
      的投票信息,此时便认为已经选出了新的 Leader,即 Server2。
      (5) 改变服务器状态。一旦确定了 Leader,每个服务器就会更新自己的状态,如果是Follower,那么就变更为 FOLLOWING,如果是 Leader,就变更为 LEADING。
      (6) 添加主机。在新的 Leader 选举出来后 Server3 启动,其想发出新一轮的选举。但由于
      当前集群中各个主机的状态并不是 LOOKING,而是各司其职的正常服务,所以其只能是以
      Follower 的身份加入到集群中。

宕机后的 Leader 选举

在 Zookeeper 运行期间,Leader 与非 Leader 服务器各司其职,即便当有非 Leader 服务
器宕机或新加入时也不会影响 Leader。但是若 Leader 服务器挂了,那么整个集群将暂停对
外服务,进入新一轮的 Leader 选举,其过程和启动时期的 Leader 选举过程基本一致。
在这里插入图片描述

发布了97 篇原创文章 · 获赞 59 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/b1303110335/article/details/105211114