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没有参与集群的选举工作。

 

posted @ 2023-05-31 12:13  小粉优化大师  阅读(388)  评论(0编辑  收藏  举报