zookeeper运维

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 尽管zookeeper在编程上有很多的阱陷,API也非常的难用,但zookeeper服务本身可以说是很牢靠的了,所以在网上貌似关于运维的文章比较少。

尽管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/

配置zookeeper开机启动

首先修改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用户。
如果是想配置Upstart方式的启动,可以参考:http://blog.csdn.net/hengyunabc/article/details/18967627


zookeeper VIRT虚拟内存占用过大的问题:

这个和zookeeper的实现有关,参考这里:http://zookeeper-user.578899.n2.nabble.com/setting-zookeeper-heap-size-td6983511.html

线上的zookeeper的VIRT有30多G,查看了data, dataLog,总共才几百M。不过一直没什么问题。

Unreasonable length的问题:

https://issues.apache.org/jira/browse/ZOOKEEPER-1513
目前线上用的是345版本,而zookeeper最后的release版本就是这个,有大概一年多没更新了。。
这个问题有可能是client尝试向zookeeper上放超过1M的数据时,出现的。
想修改这个默认配置,则可以修改"jute.maxbuffer"这个环境变量。参考:http://zookeeper.apache.org/doc/r3.3.3/zookeeperAdmin.html
但是我们线上是因为端口扫描工具造成的,这个就相当地诡异了。停止端口扫描工具之后,就没有这个问题了。

watches数量多的问题:

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

查找不能成功启动原因:

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日志,所以如果出错要注意先备份这个文件。

配置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就可以了:

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


还可以修改下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

http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_advancedConfiguration

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官方自带的管理员工具:

http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html    官方的命令行工具可以胜任绝大部分工作了。

zktop

https://github.com/phunt/zktop  python写的小工具,很有意思

taokeeper

项目地址:https://github.com/alibaba/taokeeper 
淘宝出品的一个监控工具,还有可以用脚本来监控的功能。虽然开源了,但是实际上很难用,代码也很难扩展,而且有些jar包是淘宝内部的。
我修改了下,可以正常使用,代码地址在:https://github.com/hengyunabc/taokeeper 
但是我们线上也没有用这个,线上只有zabbix的监控。
安装配置参考:

编译
1.下载这两个项目:
  git clone https://github.com/hengyunabc/common-toolkit.git
  git clone https://github.com/nileader/zkclient.git
  
  先分别执行 mvn -Dmaven.test.skip install
2.下载本项目:
  git clone https://github.com/hengyunabc/taokeeper.git
  执行  mvn -Dmaven.test.skip clean package
  到taokeeper-monitor/target/目录就可以看到生成的War包了。

部署
taokeeper使用mysql数据库来保存一些配置和日志。 
导入taokeeper-build/etc/taokeeper.sql 文件,也可以从这里下载:文件:Taokeeper.sql.zip 。 
配置tomcat启动参数,增加JVM启动参数: 
 JAVA_OPTS=-DconfigFilePath="~/taokeeper/taokeeper-monitor-config.properties"
并在上面的配置中配置好参数,例如: 
systemInfo.envName=TEST
#DBCP
dbcp.driverClassName=com.mysql.jdbc.Driver
dbcp.dbJDBCUrl=jdbc:mysql://localhost:3306/taokeeper
dbcp.characterEncoding=GBK
dbcp.username=root
dbcp.password=root
dbcp.maxActive=30
dbcp.maxIdle=10
dbcp.maxWait=10000
#SystemConstant
SystemConstent.dataStoreBasePath=~/taokeeper/
#SSH account of zk server
SystemConstant.userNameOfSSH=hello
SystemConstant.passwordOfSSH=hello
其中SSH用户密码要配置对,zookeeper部署的机器要开放SSH服务。 
把生成的War包改为ROOT.war,放到tomcat的webapps目录下,启动tomcat。 
如果报log4j错误,则还要配置webapps/ROOT/WEB-INF/classes/log4j.properties 文件。也可以在编绎前先修改好。 
打开 http://localhost:8080/ ,就可以看到taokeeper的界面了。 
工作原理
taokeeper通过SSH连接到zookeeper部署的机器上,再在上面执行zookeeper的Four Letter Words来得到统计信息,再分析保存到mysql数据库中。 
参考:http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html#sc_zkCommands 
监控目标机器的负载,也是通过SSH连接到目标机器,再执行top等命令,再分析得到数据。 

注意事项
在chrome浏览器下,“机器监控”这个功能有时会把信息显示下浏览器的下面,要拉到最后才能看到,并不是这个功能不能工作。 

Exhibitor

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

Exhibitor的主要功能 监控本机的Zookeeper服务,可以自动重启挂掉的Zookeeper服务;
 定期备份数据;
 定期清理Zookeeper日志;
 提供了一个Web界面可以修改Zookeeper的数据;
 REST API。
Exhibitor安装
Exhibitor提供了三种运行方式:独立的jar文件,War包,core jar。推荐用jar方式运行,配置管理都很方便。 
安装方法可以参考这里:https://github.com/Netflix/exhibitor/wiki/Building-Exhibitor,也可以从这里下载已经编绎好的jar文件:文件:Exhibitor-war-1.0-jar-with-dependencies.zip,下载后要修改后缀为jar。 
运行
 java -jar <path>/exhibitor-xxx.jar -c file
