乐闻世界logo
搜索文章和话题

如何进行 Zookeeper 的运维和监控?有哪些关键指标和告警规则?

2月21日 16:24

答案

Zookeeper 的运维和监控是保证集群稳定运行的关键,需要建立完善的监控体系和运维流程。

1. 部署架构

生产环境推荐架构

  • 5 节点集群(1 Leader + 4 Follower)
  • 跨可用区部署
  • 独立磁盘存储事务日志
  • 负载均衡器分发客户端连接

部署检查清单

bash
# 1. 检查 Java 版本 java -version # 建议 JDK 8 或 11 # 2. 检查网络连通性 ping <other-nodes> # 3. 检查防火墙 telnet <node> 2181 # 4. 检查磁盘空间 df -h # 5. 检查系统资源 free -h top

2. 配置管理

核心配置参数

properties
# 基础配置 tickTime=2000 initLimit=10 syncLimit=5 dataDir=/data/zookeeper/data dataLogDir=/data/zookeeper/logs # 集群配置 server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888 server.4=zk4:2888:3888 server.5=zk5:2888:3888 # 性能配置 maxClientCnxns=100 preAllocSize=65536 snapCount=100000 # 自动清理 autopurge.snapRetainCount=3 autopurge.purgeInterval=1 # JVM 配置 # 在启动脚本中设置

配置最佳实践

  • 统一配置管理
  • 版本控制配置文件
  • 配置变更审核
  • 灰度发布配置

3. 启动和停止

启动集群

bash
# 启动单个节点 zkServer.sh start # 启动所有节点 for node in zk1 zk2 zk3 zk4 zk5; do ssh $node "zkServer.sh start" done # 检查启动状态 zkServer.sh status

停止集群

bash
# 停止单个节点 zkServer.sh stop # 停止所有节点 for node in zk1 zk2 zk3 zk4 zk5; do ssh $node "zkServer.sh stop" done # 检查停止状态 jps | grep QuorumPeerMain

滚动重启

bash
# 1. 重启 Follower 节点 # 2. 等待集群恢复 # 3. 重启 Leader 节点 # 4. 验证集群状态

4. 监控指标

关键监控指标

1. 集群状态指标

bash
# 查看集群模式 echo stat | nc localhost 2181 # Mode: leader / follower / observer # 查看 Zxid echo stat | nc localhost 2181 # Zxid: 0x1000000002

2. 性能指标

bash
# 查看延迟 echo mntr | nc localhost 2181 | grep latency # zk_avg_latency 0.5 # zk_max_latency 10.2 # 查看吞吐量 echo mntr | nc localhost 2181 | grep packets # zk_packets_received 1000000 # zk_packets_sent 1000000

3. 连接指标

bash
# 查看连接数 echo cons | nc localhost 2181 | wc -l # 查看连接详情 echo cons | nc localhost 2181

4. Watcher 指标

bash
# 查看 Watcher 数量 echo wchs | nc localhost 2181 # 100 connections watching 200 paths # 查看 Watcher 详情 echo wchp | nc localhost 2181

5. 节点指标

bash
# 查看节点统计 echo dump | nc localhost 2181 # 查看节点数量 echo stat | nc localhost 2181 | grep -E "Node count"

5. 告警配置

告警规则

1. 延迟告警

yaml
# 告警阈值 - alert: ZookeeperHighLatency expr: zookeeper_avg_latency > 10 for: 5m labels: severity: warning annotations: summary: "Zookeeper high latency detected"

2. 连接数告警

yaml
- alert: ZookeeperHighConnections expr: zookeeper_num_alive_connections > 1000 for: 5m labels: severity: warning annotations: summary: "Zookeeper high connections detected"

3. 内存告警

yaml
- alert: ZookeeperHighMemory expr: jvm_memory_used_bytes / jvm_memory_max_bytes > 0.8 for: 5m labels: severity: critical annotations: summary: "Zookeeper high memory usage detected"

4. 节点离线告警

yaml
- alert: ZookeeperNodeDown expr: up{job="zookeeper"} == 0 for: 1m labels: severity: critical annotations: summary: "Zookeeper node is down"

6. 日志管理

日志配置

properties
# log4j.properties log4j.rootLogger=INFO, ROLLINGFILE log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLINGFILE.File=/data/zookeeper/logs/zookeeper.log log4j.appender.ROLLINGFILE.MaxFileSize=100MB log4j.appender.ROLLINGFILE.MaxBackupIndex=10 log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c{2} - %m%n

日志分析

bash
# 查看错误日志 grep ERROR /data/zookeeper/logs/zookeeper.log # 查看警告日志 grep WARN /data/zookeeper/logs/zookeeper.log # 统计错误数量 grep -c ERROR /data/zookeeper/logs/zookeeper.log # 实时监控日志 tail -f /data/zookeeper/logs/zookeeper.log

