Zookeeper自动清理失效,zkCleanup.sh执行无效果求助
解决ZooKeeper autopurge自动清理及zkCleanup.sh无效的问题
看了你的配置和操作记录,autopurge参数设置后没生效,手动执行清理脚本也没效果,我来帮你一步步排查解决:
1. 先确认autopurge功能的基础要求
你用的是ZooKeeper 3.4.11,autopurge功能确实是3.4.0之后支持的,但要注意两个关键点:
- 这些
autopurge.*参数必须放在**zoo.cfg主配置文件**里,不能放在其他自定义配置中 - 修改配置后必须重启ZooKeeper服务,参数才能生效
先检查下你是不是满足这两个条件,如果之前没重启过服务,先重启试试。
2. 排查zkCleanup.sh的执行逻辑问题
从你提供的脚本执行日志来看,脚本调用PurgeTxnLog时传入的目录是/opt/zookeeper-3.4.11/logs和/opt/zookeeper-3.4.11/data,但你的日志和快照文件都存在data/version-2目录下——这是问题核心!
ZooKeeper 3.4.x如果没有单独配置dataLogDir(事务日志目录),快照和事务日志会默认存在data/version-2里。而PurgeTxnLog的参数顺序是事务日志目录在前,快照目录在后,脚本传入的logs目录如果是空的或者没有对应日志文件,清理逻辑就找不到要删除的文件。
手动执行正确的清理命令
直接用Java命令指定正确的目录执行清理,把事务日志和快照目录都指向version-2:
/usr/lib/jvm/java-8-oracle/bin/java \ -Dzookeeper.log.dir=/opt/zookeeper-3.4.11/logs \ -Dzookeeper.root.logger=INFO,CONSOLE \ -cp /opt/zookeeper-3.4.11/bin/../build/classes:/opt/zookeeper-3.4.11/bin/../build/lib/*.jar:/opt/zookeeper-3.4.11/bin/../lib/slf4j-log4j12-1.6.1.jar:/opt/zookeeper-3.4.11/bin/../lib/slf4j-api-1.6.1.jar:/opt/zookeeper-3.4.11/bin/../lib/netty-3.10.5.Final.jar:/opt/zookeeper-3.4.11/bin/../lib/log4j-1.2.16.jar:/opt/zookeeper-3.4.11/bin/../lib/jline-0.9.94.jar:/opt/zookeeper-3.4.11/bin/../lib/audience-annotations-0.5.0.jar:/opt/zookeeper-3.4.11/bin/../zookeeper-3.4.11.jar:/opt/zookeeper-3.4.11/bin/../src/java/lib/*.jar:/opt/zookeeper-3.4.11/bin/../conf \ org.apache.zookeeper.server.PurgeTxnLog /opt/zookeeper-3.4.11/data/version-2 /opt/zookeeper-3.4.11/data/version-2 -n 10
执行完后再检查文件数量:
ls /opt/zookeeper-3.4.11/data/version-2/ | wc -l
3. 排查autopurge自动清理不生效的深层原因
如果手动清理生效了,但自动清理还是没工作,重点检查这几点:
- 权限问题:运行ZooKeeper的用户是否拥有
data/version-2目录的读写权限?如果权限不足,自动清理任务无法删除文件。可以手动尝试删除一个旧日志文件验证:
如果提示权限错误,就调整目录和文件的权限,让ZooKeeper运行用户拥有完整权限。rm /opt/zookeeper-3.4.11/data/version-2/log.9028ed00e - 参数加载验证:查看ZooKeeper启动日志,搜索
autopurge关键词,确认参数是否被正确读取。日志里应该有类似autopurge.snapRetainCount set to 10的记录。 - 集群环境注意点:如果是ZooKeeper集群,每个节点都需要单独配置autopurge参数并重启,自动清理是节点本地执行的,不会跨节点同步。
4. 替代方案:定时手动清理
如果自动清理始终有问题,可以用crontab配置定时任务,每天凌晨执行清理命令,比如:
0 2 * * * /usr/lib/jvm/java-8-oracle/bin/java -Dzookeeper.log.dir=/opt/zookeeper-3.4.11/logs -Dzookeeper.root.logger=INFO,CONSOLE -cp /opt/zookeeper-3.4.11/bin/../build/classes:/opt/zookeeper-3.4.11/bin/../build/lib/*.jar:/opt/zookeeper-3.4.11/bin/../lib/slf4j-log4j12-1.6.1.jar:/opt/zookeeper-3.4.11/bin/../lib/slf4j-api-1.6.1.jar:/opt/zookeeper-3.4.11/bin/../lib/netty-3.10.5.Final.jar:/opt/zookeeper-3.4.11/bin/../lib/log4j-1.2.16.jar:/opt/zookeeper-3.4.11/bin/../lib/jline-0.9.94.jar:/opt/zookeeper-3.4.11/bin/../lib/audience-annotations-0.5.0.jar:/opt/zookeeper-3.4.11/bin/../zookeeper-3.4.11.jar:/opt/zookeeper-3.4.11/bin/../src/java/lib/*.jar:/opt/zookeeper-3.4.11/bin/../conf org.apache.zookeeper.server.PurgeTxnLog /opt/zookeeper-3.4.11/data/version-2 /opt/zookeeper-3.4.11/data/version-2 -n 10 > /dev/null 2>&1
先试试手动执行正确的清理命令,应该能解决当前的文件堆积问题,再逐步排查自动清理的权限和配置加载问题。
内容的提问来源于stack exchange,提问作者Nessero Karuzo
相关产品推荐
相关产品推荐

