11.6.6 日常巡检与故障应急操作
围绕 ZooKeeper 的日常巡检与故障应急操作,应建立可执行、可复盘的标准流程,覆盖进程、端口、角色、选举、数据与网络等关键维度,确保问题能快速定位与隔离。本节提供巡检清单、关键命令、阈值判读、应急流程与演练示例。
一、原理草图:巡检与故障定位路径
二、日常巡检清单(建议每日/每周执行)
- 进程与端口:确认 java 进程存在,2181/2888/3888 端口监听正常;检查系统资源(CPU/内存/磁盘/IO)。
- 集群角色与状态:用 stat/srvr 确认 Leader/Follower/Observer 角色数量正确;mntr 获取延迟、堆积等指标。
- 连接数与会话:关注 zk_num_alive_connections、zk_outstanding_requests,避免会话风暴。
- 数据与快照:检查 dataDir、dataLogDir 目录占用,确认快照与事务日志滚动正常。
- 时钟与网络:保证 NTP 同步,网络延迟与丢包在可控范围。
- 日志检查:扫查 WARN/ERROR,特别是 session expired、snapshot error、fsync slow、xid rollback。
三、常用巡检命令与解释(含预期输出)
1)服务存活与角色
# 存活检测,预期输出 "imok"
echo ruok | nc zk1 2181
# 角色与连接摘要,预期输出包含 Mode: leader/follower
echo stat | nc zk1 2181
# 版本与节点信息,预期输出包含 ZK server version
echo srvr | nc zk1 2181
2)核心指标采样(适合对接 Prometheus)
# 监控指标,预期输出 key=value
echo mntr | nc zk1 2181 | egrep "zk_server_state|zk_num_alive_connections|zk_outstanding_requests|zk_avg_latency"
3)连接与 Watch 观察
# 客户端连接列表(IP:PORT)
echo cons | nc zk1 2181 | head -n 5
# watch 统计分布
echo wchs | nc zk1 2181
4)进程、端口与磁盘
# 进程
ps -ef | grep -v grep | grep QuorumPeerMain
# 端口监听
ss -lntp | egrep "2181|2888|3888"
# dataDir 与 dataLogDir 占用
du -sh /data/zookeeper/data /data/zookeeper/datalog
四、巡检脚本示例(可直接执行)
文件路径:
/usr/local/bin/zk_healthcheck.sh
#!/usr/bin/env bash
set -euo pipefail
HOST="${1:-127.0.0.1}"
PORT="${2:-2181}"
echo "[1] ruok"
echo ruok | nc "$HOST" "$PORT"
echo "[2] stat"
echo stat | nc "$HOST" "$PORT" | egrep "Mode|Connections|Node count"
echo "[3] mntr (key metrics)"
echo mntr | nc "$HOST" "$PORT" | egrep "zk_server_state|zk_num_alive_connections|zk_outstanding_requests|zk_avg_latency"
echo "[4] disk usage"
du -sh /data/zookeeper/data /data/zookeeper/datalog
echo "[5] port listen"
ss -lntp | egrep "2181|2888|3888"
执行与预期:
chmod +x /usr/local/bin/zk_healthcheck.sh
/usr/local/bin/zk_healthcheck.sh zk1 2181
# 预期:返回 imok、Mode: leader/follower、关键指标与目录占用
五、关键阈值与异常特征(判读要点)
- 连接激增:zk_num_alive_connections 短时间暴涨,常见于客户端重连风暴或网络抖动。
- 请求堆积:zk_outstanding_requests 持续升高,可能为磁盘 IO 瓶颈或 Leader 承压。
- 选举频繁:日志出现频繁选举,需排查网络、NTP、GC 停顿。
- 事务日志异常膨胀:快照未生成或磁盘空间不足,可能导致启动慢或 OOM。
六、故障应急操作流程(含命令)
1)确认故障范围
# 对所有节点执行
for h in zk1 zk2 zk3; do
echo "=== $h ==="
echo stat | nc $h 2181 | egrep "Mode|Node count|Connections"
done
2)保底措施:确保过半可用
- 若节点不稳定,先停止故障节点,避免集群反复选举。
# 示例:停止问题节点(系统服务名可能为 zookeeper)
systemctl stop zookeeper
3)快速隔离问题节点
# 限制客户端连接(可用防火墙/安全组)
iptables -I INPUT -p tcp --dport 2181 -s 10.0.0.0/8 -j DROP
4)定位问题根因
# 日志与错误
grep -E "WARN|ERROR|Exception|fsync|snapshot" /data/zookeeper/logs/zookeeper.log | tail -n 50
# GC 日志(路径按配置)
tail -n 50 /data/zookeeper/logs/gc.log
# 磁盘与IO
iostat -x 1 3
df -h /data/zookeeper
5)恢复顺序与一致性检查
# 启动节点
systemctl start zookeeper
# 同步完成后检查角色与指标
echo stat | nc zk1 2181 | egrep "Mode|Node count"
echo mntr | nc zk1 2181 | egrep "zk_synced_followers|zk_outstanding_requests"
七、典型故障场景与处置(含可执行命令)
1)集群无法选举 Leader
- 可能原因:网络分区、端口不通、epoch 冲突、myid 配置错误
# 检查 2888/3888 连通性
nc -vz zk1 2888
nc -vz zk1 3888
# 校验 myid 与 zoo.cfg server 列表
cat /data/zookeeper/myid
grep "^server\." /data/zookeeper/zoo.cfg
2)节点频繁重启
- 可能原因:磁盘满、OOM、参数不合理
# 磁盘
df -h /data/zookeeper
# OOM 关键字
dmesg | egrep -i "killed process|oom"
# 快照与日志清理(保留最近3个快照)
/usr/local/zookeeper/bin/zkCleanup.sh -n 3 /data/zookeeper/version-2
3)客户端频繁 session expired
- 可能原因:GC 停顿、网络抖动、超时设置过小
# 观察平均延迟与超时指标
echo mntr | nc zk1 2181 | egrep "zk_avg_latency|zk_max_latency"
# 检查 GC 停顿
tail -n 100 /data/zookeeper/logs/gc.log
八、演练与练习(可复现)
1)演练:模拟网络分区(单节点)
# 阻断 2888/3888,模拟选举失败
iptables -I INPUT -p tcp -m multiport --dports 2888,3888 -j DROP
# 观察 stat 是否变为 looking
echo stat | nc zk1 2181 | egrep "Mode"
# 恢复
iptables -D INPUT -p tcp -m multiport --dports 2888,3888 -j DROP
2)练习:编写巡检报告
- 要求:输出节点角色、连接数、平均延迟、磁盘占用。
echo "Host,Role,Connections,AvgLatency,Disk" > /tmp/zk_report.csv
for h in zk1 zk2 zk3; do
role=$(echo stat | nc $h 2181 | awk -F': ' '/Mode/ {print $2}')
conn=$(echo stat | nc $h 2181 | awk -F': ' '/Connections/ {print $2}')
lat=$(echo mntr | nc $h 2181 | awk -F'=' '/zk_avg_latency/ {print $2}')
disk=$(ssh $h "du -sh /data/zookeeper/data | awk '{print \$1}'")
echo "$h,$role,$conn,$lat,$disk" >> /tmp/zk_report.csv
done
cat /tmp/zk_report.csv
九、巡检与应急最佳实践
- 保持 奇数节点 与 N+1 冗余;
- 快照与日志设置合理滚动策略,避免磁盘压满;
- 建议接入 Prometheus + Alertmanager 做主动告警;
- 所有应急操作必须记录变更与恢复步骤,确保可追溯。