生产技巧:如何不停机修改Zookeeper日志路径?
欢迎来到阿八个人博客网站。本 阿八个人博客 网站提供最新的站长新闻,各种互联网资讯。 喜欢本站的朋友可以收藏本站,或者加QQ:我们大家一起来交流技术! URL链接:https://www.abboke.com/ITjs/2019/0611/493.html
偶然看到2017年8月写的工作日志,希望对大家的工作有参考价值。
由于Kafka集群的运维兄弟没对线上环境Zookeeper做处理,因此zookeeper.out
文件会不断增大,没几天时间,文件已经有6G。故而需要做一些改进,避免这种情况。
目前,咪咕Kafka及Zookeeper是分离部署的(即:未使用Kafka本身自带的Zookeeper),故而要想修改Zookeeper的日志,需如下操作:
准备工作
执行如下命令,找到Kafka/Zookeeper:
1
ps -ef|grep kafka # 如果是找zookeeper进程,那么就把kafka替换成zookeeper
结果展示如下:
1
migu 141395 1 91 Jan08 ? 9-23:31:12 /usr/java/jdk1.8.0_131/bin/java -Xms30g -Xmx30g -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+DisableExplicitGC -Djava.awt.headless=true -Xloggc:/usr/local/kafka/bin/../logs/kafkaServer-gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M
由结果可知,Kafka目录为
/usr/local/kafka
,同理,也可找到Zookeeper目录为/usr/local/zookeeper
。执行如下命令,查看Zookeeper状态:
1
2
3
4[root@5fe1601 bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower如上所示,该实例是一个
follower
。需注意,如果Zookeeper集群只有3个实例,那么日志修改务必先修改follower
节点的配置,再修改leader
节点的配置,否则可能会导致问题。
修改日志
下面我们来修改日志输出:
在
conf/log4j.properties
中,找到:1
2# Define some default values that can be overridden by system properties
zookeeper.root.logger=INFO, CONSOLE改为:
1
2Define some default values that can be overridden by system properties
zookeeper.root.logger=INFO,ROLLINGFILE这样,日志就会打印到
${zookeeper.log.dir}/${zookeeper.log.file}
,即:./zookeeper.log
。也可根据需要,修改zookeeper.log.dir
及zookeeper.log.file
的值,在文件conf/log4j.properties
中。修改
bin/zkEvn.sh
,找到:1
2
3
4if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
ZOO_LOG4J_PROP="INFO,CONSOLE"
fi修改为:
1
2
3
4if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
fi【可选】此时,如果重启Zookeeper,就会发现在当前目录生成
zookeeper.log
文件,但此时已然会生成一个zookeeper.out
文件,内容为空。虽然不影响使用,但是不优雅 ,如何解决该问题呢?只需在bin/zkServer.sh
中:注释如下内容:
1
_ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.out"
将如下内容:
1
2nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
-cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &修改为:
1
2nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
-cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" >&1 < /dev/null &
执行如下命令,重启Zookeeper:
1
zkServer.sh restart
这样,Zookeeper就不会再向zookeeper.out文件中打印日志了。
同样的操作,修改Zookeeper集群中的其他Zookeeper实例,注意:建议在最后修改
leader
节点 ,避免修改日志中途有额外的选举操作,影响线上性能。
参考文档
- Zookeeper 日志输出到指定文件夹:https://www.cnblogs.com/zhwbqd/p/3957018.html
- Zookeeper Log4j日志输出修改:http://yangyoupeng-cn-fujitsu-com.iteye.com/blog/1922459
- Zookeeper在线迁移:http://blog.csdn.net/lirenzuo/article/details/71080063