ZooKeeper 把数据放在哪?事务日志和快照是什么关系?文件名里的十六进制数字是什么意思?这篇看一遍真实的 version-2 目录,并用官方自带的两个工具把里面的内容读出来。
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: 0xf5dataDir/version-2: ['snapshot.0'] dataLogDir/version-2: ['log.1']