U39 ZooKeeper 三节点行为实验
本实验固定 ZooKeeper 3.9.6、Curator Test 5.7.0、JDK 17。3.9.6 是 2026-10-30 官方发布页的 current GA,不冒称该页的 “latest stable” (3.8.7)。Curator TestingCluster 只负责在测试 JVM 中启动和关闭三个 ZooKeeper 投票节点;客户端 行为使用 ZooKeeper 原生 Java API 验证,不把 Curator 配方当作服务端契约。
运行
依赖已在本机 Maven 缓存时,从仓库根执行:
实验代码bash
python3 labs/zookeeper/run.py首次准备固定依赖需要 Maven Central;入口实际验收强制 Maven 离线模式,避免运行时 静默换版本。它依次验证:
- digest ACL:匿名和错误凭据得到
NOAUTH,正确addAuthInfo可读取; - 普通 data watch 只触发一次,两次更新后必须重读得到最终
v2; - 杀死当前连接节点后,客户端以同一 session 重连,临时节点仍在;随后停掉全部 服务端,先观察 3.9.6 客户端本地
Expired,此刻明确不能证明服务端删除; 重启 ensemble 后再由新客户端单独观察临时节点最终不可见; - 三投票节点停一台后,多数派仍可提交写;节点恢复后,客户端定向连接该恢复节点, 读取故障期间的值,再
sync后读取恢复后的新值。
第五项测试专门把用户 home 作为非法 u39.temp.root 输入,断言清理守卫拒绝越界目录; 它不增加 ZooKeeper 行为结论。
成功证据写入 evidence/u39-2026-10-30.json。失败运行会先把 旧成功状态改成 running,最后写为 failed,不会留下伪成功。测试结束通过 TestingCluster.close() 删除 runner 指定的专用 dataDir;Java @AfterAll 与 runner 分别核查目录不存在。超时/异常路径由 runner 回收 Maven/JVM 进程组并定向删除同一 目录,清理失败时不会写成 passed。
实验文件可直接下载核查:公开入口 run.py、固定依赖 pom.xml、 四组行为及清理守卫测试 ZooKeeperClusterTest.java。
证明边界
- 这是真实 ZooKeeper 3.9.6 三节点同进程实验,不是 Python 模型,也不是外部 已部署集群。
- 三节点共享一台机器和一个测试 JVM;停节点不等于跨主机网络分区,结果不能证明 跨机房延迟、磁盘损坏、操作系统崩溃、生产吞吐或 SLA。
- 客户端本地
Expired与服务端closeSession提交不是同一时点。本实验只证明 “全节点不可达时客户端先过期,ensemble 恢复后临时节点最终不可见”,未观测删除 zxid,也不声称直接测得服务端过期事务提交时刻。 - 实验使用随机本机端口、合成路径
/u39和合成 digest 身份,不访问 DBngin 服务, 不使用 Docker,不修改全局 ZooKeeper 配置。