zookeeper运维管理详解( 三 )


#find /home/yinshi.nc/taokeeper/zk_logs/version-2 -name "log*" -mtime +1 | xargs rm -f
#find /home/yinshi.nc/taokeeper/logs/ -name "zookeeper.log.*" -mtime +1 | xargs rm –f
其实,仅管ZK没有自动帮我们清理历史文件,但是它的还是提供了一个叫PurgeTxnLog的 工具类,实现了一种简单的历史文件清理策略,可以在这里看一下他的使用方法:http://zookeeper.apache.org/doc/r3.4.3/api/index.html 简单使用如下:
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>
最后一个参数表示希望保留的历史文件个数,注意,count必须是大于3的整数 。可以把这句命令写成一个定时任务,以便每天定时执行清理 。
注意: 从3.4.0版本开始,zookeeper提供了自己清理历史文件的功能了,相关的配置参数是autopurge.snapRetainCount和autopurge.purgeInterval,在本文后面会具体说明 。更多关于zookeeper的日志清理,可以阅读这个文章《https://blog.51cto.com/nileader/932156》 。
2.2.2 ZK程序日志
这里说两点,ZK默认是没有向ROLLINGFILE文件输出程序运行时日志的,需要我们自己在conf/log4j.properties中配置日志路径 。另外,没有特殊要求的话,日志级别设置为INFO或以上,我曾经测试过,日志级别设置为DEBUG的话,性能影响很大!
2.3 Server的自检恢复
ZK运行过程中,如果出现一些无法处理的异常,会直接退出进程,也就是所谓的快速失败(fail fast)模式 。在上文中有提到,"过半存活即可用"的特性使得集群中少数机器down掉后,整个集群还是可以对外正常提供服务的 。另外,这些down掉的机器重启之后,能够自动加入到集群中,并且自动和集群中其它机器进行状态同步(主要就是从Leader那里同步最新的数据),从而达到自我恢复的目的 。
因此,我们很容易就可以想到,是否可以借助一些工具来自动完成机器的状态检测与重启工作 。回答是肯定的,这里推荐两个工具: Daemontools(http://cr.yp.to/daemontools.html) 和 SMF(http://en.wikipedia.org/wiki/Service_Management_Facility),能够帮助你监控ZK进程,一旦进程退出后,能够自动重启进程,从而使down掉的机器能够重新加入到集群中去~
2.4 监控
有几种方法:
【zookeeper运维管理详解】1、 ZK提供一些简单但是功能强大的4字命令,通过对这些4字命令的返回内容进行解析,可以获取不少关于ZK运行时的信息 。
2、用jmx也能够获取一些运行时信息,详细可以查看这里:http://zookeeper.apache.org/doc/r3.4.3/zookeeperJMX.html
3、我的老东家阿里巴巴已经实现的一个ZooKeeper监控——TaoKeeper,已开源,在这里:https://github.com/alibaba/taokeeper
,主要功能如下:
A、机器CPU/MEM/LOAD的监控
B、ZK日志目录所在磁盘空间监控
C、单机连接数的峰值报警
D、单机Watcher数的峰值报警
E、节点自检
F、ZK运行时信息展示
2.5 日志管理
ZK使用log4j作为日志系统,conf目录中有一份默认的log4j配置文件,注意,这个配置文件中还没有开启ROLLINGFILE文件输出,配置下即可 。其它关于log4j的详细介绍,可以移步到log4j的官网:http://logging.apache.org/log4j/1.2/manual.html#defaultInit
2.6加载数据出错
ZK在启动的过程中,首先会根据事务日志中的事务日志记录,从本地磁盘加载最后一次提交时候的快照数据,如果读取事务日志出错或是其它问题(通常在日志中可以看到一些IO异常),将导致server将无法启动 。碰到类似于这种数据文件出错导致无法启动服务器的情况,一般按照如下顺序来恢复:
1、确认集群中其它机器是否正常工作,方法是使用"stat"这个命令来检查:echo stat|nc ip 2181
2、如果确认其它机器是正常工作的(这里要说明下,所谓正常工作还是指集群中有过半机器可用),那么可以开始删除本机的一些数据了,删除$dataDir/version-2和$dataLogDir/version-2 两个目录下的所有文件 。
重启server 。重启之后,这个机器就会从Leader那里同步到最新数据,然后重新加入到集群中提供服务 。
2.7 配置参数详解(主要是%ZOOKEEPER_HOME%/conf/zoo.cfg文件)
参数名
说明
clientPort # 客户端连接server的端口,即对外服务端口,一般设置为2181吧 。
dataDir # 存储快照文件snapshot的目录 。默认情况下,事务日志也会存储在这里 。建议同时配置参数dataLogDir, 事务日志的写性能直接影响zk性能 。


推荐阅读