ZooKeeper-管理技巧:监控状态、文件隔离、日志滚动、日志清理、节点扩展
1、状态监控
1.1、监控指标
在Zookeeper服务端的操作中,有一个命令非常有用就是mntr,可以查看节点服务的所有运行时信息,这些信息就是我们平常要监控到的内容。
1.2、命令示例
# echo mntr | nc 127.0.0.1 2281 zk_version 3.7.1-a2fb57c55f8e59cdd76c34b357ad5181df1258d5, built on 2022-05-07 06:45 UTC zk_server_state follower zk_peer_state following - broadcast zk_ephemerals_count 0 zk_num_alive_connections 1 zk_avg_latency 0.0 zk_outstanding_requests 0 zk_znode_count 5 zk_global_sessions 0 zk_non_mtls_remote_conn_count 0 zk_last_client_response_size -1 zk_packets_sent 0 zk_packets_received 1 zk_max_client_response_size -1 zk_connection_drop_probability 0.0 zk_watch_count 0 ...
1.3、指标分类
1.3.1、网络响应延迟信息
zk_avg_latency、zk_max_latency、zk_min_latency
1.3.2、网络请求(数据包和连接状态数量)
数据包相关:zk_packets_received、zk_packets_sent
连接状态相关:zk_num_alive_connections(活跃连接)、zk_outstanding_requests
1.3.3、节点数量信息
zk_znode_count、zk_watch_count、zk_ephemerals_count(临时节点数)
1.3.4、服务状态
zk_server_state、zk_open_file_descriptor_count、zk_max_file_descriptor_count
1.3.5、Leader特有
zk_followers、zk_synced_followers(同步数量)、zk_pending_syncs(阻塞数量)
2、常见优化
2.1、文件隔离
生产中Zookeeper的dataDir 和 dataLogDir 应该分开部署,因为事务日志非常重要而且内容比较多,所以在配置的时候,dataLogDir所在的目录,要保证目录空间足够大,并挂载到单独的磁盘上,如果可以的话,
磁盘应该开启实时刷新功能
2.2、日志滚动
默认情况下,一般日志是放在一个文件中,为了更好的查看日志效果,我们一般会将日志进行切割,接下来我们配置一下日志的切割功能。 Zookeeper的默认日志切割配置文件是 项目目录的conf/log4j.properties,和切割配置主要相关的是: log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender 如果想按天进行日志切割的话,可以修改为 DaliyRollingFileAppender Zookeeper使用日志切割功能 # vim /data/server/zk1/bin/zkServer.sh ... 30 # 增加 ZOO_LOG_DIR 配置 31 ZOO_LOG_DIR="$ZOOBINDIR/../log4j" ... # vim /data/server/zk1/bin/zkEnv.sh 59 if [ "x${ZOO_LOG4J_PROP}" = "x" ] 60 then 61 ZOO_LOG4J_PROP="INFO,ROLLINGFILE" # 注意:原CONSOLE 修改为 ROLLINGFILE 62 fi
2.3、日志清理
自动清理:自从Zookeeper 3.4.0版本之后,配置文件中多了两个和日志自动清理相关的配置 autopurge.purgeInterval:指定清理频率,单位为小时(默认是0,表示不开启自动清理) autopurge.snapRetainCount:和purgeInterval配合使用,指定需要保留的文件数目 注意: Zookeeper 重启会自动清除 zookeeper-root-server-python-auto.out 日志,如果有排错需要,则应先备份好日志文件 配置效果: # vim /data/server/zk1/conf/zoo.cfg ... autopurge.purgeInterval=1 autopurge.snapRetainCount=3 手工清理: 如果发现单事务日志量过大,导致定时清理无法及时处理,我们可以基于自定义脚本或者 zookeeper提供的 zkCleanup.sh 进行 结合 定时任务来实现自动清理的任务 #!/bin/bash # 定制日志目录 zookeeperDir='/data/server/zookeeper' dataDir="$zookeeperDir/data/version-2" dataLogDir=$zookeeperDir/logs/version-2 # 保留文件60 count=60 count=$[$count+1] # 从61行开始删除 ls -t $dataLogDir/log.* | tail -n +$count | xargs rm -f ls -t $dataDir/snapshot.* | tail -n +$count | xargs rm -f 注意: ls -t 是顺序排列, tail -n +5 是从第 5 个至最新文件
2.4、节点扩展
在Zookeeper集群中有一个角色是observer,它主要的作用仅仅是增加额外的接收客户端请求的扩展节点,将接收到的请求,转交给Leader处理,不会影响集群的其他任何操作。 # 我们只需要在Observe节点的zoo.cfg配置文件中添加如下配置即可 peerType=observer server.n:localhost:2181:3181:observer 修改配置文件 # Zk1节点: vim /data/server/zk1/conf/zoo.cfg # 修改如下配置 server.3=192.168.8.14:2382:2383:observer # Zk2节点: vim /data/server/zk2/conf/zoo.cfg # 修改如下配置 server.3=192.168.8.14:2382:2383:observer # Zk3节点: vim /data/server/zk3/conf/zoo.cfg # 增加如下配置 peerType=observer # 修改如下配置 server.3=192.168.8.14:2382:2383:observer # 重启相关服务 /data/server/zk1/bin/zkServer.sh restart /data/server/zk2/bin/zkServer.sh restart /data/server/zk3/bin/zkServer.sh restart # 再次查看集群状态 /data/server/zk3/bin/zkServer.sh status /data/server/zk2/bin/zkServer.sh status /data/server/zk1/bin/zkServer.sh status 可以看到: zk3的集群角色就变成了观察者 # 验证observer是否参与选举 /data/server/zk2/bin/zkServer.sh stop # 查看集群状态 /data/server/zk1/bin/zkServer.sh status 可以看到:集群节点有三个,zk3是观察者,真正提供服务的是两个,我们关闭了一个,集群服务就崩溃了,所以observer没有参与集群的选举工作。