zk日常运维管理

sea-boat 2016-10-18

性能 日志 LOG Apache path 配置 集群 Server test 磁盘 SUN zookeeper

清理数据目录

dataDir目录指定了ZK的数据目录,用于存储ZK的快照文件(snapshot)。另外,默认情况下,ZK的事务日志也会存储在这个目录中。在完成若干次事务日志之后(在ZK中,凡是对数据有更新的操作,比如创建节点,删除节点或是对节点数据内容进行更新等,都会记录事务日志),ZK会触发一次快照(snapshot),将当前server上所有节点的状态以快照文件的形式dump到磁盘上去,即snapshot文件。这里的若干次事务日志是可以配置的,默认是100000,具体参看下文中关于配置参数“snapCount”的介绍。
正常运行过程中,ZK会不断地把快照数据和事务日志输出到这两个目录,并且如果没有人为操作的话,ZK自己是不会清理这些文件的,需要管理员来清理,这里介绍4种清理日志的方法。在这4种方法中,推荐使用第一种方法

第一种,也是运维人员最常用的,写一个删除日志脚本,每天定时执行即可:


#!/bin/bash

#snapshot file dir

dataDir=/home/nileader/taokeeper/zk_data/version-2

#tran log dir

dataLogDir=/home/nileader/taokeeper/zk_log/version-2

#zk log dir

logDir=/home/nileader/taokeeper/logs

#Leave 60 files

count=60

count=$[$count+1]

ls -t $dataLogDir/log.* | tail -n +$count | xargs rm -f

ls -t $dataDir/snapshot.* | tail -n +$count | xargs rm -f

ls -t $logDir/zookeeper.log.* | tail -n +$count | xargs rm -f

以上这个脚本定义了删除对应两个目录中的文件,保留最新的60个文件,可以将他写到crontab中,设置为每天凌晨2点执行一次就可以了。**

第二种,使用ZK的工具类PurgeTxnLog,它的实现了一种简单的历史文件清理策略,可以在这里看一下他的使用方法:http://zookeeper.apache.org/doc/r3.4.3/api/index.html,可以指定要清理的目录和需要保留的文件数目,简单使用如下:

1.java -cp zookeeper.jar:lib/slf4j-api-1.6.1.jar:lib/slf4j-log4j12-1.6.1.jar:lib/log4j-1.2.15.jar:conf org.apache.zookeeper.server.PurgeTxnLog <dataDir><snapDir> -n <count>

第三种,对于上面这个Java类的执行,ZK自己已经写好了脚本,在bin/zkCleanup.sh中,所以直接使用这个脚本也是可以执行清理工作的。

第四种,从3.4.0开始,zookeeper提供了自动清理snapshot和事务日志的功能,通过配置 autopurge.snapRetainCount 和 autopurge.purgeInterval 这两个参数能够实现定时清理了。这两个参数都是在zoo.cfg中配置的:

autopurge.purgeInterval 这个参数指定了清理频率,单位是小时,需要填写一个1或更大的整数,默认是0,表示不开启自己清理功能。

autopurge.snapRetainCount 这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。

日志输出到指定文件夹

ZK默认是没有向ROLLINGFILE文件输出程序运行时日志的,需要我们自己在conf/log4j.properties中配置日志路径。另外,没有特殊要求的话,日志级别设置为INFO或以上,我曾经测试过,日志级别设置为DEBUG的话,性能影响很大!
具体操作请看:http://www.tuicool.com/articles/MbUb63n

监控

1、 ZK提供一些简单但是功能强大的4字命令,通过对这些4字命令的返回内容进行解析,可以获取不少关于ZK运行时的信息。

常用的四字命令

conf:
输出server的详细配置信息。

echo conf|nc localhost 2181 

clientPort=2181 
dataDir=/home/test/taokeeper/zk_data/version-2 
dataLogDir=/test/admin/taokeeper/zk_log/version-2 
tickTime=2000 
maxClientCnxns=1000 
minSessionTimeout=4000 
maxSessionTimeout=40000 
serverId=2 
initLimit=10 
syncLimit=5 
electionAlg=3 
electionPort=3888 
quorumPort=2888 
peerType=0

cons:
输出指定server上所有客户端连接的详细信息,包括客户端IP,会话ID等。 New in 3.3.0类似于这样的信息:

