11.6.6 日常巡检与故障应急操作

围绕 ZooKeeper 的日常巡检与故障应急操作,应建立可执行、可复盘的标准流程,覆盖进程、端口、角色、选举、数据与网络等关键维度,确保问题能快速定位与隔离。本节提供巡检清单、关键命令、阈值判读、应急流程与演练示例。

一、原理草图:巡检与故障定位路径

文章图片

二、日常巡检清单(建议每日/每周执行)
- 进程与端口:确认 java 进程存在,2181/2888/3888 端口监听正常;检查系统资源(CPU/内存/磁盘/IO)。
- 集群角色与状态:用 stat/srvr 确认 Leader/Follower/Observer 角色数量正确;mntr 获取延迟、堆积等指标。
- 连接数与会话:关注 zk_num_alive_connectionszk_outstanding_requests,避免会话风暴。
- 数据与快照:检查 dataDirdataLogDir 目录占用,确认快照与事务日志滚动正常。
- 时钟与网络:保证 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 做主动告警;
- 所有应急操作必须记录变更与恢复步骤,确保可追溯。