答案
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. 运维文档
文档清单:
- 部署文档
- 配置文档
- 监控文档
- 故障排查文档
- 备份恢复文档
- 安全文档
- 变更记录
- 联系人信息
变更管理:
- 变更申请
- 变更审核
- 变更实施
- 变更验证
- 变更记录