zookeeper运维

半兽人 发表于: 2018-11-19   最后更新时间: 2022-09-24 23:49:24  
{{totalSubscript}} 订阅, 4,533 游览

zookeeper服务本身可以说是很牢靠的了,但省心并不代表不会出问题,下面总结下zookeeper运维相关的东西。

watches数量多的问题:

dubbo对于每个节点都会watch,导致watch数很多,随便都几千个。用wchswchcwchp这些命令可以查看watches的信息,包括总数,每条路径上的watch的数量。每个client的。

查找不能成功启动原因:

zookeeper会有很多原因启动不成功,可以通过以下命令来查看启动时报的是什么异常,同时也可以查看运行过程中的异常。:

./zkServer.sh start-foreground

另外,通过:

./zkServer.sh print-cmd

可以查看zookeeper启动的各个参数,包括java路径等,也可以便于查找问题。

配置自动清理日志:

从3.4.0开始,会自动清理日志了,所以这个通常不用配置。

配置autopurge.snapRetainCountautopurge.purgeInterval参数。
保留的snapshop的数量,默认是3个,最小也是3

autopurge.snapRetainCount=3
autopurge.purgeInterval=1

另外要注意的是,zookeeper重启会自动清除zookeeper.out日志,所以如果出错要注意先备份这个文件。

配置zookeeper.out的位置及log4j滚动日志输出

今天发现线上的bin/zookeeper.out 居然有6G大小。看了下zkServer.sh的代码,这个zookeeper.out实际上是nohup的输出。

而nohup的输出实际上是stdout,stderr的输出,所以还是zookeepe本身的日志配置的问题。

研究了下bin/zkServer.sh和conf/log4j.properties,发现zookeeper其实是有日志相关的输出的配置,只要定义相关的变量就可以了。

主要是ZOO_LOG_DIR和ZOO_LOG4J_PROP这两个环境变量:

zkServer.sh里的:

if [ ! -w "$ZOO_LOG_DIR" ] ; then
mkdir -p "$ZOO_LOG_DIR"
fi

_ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.out"

    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 &

log4j.properties里的:

# Add ROLLINGFILE to rootLogger to get log file output
#    Log DEBUG level and above messages to a log file
log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold}
log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}

而zkServer.sh会加载zkEnv.sh。

因此,其实修改下bin/zkEnv.sh就可以了:

if [ "x${ZOO_LOG_DIR}" = "x" ]
then
    ZOO_LOG_DIR="$ZOOBINDIR/../logs"
fi

if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
    ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
fi

还可以修改下conf/log4j.properties,设置滚动日志最多为10个:

# Max log file size of 10MB
log4j.appender.ROLLINGFILE.MaxFileSize=10MB
# uncomment the next line to limit number of backup files
log4j.appender.ROLLINGFILE.MaxBackupIndex=10

Too many connections from 错误

这个错误是因为同一个IP的zookeeper socket 连接数大于60了。zookeeper server默认限制每个IP最多60个连接。

这个在测试服务器上出现的,因为测试服务器上太多进程在跑了。

修改为:

maxClientCnxns=150

This ZooKeeper instance is not currently serving requests 的错误提示

当集群里的节点只剩下一台,或者不足半数时,就会出现这个错误提示。

通常在,只启动第一台zookeeper时会报这个错误。

在zookeeper server的日志里,会有类似的日志:

Exception causing close of session 0x0 due to java.io.IOException: ZooKeeperServer not running

Zookeeper连接速度很慢,Dubbo初始化很慢,应用启动很慢的问题

发现线下环境迁移到新机器后,应用启动变得很慢,本来十几秒启动的应用,变成几分钟才能启动。

启动过程没有报错,只是Dubbo的注册信息日志一直在比较慢地刷。

开始怀疑是网络问题,但是检查了iptables没有开启,用iptraf查看流量,也不高。机器的空闲内存也足够。

再检查Zookeeper的配置,磁盘的空间,应用的dubbo配置,jvm配置,发现都没有问题。

没办法了,用jprofiler来测试下,发现“org.I0Itec.zkclient.ZkClient$1.call”,这个调用耗时比较大。

这样确认是zookeeper本身比较慢,不是应用的问题。

用下面的zookeeper benchmark工具测试了下性能,发现read速度还可能,create/write速度非常慢,qps只有个位数。

于是问了下运维的同事,原来新机器是用共享磁盘的,所以速度很慢。

而zookeeper每次write请求都要写到log日志,并刷到磁盘里,所以非常的慢。

后来运维的同事换为本地磁盘,一切恢复正常。

管理工具:

Zookeeper官方自带的管理员工具:

官方的命令行工具可以胜任绝大部分工作了。

https://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html    

zktop

python写的小工具
https://github.com/phunt/zktop

taokeeper

项目地址:https://github.com/alibaba/taokeeper
淘宝出品的一个监控工具,还有可以用脚本来监控的功能。虽然开源了,但是实际上很难用,代码也很难扩展,而且有些jar包是淘宝内部的。

Exhibitor

这个是Netflix出品的一个监控工具,但实际上也很难用。。

Exhibitor的主要功能 监控本机的Zookeeper服务,可以自动重启挂掉的Zookeeper服务;

  • 定期备份数据;
  • 定期清理Zookeeper日志;
  • 提供了一个Web界面可以修改Zookeeper的数据;
  • REST API。

性能测试相关:

https://github.com/brownsys/zookeeper-benchmark
这个工具输出结果比较乱,不过用起来还不错。

mvn -DZooKeeperVersion=3.4.5 package
./runBenchmark.sh  test

然后在test文件夹下,会有生成的信息。主要在zk-benchmark.log这个文件里。

更新于 2022-09-24

查看zookeeper更多相关的文章或提一个关于zookeeper的问题,也可以与我们一起分享文章