周末的时候在家收到了工作的告警通知,远程登录后发现是自运维的CK集群硬盘空间不足,通过命令查看各个目录的大小,确定是Zookeeper的日志及snapshot占用了绝大部分空间。
Zookeeper主要存放了两类文件,snapshot和log,前者是内存数据的快照,后者是记录修改数据相关的操作记录,类似于mysql的binlog。
正常的运行过程中,zk会不断的将快照数据和日志记录输出到这两个目录,并且zk不会自动清理这些文件,所以需要我们手动清理。清理的脚本如下:
#! /bin/bash
# snapshot目录
snapshotDir=xxxx
#log目录
dataLogDir=xxxx
logDir=xxxx
#保留文件数量
leftFileNum=10
#删除
ls -t $snapshotDir/snapshot.* | tail -n +$leftFileNum | xargs rm -f
ls -t $dataLogDir/log.* | tail -n +$leftFileNum | xargs rm -f
ls -t $logDir/zookeeper.log.* | tail -n +$leftFileNum | xargs rm -f
从3.4.0开始,zookeeper提供了自动清理snapshotlog的功能,在zoo.cfg文件中配置如下参数:
# 指定保留文件数量
autopurge.snapRetainCount=10
# 指定清理频率,单位是小时,默认0,表示不开启
autopurge.purgeInterval=12