尽管zookeeper在编程上有很多的阱陷,API也非常的难用,但zookeeper服务本身可以说是很牢靠的了,所以在网上貌似关于运维的文章比较少。
但省心并不代表不会出麻烦,下面总结下zookeeper运维相关的东东。
这里有一个很好的Pdf,介绍了很多zookeeper的东东,作者是zookeeper的committer之一:
http://www.infoq.com/presentations/Misconfiguration-ZooKeeper
另外,这里有一个总结:http://marcin.cylke.com.pl/blog/2013/03/21/zookeeper-tips/
首先修改bin/zkEnv.sh,配置ZOO_LOG_DIR的环境变量,ZOO_LOG_DIR是zookeeper日志输出目录,ZOO_LOG4J_PROP是log4j日志输出的配置:
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
再在/etc/init.d目录下增加zookeeper1文件,并加个可执行权限:
cd /etc/init.d touch zookeeper1 chmod +x zookeeper1再修改zookeeper1的内容为:
#/bin/sh #chkconfig: 2345 20 80 # description: zookeeper1 case $1 in start) su zookeeper /home/zookeeper/zookeeper345_1/bin/zkServer.sh start ;; stop) su zookeeper /home/zookeeper/zookeeper345_1/bin/zkServer.sh stop;; status) su zookeeper /home/zookeeper/zookeeper345_1/bin/zkServer.sh status;; restart) su zookeeper /home/zookeeper/zookeeper345_1/bin/zkServer.sh restart;; *) echo "require start|stop|status|restart" ;; esac最后用chkconfig -add zookeeper1 增加服务。这样就搞定了。注意用su zookeeper来切换到zookeeper用户。
这个和zookeeper的实现有关,参考这里:http://zookeeper-user.578899.n2.nabble.com/setting-zookeeper-heap-size-td6983511.html
线上的zookeeper的VIRT有30多G,查看了data, dataLog,总共才几百M。不过一直没什么问题。
zookeeper会有很多原因启动不成功,可以通过:
./zkServer.sh start-foreground来查看启动时报的是什么异常,同时也可以查看运行过程中的异常。
./zkServer.sh print-cmd可以查看zookeeper启动的各个参数,包括java路径等,也可以便于查找问题。
从3.4.0开始,会自动清理日志了,所以这个通常不用配置。
配置autopurge.snapRetainCount 和 autopurge.purgeInterval 参数。
保留的snapshop的数量,默认是3个,最小也是3.
autopurge.snapRetainCount=3 autopurge.purgeInterval=1参考这里:http://nileader.blog.51cto.com/1381108/932156
另外要注意的是,zookeeper重启会自动清除zookeeper.out日志,所以如果出错要注意先备份这个文件。
今天发现线上的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 &
# # 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就可以了:
https://gist.github.com/hengyunabc/61d74672e7a662a5366c
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
# 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
这个错误是因为同一个IP的zookeeper socket 连接数大于60了。zookeeper server默认限制每个IP最多60个连接。
这个在测试服务器上出现的,因为测试服务器上太多进程在跑了。。
修改为:
maxClientCnxns=150
http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_advancedConfiguration
当集群里的结点只剩下一台,或者不足半数时,就会出现这个错误提示。
通常在,只启动第一台zookeeper时会报这个错误。
在zookeeper server的日志里,会有类似的日志:
Exception causing close of session 0x0 due to java.io.IOException: ZooKeeperServer not running
发现线下环境迁移到新机器后,应用启动变得很慢,本来十几秒启动的应用,变成几分钟才能启动。
启动过程没有报错,只是Dubbo的注册信息日志一直在比较慢地刷。
开始怀疑是网络问题,但是检查了iptables没有开启,用iptraf查看流量,也不高。机器的空闲内存也足够。
再检查Zookeeper的配置,磁盘的空间,应用的dubbo配置,jvm配置,发现都没有问题。
没办法了,用jprofiler来测试下,发现“org.I0Itec.zkclient.ZkClient$1.call”,这个调用耗时比较大。
这样确认是zookeeper本身比较慢,不是应用的问题。
用下面的zookeeper benchmark工具测试了下性能,发现read速度还可能,create/write速度非常慢,qps只有个位数。
于是问了下运维的同事,原来新机器是用共享磁盘的,所以速度很慢。
而zookeeper每次write请求都要写到log日志,并刷到磁盘里,所以非常的慢。
后来运维的同事换为本地磁盘,一切恢复正常。
项目地址:https://github.com/alibaba/taokeeper
淘宝出品的一个监控工具,还有可以用脚本来监控的功能。虽然开源了,但是实际上很难用,代码也很难扩展,而且有些jar包是淘宝内部的。
我修改了下,可以正常使用,代码地址在:https://github.com/hengyunabc/taokeeper
但是我们线上也没有用这个,线上只有zabbix的监控。
安装配置参考:
这个是Netflix出品的一个监控工具,但实际上也很难用。。
Exhibitor的主要功能 监控本机的Zookeeper服务,可以自动重启挂掉的Zookeeper服务;https://github.com/brownsys/zookeeper-benchmark
这个工具输出结果比较乱,不过用起来还不错。
mvn -DZooKeeperVersion=3.4.5 package
./runBenchmark.sh test
然后在test文件夹下,会有生成的信息。主要在zk-benchmark.log这个文件里。
http://zookeeper.apache.org/doc/r3.4.5/zookeeperOver.html
http://wiki.apache.org/hadoop/ZooKeeper/ServiceLatencyOverview 自带的文档里有一点,不过貌似没更新过