最近连续两次发现凌晨5点的时候,zk机器磁盘打满导致zk进程挂掉,从而造成hbase集群不可用的事故。 通过分析发现,zk进程一直在写log到文件log.31001e217b, 写这个文件主要是zk将保存的状态信息的操作日志写入到文件中持久化,通过如下的命令查看该日志文件可以发现是什么运用在不停地更新zk中的状态:
export ZOOKEEPER_CLASSPATH=/usr/local/hadoop/zookeeper-release/zookeeper-3.4.5.jar:/usr/local/hadoop/zookeeper-release/lib/log4j-1.2.15.jar:/usr/local/hadoop/zookeeper-release/lib/slf4j-api-1.6.1.jar:/usr/local/hadoop/zookeeper-release/lib/slf4j-log4j12-1.6.1.jar:/usr/local/hadoop/zookeeper-release/conf/
java -cp $ZOOKEEPER_CLASSPATH org.apache.zookeeper.server.LogFormatter /data/zookeeper/version-2/log.3100130e68 > 1.log
查看得出的信息发现,在log中有大量的storm运用更新状态信息的操作日志。
解决的办法就是设置一个crontab job来定时clean这些过期的日志文件,操作如下:
vim clean_log.sh
#!/bin/bash
cd `dirname $0`
/usr/local/jdk/bin/java -cp /usr/local/hadoop/zookeeper-release/zookeeper-3.4.5.jar:/usr/local/hadoop/zookeeper-release/lib/slf4j-log4j12-1.6.1.jar:/usr/local/hadoop/zookeeper-release/conf:/usr/local/hadoop/zookeeper-release/lib/slf4j-api-1.6.1.jar:/usr/local/hadoop/zookeeper-release/lib/log4j-1.2.15.jar org.apache.zookeeper.server.PurgeTxnLog /data/zookeeper/ /data/zookeeper/ -n 3 > clean.log 2>&1
crontab -e
*/30 * * * * sh /data/zookeeper/version-2/clean_log.sh
即zk提供了工具类 org.apache.zookeeper.server.PurgeTxnLog 来删除指定目录下的log日志, -n 指定保留最新的n个文件, n >= 3.
通过这样设置后, zk机器会每隔30分钟清理一次日志文件。
另外,还以修改zoo.cfg的一个配置:snapCount=5000 , 每当 snapCount 个事物日志写入时,快照被创建,同时创建新的事务日志文件,默认值100,000。 这样可以避免每个生成的log文件太大,导致还没清理的时候都占满空间!