zxid 是 ZooKeeper 里最重要的数字:每个事务一个,全局递增。这篇把它拆开看:高 32 位是什么、低 32 位是什么、换 leader 时怎么变、数据目录里和它相关的文件有哪些。
刚选出第一任 leader 后: {'z37-1': '0x100000001 = epoch 1 + counter 1', 'z37-2': '0x100000001 = epoch 1 + counter 1', 'z37-3': '0x100000001 = epoch 1 + counter 1'}
写 3 个 znode 之后: {'z37-1': '0x100000004 = epoch 1 + counter 4', 'z37-2': '0x100000004 = epoch 1 + counter 4', 'z37-3': '0x100000004 = epoch 1 + counter 4'}
这 3 个 znode 的 czxid: ['0x100000002', '0x100000003', '0x100000004'] 第二任 leader 选出后: {'z37-1': '0x200000001 = epoch 2 + counter 1', 'z37-3': '0x200000001 = epoch 2 + counter 1'}
再写 2 个之后: {'z37-1': '0x200000003 = epoch 2 + counter 3', 'z37-3': '0x200000003 = epoch 2 + counter 3'}
/c(第一任)与 /d(第二任)的 czxid: 0x100000004 0x200000002 → 后一任的 zxid 一定更大,即使 counter 更小z37-1 的 data 目录: ['myid', 'version-2'] acceptedEpoch = '2' currentEpoch = '2' 事务日志文件(文件名是第一条事务的 zxid): ['log.100000001']