echo cons|nc localhost 2181 
/1.2.3.4:43527[1](queued=0,recved=152802,sent=152806,sid=0x2389e662b98c424,lop=PING,est=1350385542196,to=6000,lcxid=0×114,lzxid=0xffffffffffffffff,lresp=1350690663308,llat=0,minlat=0,avglat=0,maxlat=483)
……

crst:
功能性命令。重置所有连接的统计信息。New in 3.3.0

dump:
这个命令针对Leader执行,用于输出所有等待队列中的会话和临时节点的信息。

envi:
用于输出server的环境变量。包括操作系统环境和Java环境。

ruok:
用于测试server是否处于无错状态。如果正常,则返回“imok”,否则没有任何响应。 注意:ruok不是一个特别有用的命令,它不能反映一个server是否处于正常工作。“stat”命令更靠谱。

stat
输出server简要状态和连接的客户端信息。

srvr
和stat类似,New in 3.3.0

echo stat|nc localhost 2181 

Zookeeper version: 3.3.5-1301095, built on 03/15/2012 19:48 GMT 
Clients: 
/10.2.3.4:59179[1](queued=0,recved=44845,sent=44845) 

Latency min/avg/max: 0/0/1036 
Received: 2274602238 
Sent: 2277795620 
Outstanding: 0 
Zxid: 0xa1b3503dd 
Mode: leader 
Node count: 37473

echo srvr|nc localhost 2181 

Zookeeper version: 3.3.5-1301095, built on 03/15/2012 19:48 GMT 
Latency min/avg/max: 0/0/980 
Received: 2592698547 
Sent: 2597713974 
Outstanding: 0 
Zxid: 0xa1b356b5b 
Mode: follower 
Node count: 37473

srst:
重置server的统计信息。

wchs:
列出所有watcher信息概要信息,数量等

wchc:
出所有watcher信息,以watcher的session为归组单元排列

echo wchc|nc localhost 2181 

0x2389e662b97917f 
/mytest/test/path1/node1 
0x3389e65c83cd790 
/mytest/test/path1/node2 
0x1389e65c7ef6313 
/mytest/test/path1/node3 
/mytest/test/path1/node1

wchp
列出所有watcher信息,以watcher的path为归组单元排列

echo wchp|nc localhost 2181 

/mytest/test/path1/node 
0x1389e65c7eea4f5 
0x1389e65c7ee2f68 
/mytest/test/path1/node2 
0x2389e662b967c29 
/mytest/test/path1/node3 
0x3389e65c83dd2e0 
0x1389e65c7f0c37c 
0x1389e65c7f0c364 

注意,wchc和wchp这两个命令执行的输出结果都是针对session的,对于运维人员来说可视化效果并不理想,可以尝试将cons命令执行输出的信息整合起来,就可以用客户端IP来代替会话ID了,具体可以看这个实现:http://rdc.taobao.com/team/jm/archives/1450

mntr:
输出一些ZK运行时信息,通过对这些返回结果的解析,可以达到监控的效果。

$ echo mntr | nc localhost 2185 
zk_version 3.4.0 
zk_avg_latency 0 
zk_max_latency 0 
zk_min_latency 0 
zk_packets_received 70 
zk_packets_sent 69 
zk_outstanding_requests 0 
zk_server_state leader 
zk_znode_count 4 
zk_watch_count 0 
zk_ephemerals_count 0 
zk_approximate_data_size 27 
zk_followers 4 – only exposed by the Leader 
zk_synced_followers 4 – only exposed by the Leader 
zk_pending_syncs 0 – only exposed by the Leader 
zk_open_file_descriptor_count 23 – only available on Unix platforms 
zk_max_file_descriptor_count 1024 – only available on Unix platforms

JMX方式

用jmx也能够获取一些运行时信息,详细可以查看这里:http://zookeeper.apache.org/doc/r3.4.3/zookeeperJMX.html
**第一种方式 :参数配置:java.env
**

$ cd $ZK_HOME/conf
$ vi java.env
JVMFLAGS=" -Djava.rmi.server.hostname=192.168.56.112 -Dcom.sun.management.jmxremote.port=8988 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xms512m -Xmx512m $JVMFLAGS"
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
ZOO_LOG_DIR="/var/log/zookeeper/"

**第二种方式:打开%ZK_HOME%/bin目录下的zkServer.sh文件.找到如下配置
**

找到zkServer.sh文件
ZOOMAIN="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=$JMXLOCALONLY org.apache.zookeeper.server.quorum.QuorumPeerMain"

