小型化硬盘占用过大问题排查

2022-02-18 18:26:59阅读 11评论 0

问题描述

小型化在部署好后,硬盘占用逐渐增大,直至机器整个硬盘耗尽

初步排查

该机器硬盘20g ,可见volumes目录占用空间巨大

图片1.png

执行df -h可见剩下2.3g空间,服务停掉后执行docker volume prune(清除未使用volume),可用空间增大到11g

图片2.png

换到另一台部署小型化具有同样问题的机器,查看可发现有两个volume的占用空间很大,经比对,定位到这两个volume分别属于zookeeper和rabbitmq

图片3.png

图片4.png

问题分析

zookeeper问题分析

是什么文件占用大量硬盘?

进入zookeeper的这个volume内,可见这里面有很多日志

图片5.png

在使用zookeeper过程中,我们知道,会有dataDir和dataLogDir两个目录,分别用于snapshot和事务日志的输出(默认情况下只有dataDir目录,snapshot和事务日志都保存在这个目录中)
正常运行过程中,ZK会不断地把快照数据和事务日志输出到这两个目录,并且如果没有人为操作的话,ZK自己是不会清理这些文件的,需要管理员来清理

如何清理日志?

1)linux命令+定时器

ZK的bin目录下有一个脚本zkCleanup.sh,设置定时器去执行这个脚本,但必须要在ZK容器内执行,这样就涉及到改镜像,过于麻烦,排除掉改方案
另外还有一种方案是在宿主机上跑一个定时器,直接rm -rf 日志目录,涉及到改启动脚本以及考虑不同系统的兼容性,排除掉该方案

2)配置文件

从3.4.0开始,zookeeper提供了自动清理snapshot和事务日志的功能,通过配置 autopurge.snapRetainCount 和 autopurge.purgeInterval 这两个参数能够实现定时清理了。这两个参数都是在zoo.cfg中配置

dataDir=/data
dataLogDir=/datalog
tickTime=2000
initLimit=5
syncLimit=2
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
maxClientCnxns=60
standaloneEnabled=true
admin.enableServer=true
server.1=localhost:2888:3888;2181

这样处理后,启动后每隔半小时观察,volume目录占用空间逐渐增大后又变小,总的占用空间长期不超过600M

图片6.png

Rabbitmq问题分析

是什么文件占用大量空间?

最终找到一个名为00000001.wal的文件占用巨大的空间

图片7.png

在rabbitmq的官方文档中查到,改文件存放的是Quorum Que所有操作,但占用硬盘大小不会超过512M

图片8.png

而之前有机器出现volume占用几十G的情况,除了zookeeper的日志持续增大的问题外,还有就是创建的volume废弃后未清理,这些废弃的volume中特别是rabbitmq的废弃volume每个会占用500M左右空间

总结

废弃volume怎么产生?

执行docker-compose up -d 后,再执行docker-compose down。此过程会创建容器,再销毁容器,下次执行docker-compose up -d后又会重新创建volume(未绑定的),而之前创建容器时创建的volume(未绑定的)在容器销毁后就废弃了

小型化的启动和停止,用的就是docker-compose up -d和docker-compose down,因此会出现这个问题

废弃volume如何清理?

执行docker volume prune

还没有评论,来说两句吧