bigywater.tech
ZooKeeper · 38

ZXID 的 epoch 与 counter

zxid 的两半各自怎么变化?哪些操作会让 counter 增加?epoch 什么时候增加?这篇把这三个问题逐个量出来,并顺手区分 epoch 与选举轮次 round。

事务才计数
create / set / delete 各 +1;multi 整体 +1;读 +0
会话也是事务
新建 + 关闭会话共 +2
epoch 只在当选后 +1
没有多数派时反复选举也不涨

counter 数什么

实测 · 本机执行输出
  create /x                    counter 1 → 2(+1)
  set /x                       counter 2 → 3(+1)
  delete /x                    counter 3 → 4(+1)
  get /(读)                     counter 4 → 4(+0)
  exists /(读)                  counter 4 → 4(+0)
  multi(5 个 create)            counter 4 → 5(+1)
  新建并立刻关闭一个会话                  counter 5 → 7(+2)
  create 临时节点(同一会话)            counter 7 → 8(+1)

epoch 什么时候增加

实测 · 本机执行输出
  第 1 次换 leader 之后:新 leader z38-3,zxid epoch = 2,counter = 0
  第 2 次换 leader 之后:新 leader z38-2,zxid epoch = 3,counter = 0
  第 3 次换 leader 之后:新 leader z38-3,zxid epoch = 4,counter = 0
  没有多数派的 8 秒里节点反复 LOOKING;恢复后 epoch 4 → 5(只有成功当选才 +1,选举轮次 round 是另一个计数)
  某节点日志里出现过的 n.round 最大值(选举轮次): 0x5

第三节里 epoch 只增加了 1,说明失败的选举轮次没有消耗 epoch(这是这一次运行的现象)。

分步演示

epoch 与 counter
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。3 节点伪集群;counter 取自 srvr 的 Zxid 低 32 位(每步等 0.2 s 再读)
    • 没有验证:counter 溢出(2^32)时 leader 主动退位的行为、epoch 在极端并发选举下的取值、observer 对 zxid 的影响
    京ICP备2026067502号-1京公网安备11010502063487号