在这个配置中并没有打开远程连接jmx的端口命令,通常需要再加上以下三个配置才能开启远程jmx
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8988
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
````

当配置 JMX 后,可以使用 jconsole 工具连接监控 zookeeper





<div class="se-preview-section-delimiter"></div>

###工具监控
1. 查看内存中的节点信息:ZooInspector
2. 查看并修改节点信息:node-zk-brower
3. 性能监控的工具 zookeeper-benchmark,zk-smoketest





<div class="se-preview-section-delimiter"></div>

###查看快照文件及事务日志文件




<div class="se-preview-section-delimiter"></div>

$ java -cp zookeeper-3.4.6.jar:lib/log4j-1.2.16.jar:lib/slf4j-log4j12-1.6.1.jar:lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.LogFormatter ./datalog/version-2/log.30060aab4

$ java -cp zookeeper-3.4.6.jar:lib/log4j-1.2.16.jar:lib/slf4j-log4j12-1.6.1.jar:lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.SnapshotFormatter ./data/version-2/snapshot.300629b34
“`

加载数据出错

ZK在启动的过程中,首先会根据事务日志中的事务日志记录,从本地磁盘加载最后一次提交时候的快照数据,如果读取事务日志出错或是其它问题(通常在日志中可以看到一些IO异常),将导致server将无法启动。碰到类似于这种数据文件出错导致无法启动服务器的情况,一般按照如下顺序来恢复:
1、确认集群中其它机器是否正常工作,方法是使用“stat”这个命令来检查:echo stat|nc ip 2181
2、如果确认其它机器是正常工作的(这里要说明下,所谓正常工作还是指集群中有过半机器可用),那么可以开始删除本机的一些数据了,删除dataDir/version2dataLogDir/version-2 两个目录下的所有文件。
重启server。重启之后,这个机器就会从Leader那里同步到最新数据,然后重新加入到集群中提供服务。

注意事项

1 保持Server地址列表一致
A、客户端使用的server地址列表必须和集群所有server的地址列表一致。(如果客户端配置了集群机器列表的子集的话,也是没有问题的,只是少了客户端的容灾。)
B、集群中每个server的zoo.cfg中配置机器列表必须一致。
2 独立的事务日志输出
对于每个更新操作,ZK都会在确保事务日志已经落盘后,才会返回客户端响应。因此事务日志的输出性能在很大程度上影响ZK的整体吞吐性能。强烈建议是给事务日志的输出分配一个单独的磁盘。
3 配置合理的JVM堆大小
确保设置一个合理的JVM堆大小,如果设置太大,会让内存与磁盘进行交换,这将使ZK的性能大打折扣。例如一个4G内存的机器的,如果你把JVM的堆大小设置为4G或更大,那么会使频繁发生内存与磁盘空间的交换,通常设置成3G就可以了。当然,为了获得一个最好的堆大小值,在特定的使用场景下进行一些压力测试。

注意事项

1 保持Server地址列表一致
A、客户端使用的server地址列表必须和集群所有server的地址列表一致。(如果客户端配置了集群机器列表的子集的话,也是没有问题的,只是少了客户端的容灾。)
B、集群中每个server的zoo.cfg中配置机器列表必须一致。
2 独立的事务日志输出
对于每个更新操作,ZK都会在确保事务日志已经落盘后,才会返回客户端响应。因此事务日志的输出性能在很大程度上影响ZK的整体吞吐性能。强烈建议是给事务日志的输出分配一个单独的磁盘。
3 配置合理的JVM堆大小
确保设置一个合理的JVM堆大小,如果设置太大,会让内存与磁盘进行交换,这将使ZK的性能大打折扣。例如一个4G内存的机器的,如果你把JVM的堆大小设置为4G或更大,那么会使频繁发生内存与磁盘空间的交换,通常设置成3G就可以了。当然,为了获得一个最好的堆大小值,在特定的使用场景下进行一些压力测试。

========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================

登录 后评论
下一篇
我是小助手
30399人浏览
2019-07-31
相关推荐
zookeeper 部署、配置、运维
331人浏览
2018-12-08 15:54:00
ZooKeeper权限控制
860人浏览
2017-05-02 15:42:00
ETCD系列之一:简介
63556人浏览
2016-03-27 16:41:08
zookeeper的虚拟文件系统
490人浏览
2017-11-15 16:09:00
zookeeper 运维经验
346人浏览
2018-12-08 15:59:00
Jstorm运维经验
280人浏览
2019-07-17 00:45:41
0
0
0
601