bigywater.tech
ZooKeeper · 41

Proposal、Transaction、Commit 的源码关系

Proposal、Transaction、Commit 在 ZooKeeper 里分别指什么、怎么对应?我没有去读源码,而是从结果看:三个节点事务日志里的内容,是不是同一份。

27 条完全相同
3 个节点事务日志逐行比较的结果
cxid vs zxid
客户端请求序号 vs 集群事务序号
multi = 1 条事务
一条记录里有多个子操作,占一个 zxid

三个节点的日志逐行相同

实测 · 本机执行输出
  z41-1(follower):共 27 条事务,最后一条: session 0x1000c2980a00000 cxid 0x1a zxid 0x10000001b closeSession v{}
  z41-2(leader):共 27 条事务,最后一条: session 0x1000c2980a00000 cxid 0x1a zxid 0x10000001b closeSession v{}
  z41-3(follower):共 27 条事务,最后一条: session 0x1000c2980a00000 cxid 0x1a zxid 0x10000001b closeSession v{}
  三个节点的事务日志内容逐行完全相同(含时间戳、会话 id、cxid、zxid): True

这说明 leader 发出的 proposal 就是要写进每个节点事务日志的那条记录,「提交」只是把它应用到内存里的数据树。至于类名与方法之间的源码对应关系,本文没有读源码,留给第 99 篇的源码阅读。

一条事务的结构

实测 · 本机执行输出
   session 0x1000c2980a00000 cxid 0x2 zxid 0x100000003 create /t/a,hello,[31,s{'world,'anyone}
   session 0x1000c2980a00000 cxid 0x17 zxid 0x100000018 setData /t/a,world,1
   session 0x1000c2980a00000 cxid 0x18 zxid 0x100000019 delete '/t/n0
   session 0x1000c2980a00000 cxid 0x19 zxid 0x10000001a multi create:/t/m11worldanyone;create:/t/m2

multi 事务

实测 · 本机执行输出
  multi 事务: session 0x1000c2980a00000 cxid 0x19 zxid 0x10000001a multi create:/t/m11worldanyone;create:/t/m22worldanyon

分步演示

事务日志
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。3 节点伪集群;TxnLogToolkit 是 3.9.6 jar 里的官方类;比较的是 version-2 下所有 log.* 文件里带 zxid 的行
    • 没有验证:proposal 与 commit 消息在网络上的格式、源码里 Request / Proposal / TxnHeader 之间的对象关系、事务日志里 digest 校验字段
    京ICP备2026067502号-1京公网安备11010502063487号