五、zookeeper 的选举机制

当 ZooKeeper 集群中的一台服务器出现以下两种情况之一时,就会开始进入Leader选举:

  • 服务器初始化启动。
  • 服务器出现故障,运行期间无法和Leader保持连接。

Zookeeper选举机制——第一次启动

第一次启动

(1)① 启动,发起一次选举。① 投自己一票。此时 ① 票数为1,不够半数以上(5÷2=2.5,3票),选举无法完成,① 状态保持为LOOKING
(2)② 启动,再发起一次选举。① 和 ② 分别投自己一票并交换选票信息:此时 ① 发现 ② 的myid比自己的myid大,把自己的票数投给了 ②。此时 ① 票数为0票, ② 票数为2票,没有半数以上结果,选举无法完成,①、 ② 状态保持为LOOKING
(3)③ 启动,发起一次选举。此时服务器1和2都会更改选票为服务器3。此次投票结果:① 为0票,② 为0票,服务器3为3票。此时 ③ 的票数已经超过半数,服务器3当选Leader。①,② 状态更改为FOLLOWING,③ 更改状态为LEADING
(4)④ 启动,发起一次选举。此时①,②,③已经不是LOOKING状态,不会更改选票信息。交换选票信息结果:③ 为3票,④ 为1票。此时 ④ 服从多数,更改选票信息为 ③,并更改状态为FOLLOWING
(5)⑤ 启动,同 ④ 一样,最终 ③ 为leader,其他为follower

Zookeeper选举机制——非第一次启动要知道的概念

SID:服务器 ID。用来唯一标识一台 ZooKeeper 集群中的机器,每台机器不能重复,和 myid 一致。
ZXID:事务ID。ZXID是一个事务ID,用来标识一次服务器状态的变更。在某一时刻,集群中的每台机器的ZXID值不一定完全一致,这和 ZooKeeper 服务器对于客户端“更新请求”的处理逻辑有关。
Epoch:每个Leader任期的代号。没有Leader时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加。

Zookeeper选举机制——非第一次启动

非第一次启动

假设 ZooKeeper 由5台服务器组成,Epoch分别为1、1、1、1、1,ZXID分别为8、8、8、7、7,SID分别为1、2、3、4、5,并且此时SID为3的服务器是Leader。某一时刻 ⑤ 出现故障时:

(1)集群中存在Leader,③ 正常运行
 ⑤ 会试图去选举Leader,但集群中存在Leader③,会被告知当前服务器的Leader信息,对于 ⑤ 来说,仅需要和 ③ 建立连接,并进行状态同步即可。
 最终,③ 为Leader,①、②、④ 为Folower

(2)集群中不存在Leader,③ 也出现故障
 - 选举Leader规则:
  - EPOCH大的直接胜出
  - EPOCH相同,ZXID大的胜出
  - ZXID相同,SID大的胜出
 ⑤ 会试图去选举Leader,但集群中不存在Leader③,①、②、④的EPOCHZXIDSID分别为(1,8,1)、(1,8,2)、(1,7,4)
 最终,② 为Leader,①、④ 为Folower

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容