ZooKeeper 是一个分布式应用协调服务,分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
zookeeper组件只有一个服务名字Server,安装在多个节点组成集群使用(一般建议3或5个),zookeeper是一个java进程,使用jps命令可以快速找出zk的进程id。一般名为QuorumPeerMain。如果主机跑了多个zk,这里也会显示多个QuorumPeerMain(但官方建议最好不要出现跑多个zk实例合用一个磁盘的情况,容易出现IO问题)


使用ps -ef命令或find查看当前服务器中存在的zk实例节点目录,再通过dir/logs中最后一条log的最近时间来判断此zk是不是当前正在运行的。最后通过查看conf/zoo.cfg的配置信息,查看此zk集群的规模(几个节点)、客户端端口等信息来判断出问题的是否是此zk集群。
在zookeeper默认配置文件zoo.cfg(可以修改文件名)中有一个配置项dataDir,该配置项用于配置zookeeper快照日志和事务日志的存储地址。在官方提供的默认参考配置文件zoo_sample.cfg中,只有dataDir配置项。其实在实际应用中,还可以为事务日志专门配置存储地址,配置项名称为dataLogDir,在zoo_sample.cfg中并未体现出来。在没有dataLogDir配置项的时候,zookeeper默认将事务日志文件和快照日志文件都存储在dataDir对应的目录下。建议将事务日志(dataLogDir)与快照日志(dataLog)单独配置,因为当zookeeper集群进行频繁的数据读写操作,会产生大量的事务日志信息,将两类日志分开存储会提高系统性能,而且,可以允许将两类日志存在在不同的存储介质上,减少磁盘压力。log4j用于记录zookeeper集群服务器运行日志,该日志的配置地址在conf/目录下的log4j.properties文件中,该文件中有一个配置项为“zookeeper.log.dir=.错误! 超链接引用无效。” 时,在该文件夹下会产生zookeeper.out日志文件。下面主要介绍事务日志与快照日志。
事务日志:
zookeeper的数据在内存中是以树形结构进行存储的,而快照就是每隔一段时间就会把整个DataTree的数据序列化后存储在磁盘中,这就是zookeeper的快照文件。
zookeeper快照日志的存储路径同样可以在zoo.cfg中查看,如上文截图所示。访问dataDir路径可以看到version-2文件夹:
从截图中可以看出,zookeeper快照文件的命名规则为snapshot.**,其中**表示zookeeper触发快照的那个瞬间,提交的最后一个事务的ID。
log4j日志,服务的运行日志。

Clientport:客户端连接端口Ticktime:心跳时间(zk时间的基本单位,单位毫秒)initLimit:zk启动的初始化时间,本例10表示10*Ticktime=4000毫秒syncLimit:zk进行sync同步的时间maxClientCnxns:最大客户端连接数,0表示无显示(此参数值为IP级别,默认60)dataDir:zk快照数据目录dataLogDir:zk操作记录数据目录Autopurge.* :表示快照及日志的保留策略,本例24小时和500个。snapCount:表示进行多少次update操作,进行一次快照,默认是100000
服务操作命令:
一旦确认集群服务异常,就使用bin/zkServer.sh stop先在所有节点运行停止zk集群服务(如果leader运行正常,只重启单个异常服务即可);
启动完成后,使用bin/zkServer.sh status查看是否角色是否正常(一个leader,多个follower)
zkCli.sh命令
使用bin/zkCli.sh命令可以进入到zk-shell内部进行操作,直接操作zk的文件系统。
注意如果zk进行了acl配置,直接zkCli.sh可能会进入失败,此时需使用zkCli.sh -server IP:port 命令进入,ip:port为zk的服务地址和端口;
zk-shell内部命令十分有限,合起来不到50个,常用的有
create 创建znode
delete 删除节点
connect 连接其他zk节点
addauth 添加认证,通常添加用户密码认证用这个
setAcl 添加acl认证,通常添加ip白名单等
getAcl 查看路径的权限情况
get 查看zk路径中的具体值
zk的监控主要采用自带四字命令实现,运行方法有多种,基础方法是
echo 【四字命令】 |nc IP:port,如 echo mntr |nc localhost 2181

因服务器系统不同,有些可能没有nc命令,可尝试使用nc6、netcat等替换nc命令也可以。如以上命令都没有又想查看,可直接使用telnet IP:port,然后在等待命令处直接输入四字命令:(如下图srvr即为我们输入的四字命令)

常用四字命令有mntr、srvr、conf、cons、envi等,具体会根据zk版本不同有增减,新版支持的命令会更多。
监控常使用mntr,运行结果可监控以下字段:
zk_outstanding_requests指标(即zk连接排队情况)使用监控工具监控文件中的值如果 >10则报警num_alive_connections存储zk_num_alive_connections指标(即当前节点活动的连接数),使用监控工具监控此文件中值如果>1500则报警
max_latency存储当前所有连接中的延迟最大的连接指标,当延迟毫秒数超过10个ticktime=20000时,进行报警
具体的监控指标及方法一定是经过业务的调试和反复测试后才能发挥应有的效果的。


更多精彩干货分享
点击下方名片关注
IT那活儿