7. 备份和恢复

备份策略

bash
# 1. 备份事务日志 #!/bin/bash BACKUP_DIR=/backup/zookeeper/$(date +%Y%m%d) mkdir -p $BACKUP_DIR cp -r /data/zookeeper/logs $BACKUP_DIR/ # 2. 备份快照文件 cp -r /data/zookeeper/data/version-2 $BACKUP_DIR/ # 3. 备份配置文件 cp /opt/zookeeper/conf/zoo.cfg $BACKUP_DIR/ # 4. 压缩备份 tar -czf $BACKUP_DIR.tar.gz $BACKUP_DIR/ # 5. 清理旧备份 find /backup/zookeeper -mtime +7 -delete

恢复流程

bash
# 1. 停止集群 zkServer.sh stop # 2. 恢复事务日志 cp -r /backup/zookeeper/20260120/logs /data/zookeeper/ # 3. 恢复快照文件 cp -r /backup/zookeeper/20260120/data/version-2 /data/zookeeper/data/ # 4. 启动集群 zkServer.sh start # 5. 验证数据 zkCli.sh -server localhost:2181 ls /

8. 故障排查

常见故障排查步骤

1. 节点无法启动

bash
# 检查日志 tail -100 /data/zookeeper/logs/zookeeper.log # 检查端口占用 netstat -tlnp | grep 2181 # 检查配置文件 cat /opt/zookeeper/conf/zoo.cfg # 检查 myid 文件 cat /data/zookeeper/data/myid

2. 集群选举失败

bash
# 检查网络连通性 ping <other-nodes> # 检查防火墙 telnet <node> 2888 telnet <node> 3888 # 检查节点状态 echo stat | nc localhost 2181 # 检查选举超时 grep electionTimeout /opt/zookeeper/conf/zoo.cfg

3. 性能下降

bash
# 检查延迟 echo mntr | nc localhost 2181 | grep latency # 检查磁盘 I/O iostat -x 1 # 检查网络 sar -n DEV 1 # 检查 CPU top

9. 容量规划

容量评估

bash
# 1. 评估节点数量 # 根据业务需求确定集群规模 # 小规模:3 节点 # 中等规模:5 节点 # 大规模:7 节点 # 2. 评估存储需求 # 事务日志:预计写入量 * 保留时间 # 快照文件:节点数量 * 平均大小 * 保留数量 # 3. 评估网络带宽 # 峰值吞吐量 * 数据包大小 # 4. 评估客户端连接数 # 预计客户端数量 * 并发连接

扩容流程

bash
# 1. 准备新节点 # 安装 Zookeeper # 配置 zoo.cfg # 创建 myid 文件 # 2. 更新所有节点配置 # 添加新节点到 server 列表 # 3. 启动新节点 zkServer.sh start # 4. 等待数据同步 # 监控同步状态 # 5. 验证集群 echo stat | nc localhost 2181

10. 安全加固

安全配置

properties
# 1. 启用认证 authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider requireClientAuthScheme=sasl # 2. 配置 ACL # 在创建节点时指定 ACL # 3. 网络隔离 # 使用防火墙限制访问 # 使用 VPN 或专用网络 # 4. 日志审计 # 记录所有操作日志

安全检查

bash
# 1. 检查 ACL 配置 zkCli.sh -server localhost:2181 getAcl / # 2. 检查认证状态 echo envi | nc localhost 2181 | grep -E "auth" # 3. 检查网络连接 netstat -tlnp | grep 2181 # 4. 检查日志审计 grep "auth" /data/zookeeper/logs/zookeeper.log

11. 运维自动化

自动化脚本

bash
# 1. 健康检查脚本 #!/bin/bash for node in zk1 zk2 zk3 zk4 zk5; do status=$(echo stat | nc $node 2181 | grep -E "Mode") echo "$node: $status" done # 2. 自动备份脚本 # 见备份策略部分 # 3. 自动清理脚本 #!/bin/bash # 清理旧快照 find /data/zookeeper/data/version-2 -name "snapshot.*" -mtime +7 -delete # 4. 监控脚本 #!/bin/bash # 监控延迟 latency=$(echo mntr | nc localhost 2181 | grep avg_latency | awk '{print $2}') if [ $(echo "$latency > 10" | bc) -eq 1 ]; then echo "High latency: $latency" fi

12. 运维文档

文档清单

  1. 部署文档
  2. 配置文档
  3. 监控文档
  4. 故障排查文档
  5. 备份恢复文档
  6. 安全文档
  7. 变更记录
  8. 联系人信息

变更管理

  1. 变更申请
  2. 变更审核
  3. 变更实施
  4. 变更验证
  5. 变更记录
标签:Zookeeper