0%

Zookeeper 事务日志和 snapshot 清理

Zookeeper 运行过程会产生大量的事务日志和 snapshot 镜像文件,讨论下如何清理事务日志和snapshot


日志文件

在使用ZK过程中,会有dataDir和dataLogDir两个目录,分别用于snapshot和事务日志的输出(默认情况下只有dataDir目录,snapshot和事务日志都保存在这个目录中)

ZK在完成若干次事务日志之后(在ZK中,凡是对数据有更新的操作,比如创建节点,删除节点或是对节点数据内容进行更新等,都会记录事务日志),ZK会触发一次快照(snapshot),将当前server上所有节点的状态以快照文件的形式dump到磁盘上去,即snapshot文件。这里的若干次事务日志是可以配置的,默认是100000,具体参看配置参数”snapCount”的介绍

日志清理

配置自动清理

ZK在3.4.0版本以后提供了自动清理snapshot和事务日志的功能通过配置 autopurge.snapRetainCountautopurge.purgeInterval 这两个参数能够实现定时清理了。

当前ZK版本为3.4.6,因此可以使用自带的清理功能

  • autopurge.purgeInterval: 这个参数指定了清理频率,单位是小时,需要填写一个1或更大的整数,默认是0,表示不开启自己清理功能。
  • autopurge.snapRetainCount: 这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。
1
2
autopurge.snapRetainCount=50
autopurge.purgeInterval=1

每一个小时清理一次,一次保留50个文件

自定义清理脚本

clean_zook_log.sh 脚本内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

#snapshot file dir
dataDir=/home/tu/data/zookeeper/version-2
#tran log dir
dataLogDir=/home/tu/data/zookeeper/version-2
#zk log dir
logDir=/home/tu/zookeeper/logs
#Leave 60 files
count=50
count=$[$count+1]
ls -t $dataLogDir/log.* | tail -n +$count | xargs rm -f
ls -t $dataDir/snapshot.* | tail -n +$count | xargs rm -f
ls -t $logDir/zookeeper.log.* | tail -n +$count | xargs rm -f

这个脚本保留最新的50个文件,可以将这个脚本添加到crontab中,设置为每30分钟执行

1
30 * * * * /bin/bash /home/tu/zookeeper/bin/clean_zook_log.sh > /dev/null 2>&1
zkCleanup.sh清理

ZK自己有自带的清理文件 bin/zkCleanup.sh,可以直接使用这个脚本也是可以执行清理工作的,是使用的zookeeper.jar里的org.apache.zookeeper.server.PurgeTxnLog来做的


参考链接