Exhibitor自动创建配置文件,在web界面所做的配置更改都会保存到exhibitor.properties中。 
配置项
参考:https://github.com/Netflix/exhibitor/wiki/Configuration-UI 
在配置“Servers”参数时,一定要注意要配置的是hostname,而不是IP。所以如果配置的是IP的话,一定要到目标机器上去检查hostname和IP是否一致。 
注意事项 
Exhibitor通过jps命令来判断Zookeeper服务是否运行,所以要配置好jps命令,如果没有当前没有jps命令的话,可以通过类似如下的命令创建一个软链接:
 ls -s /home/www/jdk/jdk1.7.0_15/bin/jps /usr/bin/jps

 Exhibitor会自动创建并覆盖zookeeper的配置文件,所以要在Web界面上把Zookeeper的所有参数都配置,
 否则如果Zookeeper被Exhibitor重启后,可以会出现因为配置有错误而无法启动的状况。

 在“control panel”面板中,当显示绿色,则说明Zookeeper服务正常,可以对外服务,当显示黄色或者红色,
 则Zookeeper不能对外提供服务(这个和Zookeeper进程是否存在,是两个概念,即使Zookeeper进程存在,也可能无法对外提供服务)。

 Exhibitor会定时探测Zookeeper服务是否正常,但是时间间隔默认配置为0,这个会导致机器CPU被消耗。要在Web界面中配置好“Live Check (ms)”参数。

 因为Exhibitor如果探测到Zookeeper服务没有启动,会自动启动Zookeeper进程,所以在升级Zookeeper之前,要先停掉Exhibitor。

其它的一些东东:

性能测试相关:

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 自带的文档里有一点,不过貌似没更新过
http://wiki.apache.org/hadoop/ZooKeeper/ServiceLatencyOverview   Hadoop里带的一个测试
https://ramcloud.stanford.edu/wiki/display/ramcloud/ZooKeeper+Performance 
http://rdc.taobao.com/team/jm/archives/1070  淘宝的一个测试


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
4月前
|
运维 数据库
zookeeper运维常用指令
zookeeper运维常用指令
|
运维 监控 网络协议
Apache ZooKeeper - FourLetterCommands运维命令
Apache ZooKeeper - FourLetterCommands运维命令
194 0
|
存储 运维 Java
Apache ZooKeeper - 高可用ZK集群模式搭建与运维
Apache ZooKeeper - 高可用ZK集群模式搭建与运维
270 0
|
运维 监控 Kubernetes
Zookeeper 3.6.x 极致运维
一开始让我运维 Zookeeper 是拒绝的,这东西我没搞过啊,只是一直以来都知道个大概大概而已还从来没使用过;好了,经过一段时间看官网文档和尝试,我只能说“就那样~”。本文没有参杂过多别人的博客知识,就多看几眼 zk 官方文档,与 k8s 的官方文档中 zk 教程:运行 ZooKeeper,一个分布式协调系统;然后升级了 start-zookeeper.sh 配置 zk 高版本,编写 zooke
535 0
|
运维 数据可视化
ZooKeeper运维之使用SnapshotFormatter可视化快照数据
在ZooKeeper的运维过程中,我们经常会碰到这样的问题,就是快照数据文件越来越大,但是ZooKeeper上的数据节点数量并没有相应的增加。 这说明什么问题:一定是有客户端在将ZooKeeper当数据库使用了。长此以往,必然会引起ZooKeeper内存数据过大而影响性能及集群间的数据同步。 那
3172 9
|
2月前
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
59 4
|
17天前
|
机器学习/深度学习 数据采集 人工智能
智能运维:从自动化到AIOps的演进与实践####
本文探讨了智能运维(AIOps)的兴起背景、核心组件及其在现代IT运维中的应用。通过对比传统运维模式,阐述了AIOps如何利用机器学习、大数据分析等技术,实现故障预测、根因分析、自动化修复等功能,从而提升系统稳定性和运维效率。文章还深入分析了实施AIOps面临的挑战与解决方案,并展望了其未来发展趋势。 ####
|
26天前
|
机器学习/深度学习 数据采集 运维
智能化运维:机器学习在故障预测和自动化响应中的应用
智能化运维:机器学习在故障预测和自动化响应中的应用
51 4
|
2月前
|
存储 运维 监控
高效运维:从基础架构到自动化管理的全面指南
【10月更文挑战第11天】 本文将深入探讨如何通过优化基础架构和引入自动化管理来提升企业IT运维效率。我们将从服务器的选择与配置、存储解决方案的评估,到网络的设计与监控,逐一解析每个环节的关键技术点。同时,重点讨论自动化工具在现代运维中的应用,包括配置管理、持续集成与部署(CI/CD)、自动化测试及故障排除等方面。通过实际案例分析,展示这些技术如何协同工作,实现高效的运维管理。无论是IT初学者还是经验丰富的专业人员,都能从中获得有价值的见解和实操经验。
78 1