bigywater.tech
ZooKeeper · 5

数据目录与事务日志

ZooKeeper 把数据放在哪?事务日志和快照是什么关系?文件名里的十六进制数字是什么意思?这篇看一遍真实的 version-2 目录,并用官方自带的两个工具把里面的内容读出来。

64 MiB 预分配
每个事务日志文件的表观大小;实际占盘只有 20 KiB(稀疏文件)
文件名 = zxid
log.<首条事务 zxid>、snapshot.<快照时最大 zxid>
snapCount/2 ~ snapCount
两次快照之间的事务数范围(实测间隔都在 snapCount=100 的这个范围内)

刚启动时

实测 · 本机执行输出
  log.1                  大小  67108880 字节  实际占盘     20480 字节
  snapshot.0             大小       478 字节  实际占盘      4096 字节
  dataDir 下还有: ['version-2']

写入之后

实测 · 本机执行输出
  log.1                  大小  67108880 字节  实际占盘     20480 字节
  log.5c                 大小  67108880 字节  实际占盘     20480 字节
  log.bb                 大小  67108880 字节  实际占盘     20480 字节
  log.f7                 大小  67108880 字节  实际占盘     20480 字节
  snapshot.0             大小       478 字节  实际占盘      4096 字节
  snapshot.5a            大小     12085 字节  实际占盘     12288 字节
  snapshot.b9            大小     24650 字节  实际占盘     28672 字节
  snapshot.f5            大小     32379 字节  实际占盘     32768 字节
  文件名里的十六进制是 zxid:log.<该文件第一条事务的 zxid>、snapshot.<快照时已处理的最大 zxid>;当前最大 zxid = 0x12d

「实际占盘」取自文件系统的块数(st_blocks),在 APFS 上预分配的 64 MiB 是稀疏的;别的文件系统上表现可能不同,本文只验证了 macOS。

事务日志里有什么

实测 · 本机执行输出
   ZooKeeper Transactional Log File with dbid 0 txnlog format version 2
   10/1/26, 9:04:42 AM CST session 0x1000bb57bea0000 cxid 0x0 zxid 0x1 createSession 10000
   10/1/26, 9:04:42 AM CST session 0x1000bb57bea0000 cxid 0x1 zxid 0x2 create /n0,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,[31,s{'world,'anyone
   ],false,1
   10/1/26, 9:04:42 AM CST session 0x1000bb57bea0000 cxid 0x2 zxid 0x3 create /n1,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,[31,s{'world,'anyone
   ],false,2
   10/1/26, 9:04:42 AM CST session 0x1000bb57bea0000 cxid 0x3 zxid 0x4 create /n2,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,[31,s{'world,'anyone
  ……共 183 行输出;最后一行: EOF reached after 91 txns.

快照里有什么

实测 · 本机执行输出
   ZNode Details (count=249):
   ----
   /
     cZxid = 0x00000000000000
     ctime = Thu Jan 01 08:00:00 CST 1970
     mZxid = 0x00000000000000
     mtime = Thu Jan 01 08:00:00 CST 1970
     pZxid = 0x000000000000f5
     cversion = 244
     dataVersion = 0
     aclVersion = 0
     ephemeralOwner = 0x00000000000000
  ……共 2982 行(每个 znode 一段);最后一行: Last zxid: 0xf5

dataLogDir

实测 · 本机执行输出
  dataDir/version-2: ['snapshot.0']
  dataLogDir/version-2: ['log.1']

分步演示

数据目录
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。snapCount=100(默认是 100000,这里调小是为了几百个事务就能看到快照);TxnLogToolkit 与 SnapshotFormatter 是 3.9.6 jar 里的官方类
    • 没有验证:快照与日志的清理(autopurge,第 54 篇)、事务日志 fsync 的耗时(第 55、56 篇)、非 APFS 文件系统的预分配行为、快照压缩(zookeeper.snapshot.compression.method)
    京ICP备2026067502号-1京公网安备11010502063487号