11.6.4 日志与快照管理
日志与快照管理#
ZooKeeper 的数据持久化由事务日志(transaction log)与快照(snapshot)共同完成。本节重点是:理解恢复链路、配置目录与清理策略、掌握解析工具与排错方法,并给出可执行示例与练习。
原理草图(恢复链路)
目录与关键配置(示例)
- dataDir:事务日志与快照默认目录(若未指定 dataLogDir)。
- dataLogDir:独立事务日志目录,生产建议与快照分盘。
- snapCount:触发快照的事务数量阈值。
- autopurge.snapRetainCount:保留快照数量。
- autopurge.purgeInterval:自动清理周期(小时),0 表示关闭。
# /etc/zookeeper/zoo.cfg
dataDir=/var/lib/zookeeper
dataLogDir=/var/log/zookeeper/txn
snapCount=100000
autopurge.snapRetainCount=3
autopurge.purgeInterval=24
安装/工具准备(日志与快照解析)
部分发行包未单独安装工具脚本,可用自带脚本包:
# 假设 ZooKeeper 安装在 /opt/zookeeper
cd /opt/zookeeper/bin
# 解析事务日志(需 Java)
./zkTxnLogToolkit.sh -logdir /var/log/zookeeper/txn
# 解析快照(部分版本支持)
./zkSnapShotToolkit.sh -snapshot /var/lib/zookeeper/snapshot.123456789
命令示例:查看目录与文件配对
# 查看事务日志与快照
ls -lh /var/log/zookeeper/txn | tail -n 5
ls -lh /var/lib/zookeeper | grep snapshot | tail -n 5
# 检查最新快照与日志 zxid 是否连续(示例输出)
# snapshot.0000000000000100
# log.0000000000000101
- 解释:快照的
zxid之后应有连续日志,否则回放不完整可能导致启动失败。
清理与磁盘管理(自动+手动)
# 启用自动清理(确保配置生效后重启)
systemctl restart zookeeper
# 手动清理示例:保留最近 3 个快照与相关日志
cd /var/lib/zookeeper
ls -t snapshot.* | tail -n +4 | xargs -r rm -f
cd /var/log/zookeeper/txn
# 删除早于最旧保留快照 zxid 的日志(示例以 zxid=100 为界)
find . -name "log.*" | awk -F. '{print $2}' | awk '$1<100{print "log."$1}' | xargs -r rm -f
- 说明:手动清理前确认节点健康并有足够快照可回放。
恢复演练(示例步骤)
# 1) 备份 dataDir 与 dataLogDir(保持同一时间点)
systemctl stop zookeeper
tar -czf /backup/zk-data-$(date +%F).tgz /var/lib/zookeeper /var/log/zookeeper/txn
# 2) 恢复(示例)
rm -rf /var/lib/zookeeper /var/log/zookeeper/txn
tar -xzf /backup/zk-data-2024-01-01.tgz -C /
chown -R zookeeper:zookeeper /var/lib/zookeeper /var/log/zookeeper/txn
# 3) 启动验证
systemctl start zookeeper
echo ruok | nc 127.0.0.1 2181
# 预期输出: imok
常见问题与排错(带命令)
- 磁盘占满
df -h /var/lib/zookeeper /var/log/zookeeper/txn
grep -E 'autopurge|snapCount' /etc/zookeeper/zoo.cfg
- 启动慢或失败(日志损坏/权限)
tail -n 200 /var/log/zookeeper/zookeeper.log
ls -l /var/lib/zookeeper /var/log/zookeeper/txn
- 写入延迟高(I/O 竞争)
iostat -x 1 5
# 建议:dataDir 与 dataLogDir 分盘
练习
1. 将 snapCount 调整为 20000,通过模拟写入(如 zkCli.sh 创建节点)观察快照生成频率变化。
2. 备份后删除旧日志与快照,验证重启是否可恢复(练习环境进行)。
3. 使用 zkTxnLogToolkit.sh 解析最新日志,找出最近一次 create 事务。
最佳实践
- 日志与快照分盘,监控磁盘使用率与 IOPS。
- 定期验证备份可恢复,保持版本一致。
- 与 NTP 同步,减少 zxid 回放异常。