ZAB实现

2020-02-15  本文已影响0人  kar_joe

协议的 Java 版本实现跟上面的定义有些不同,选举阶段使用的是 Fast Leader Election(FLE),它包含了 Phase 1 的发现职责。因为 FLE 会选举拥有最新提议历史的节点作为 leader,这样就省去了发现最新提议的步骤。实际的实现将 Phase 1 和 Phase 2 合并为 Recovery Phase(恢复阶段)。所以,ZAB 的实现只有三个阶段:

Fast Leader Election

FastLeaderElection算法通过异步的通信方式来收集其它节点的选票,同时在分析选票时又根据投票者的当前状态来作不同的处理,以加快Leader的选举进程。FLE 会选举拥有最新提议历史(lastZxid最大)的节点作为 leader,这样就省去了发现最新提议的步骤。这是基于拥有最新提议的节点也有最新提交记录的前提。
成为 leader 的条件:

核心思想

节点在选举开始都默认投票给自己,当接收其他节点的选票时,会根据上面的条件更改自己的选票并重新发送选票给其他节点,当有一个节点的得票超过半数,该节点会设置自己的状态为 leading,其他节点会设置自己的状态为 following。


image.png

具体分析

  1. 启动时数据恢复
    每个ZooKeeper Server启动时读取当前磁盘的数据(transaction log),获取最大的zxid。

  2. 发送选票
    每个参与投票的ZooKeeper Server向其他Server发送自己所推荐的Leader,这个协议中包括几部分数据:

  1. 处理选票
    每台Server将自己的数据发送给其他Server之后,同样也要接受其他Server的选票,并做一下处理。

如果Sender的状态是LOOKING:

如果Sender的状态是FOLLOWING或者LEADER:

ZK中实现

image.png

Recovery Phase

这一阶段 follower 发送它们的 lastZixd 给 leader,leader 根据 lastZixd 决定如何同步数据。
ZAB中Leader会根据Follower数据情况使用多种同步策略:

Broadcast Phase

与ZAB原有设计无差别

上一篇 下一篇

猜你喜欢

热点阅读