Fork me on GitHub

生产技巧:如何不停机修改Zookeeper日志路径?

偶然看到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
    2
    # Define 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.dirzookeeper.log.file 的值,在文件conf/log4j.properties 中。

  • 修改bin/zkEvn.sh ,找到:

    1
    2
    3
    4
    if [ "x${ZOO_LOG4J_PROP}" = "x" ]
    then
    ZOO_LOG4J_PROP="INFO,CONSOLE"
    fi

    修改为:

    1
    2
    3
    4
    if [ "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
      2
      nohup "$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
      2
      nohup "$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 节点 ,避免修改日志中途有额外的选举操作,影响线上性能。

参考文档

评论系统未开启,无法评论!