bigywater.tech
ZooKeeper · 34

Leader 选举过程

leader 挂了之后,多久能恢复?选举里节点之间到底发了什么?这篇重复杀 leader 5 次,量新 leader 出现和写入恢复的时间,再把一次选举里的选票交换从日志里摘出来。

410 ms
杀 leader 到第一次写入成功的中位时间(3 节点,本机)
373–811 ms
5 次的范围,有一次明显更慢
Notification
日志里每条选票的字段:sid、leader、round、peerEpoch、zxid

恢复时间

实测 · 本机执行输出
   次 被杀      新 leader     出现(ms)     写成功(ms)        选举耗时(日志,ms)
   1 z34-2   z34-1           341         416                211
   2 z34-1   z34-3           344         373                214
   3 z34-3   z34-2           783         811                641
   4 z34-2   z34-3           377         410                225
   5 z34-3   z34-2           345         373                214
  中位数:新 leader 出现 345 ms,第一次写成功 410 ms;最小 / 最大(写成功):373 / 811 ms

5 次里有一次明显更慢(选举耗时 641 ms 对其它的 211–225 ms),说明选举的耗时有波动,不要把中位数当作上限。

选票交换

实测 · 本机执行输出
  09:48:05.769  我是 LOOKING   收到 sid=1 的通知:它的状态 LOOKING   它投给 1  round=0x6 peerEpoch=0x5 zxid=0x500000004
  09:48:05.772  我是 LOOKING   收到 sid=2 的通知:它的状态 FOLLOWING 它投给 3  round=0x5 peerEpoch=0x5 zxid=0x400000004
  09:48:05.773  我是 LOOKING   收到 sid=2 的通知:它的状态 LOOKING   它投给 2  round=0x6 peerEpoch=0x5 zxid=0x500000004
  09:48:05.774  我是 LOOKING   收到 sid=1 的通知:它的状态 LOOKING   它投给 2  round=0x6 peerEpoch=0x5 zxid=0x500000004
  09:48:06.617  我是 FOLLOWING 收到 sid=3 的通知:它的状态 LOOKING   它投给 3  round=0x1 peerEpoch=0x5 zxid=0x500000004
  09:48:06.618  我是 FOLLOWING 收到 sid=3 的通知:它的状态 LOOKING   它投给 3  round=0x6 peerEpoch=0x5 zxid=0x500000004

选票比较的规则(先 epoch、再 zxid、最后 sid)在第 35 篇单独验证。

分步演示

Leader 选举
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。3 节点伪集群,tickTime=2000;「新 leader 出现」用 srvr 轮询,「写成功」用临时节点创建 / 删除;5 次重复
    • 没有验证:跨机器网络下的选举时间、tickTime 与 initLimit 对选举的影响、大数据量时的同步耗时(同步阶段在第 42 篇)、选举过程里的消息细节(第 35 篇)
    京ICP备2026067502号-1京公网安备11010502063487号