bigywater.tech
ZooKeeper · 39

ZAB 一致性协议

ZAB 是 ZooKeeper 的一致性协议。教科书讲它有发现、同步、广播三个阶段,运行起来分别是什么样?这篇用杀 leader 之后新一任的日志,把三个阶段按毫秒还原出来。

3 个阶段
发现 → 同步 → 广播
110 + 10 ms
discovery 与 synchronization 的用时(本次)
NEWLEADER / UPTODATE
同步阶段 leader 发给 follower 的两条关键消息

leader 一侧的时间线

实测 · 本机执行输出
  新 leader z39-3 的日志(相对杀 leader 的毫秒):
    +   11 ms  Peer state changed: looking
    +  217 ms  Peer state changed: leading
    +  230 ms  LEADING - LEADER ELECTION TOOK - 218 MS
    +  231 ms  Peer state changed: leading - discovery
    +  340 ms  Synchronizing with Learner sid: 1 maxCommittedLog=0x100000020 minCommittedLog=0x100000001 lastProces
    +  340 ms  Sending DIFF zxid=0x100000020 for peer sid: 1
    +  341 ms  Peer state changed: leading - synchronization
    +  344 ms  Have quorum of supporters, sids: [[1, 3]]; starting up and setting last processed zxid: 0x200000000
    +  351 ms  Peer state changed: leading - broadcast
  follower z39-1 的日志:
    +    6 ms  Peer state changed: looking
    +  218 ms  Peer state changed: following
    +  220 ms  FOLLOWING - LEADER ELECTION TOOK - 214 MS
    +  221 ms  Peer state changed: following - discovery
    +  340 ms  Peer state changed: following - synchronization
    +  342 ms  Peer state changed: following - synchronization - diff
    +  343 ms  Learner received NEWLEADER message
    +  344 ms  Set the current epoch to 2
    +  344 ms  Peer state changed: following - synchronization
    +  344 ms  Sent NEWLEADER ack to leader with zxid 200000000
    +  352 ms  Learner received UPTODATE message
    +  353 ms  Peer state changed: following - broadcast

各阶段花了多久

实测 · 本机执行输出
  选出 leader(进入 discovery)+231 ms → 进入 synchronization +341 ms(discovery 用 110 ms)→ 进入 broadcast +351 ms(synchronization 用 10 ms)

哪些消息没能直接验证

实测 · 本机执行输出
  在 INFO 日志里能搜到的协议消息关键字: ['DIFF', 'NEWLEADER', 'UPTODATE']

分步演示

ZAB 三阶段
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。3 节点伪集群,INFO 日志;时间相对杀 leader 的时刻,每次运行有波动
    • 没有验证:发现阶段的消息细节、同步阶段 SNAP / TRUNC 的触发(第 42 篇)、follower 数量更多时各阶段的耗时、DEBUG 级别日志(试了一次,没有增加协议消息的行)
    京ICP备2026067502号-1京公网安备11010502063487号