11.9.2 关键指标解读与阈值建议
在ZooKeeper监控中,关键指标应覆盖可用性、性能、容量与一致性四类,结合业务QPS与集群规模设定阈值。以下给出常用指标解读与建议阈值范围,并提供可执行示例、排错与练习。
1. 可用性与连接类指标#
示例:使用4字命令获取基础存活与连接指标
# 说明:mntr 可输出多项核心指标
echo mntr | nc 127.0.0.1 2181
# 关键字段解释:
# zk_server_state: leader/follower/observer
# zk_num_alive_connections: 当前活跃连接数
# zk_connections_per_sec: 每秒新建连接数
- zk_up/服务存活:应始终为1。阈值建议:连续1分钟为0即触发严重告警。
- NumAliveConnections/活跃连接数:反映客户端连接压力。阈值建议:超过历史峰值的120%触发预警;超过150%触发告警。
- ConnectionsPerSec/每秒连接建立数:突增通常与客户端重连风暴或网络抖动相关。阈值建议:超过基线3倍持续5分钟告警。
排错示例:连接数异常激增
# 1) 查看当前连接来源(需开启4lw 'cons')
echo cons | nc 127.0.0.1 2181 | head -n 10
# 2) 统计连接IP分布
echo cons | nc 127.0.0.1 2181 | awk '{print $2}' | cut -d: -f1 | sort | uniq -c | sort -nr | head
# 预期:识别异常IP或应用实例
2. 性能与请求处理指标#
示例:获取延迟与队列
echo mntr | nc 127.0.0.1 2181 | egrep "zk_(avg|max)_latency|zk_outstanding_requests|zk_packets_(sent|received)"
# zk_outstanding_requests: 排队请求数
# zk_avg_latency / zk_max_latency: 平均/最大延迟(ms)
- OutstandingRequests/排队请求数:阈值建议:>10持续1分钟预警,>50持续1分钟告警。
- AvgLatency/平均延迟(ms):阈值建议:>10ms预警,>30ms告警。
- MaxLatency/最大延迟(ms):阈值建议:>100ms预警,>300ms告警。
- RequestThroughput/请求吞吐:超历史峰值的130%预警,150%告警,并关注延迟变化。
排错示例:延迟升高定位
# 1) 查看慢请求是否与磁盘相关
iostat -xm 1 5
# 2) 查看ZooKeeper日志中是否频繁快照/日志滚动
grep -E "snapshot|log" /var/lib/zookeeper/zookeeper.out | tail -n 20
3. 数据一致性与集群状态指标#
示例:获取角色与同步Follower
echo mntr | nc 127.0.0.1 2181 | egrep "zk_server_state|zk_synced_followers|zk_pending_syncs|zk_zxid"
# zk_synced_followers: 同步Follower数量
# zk_zxid: 事务ID(16进制)
- zk_server_state:leader缺失1分钟内告警;角色频繁切换(>3次/10分钟)预警。
- Zxid/事务ID增速:相对基线增长>2倍持续5分钟预警。
- SyncedFollowers/同步Follower数:小于(N/2+1)即严重告警。
- Epoch与选举次数:10分钟内选举次数≥2预警,≥3告警。
排错示例:频繁选举
# 查看选举相关日志
grep -E "LEADING|FOLLOWING|ELECTION" /var/lib/zookeeper/zookeeper.out | tail -n 50
# 检查节点间网络
for h in zk1 zk2 zk3; do ping -c 2 $h; done
4. 存储与容量指标#
示例:数据目录与日志目录容量
# 数据目录与事务日志目录大小
du -sh /var/lib/zookeeper /var/log/zookeeper
df -h /var/lib/zookeeper /var/log/zookeeper
- DataDirSize/数据目录大小:接近磁盘容量70%预警,85%告警。
- SnapCount/快照频率:快照间隔>2小时预警;过于频繁(<5分钟)预警。
- LogDirSize/事务日志大小:连续增长超过24小时无回落预警;接近磁盘80%告警。
排错示例:日志清理异常
# 检查自动清理配置
grep -E "autopurge" /etc/zookeeper/conf/zoo.cfg
# 推荐配置(示例)
cat <<'EOF' >> /etc/zookeeper/conf/zoo.cfg
autopurge.snapRetainCount=10
autopurge.purgeInterval=1
EOF
# 说明:保留10个快照,每天清理一次
5. JVM与资源指标#
示例:JMX查看堆与GC
# 需要启用JMX:在 /etc/zookeeper/conf/java.env 中添加
cat <<'EOF' >> /etc/zookeeper/conf/java.env
JMXPORT=9010
EOF
# 使用jcmd查看GC与堆(需安装JDK)
jcmd $(pgrep -f QuorumPeerMain) GC.heap_info
jcmd $(pgrep -f QuorumPeerMain) GC.class_histogram | head
- HeapUsed/堆内存使用率:>70%预警,>85%告警。
- GC次数与耗时:Full GC>1次/5分钟预警;单次Full GC >1s告警。
- CPU使用率:>70%预警,>85%持续5分钟告警。
- 磁盘IO延迟:>10ms预警,>20ms告警。
排错示例:GC频繁
# 查看GC日志(需开启GC日志参数)
grep -E "Full GC|Pause" /var/log/zookeeper/gc.log | tail -n 20
# 调整堆大小示例
sed -i 's/-Xms1g -Xmx1g/-Xms2g -Xmx2g/' /etc/zookeeper/conf/java.env
6. 告警分级建议#
- 严重(P1):服务不可用、leader缺失、SyncedFollowers不足、磁盘接近满、堆OOM风险。
- 高(P2):延迟明显升高、OutstandingRequests持续高、频繁选举、连接数超阈值。
- 中(P3):吞吐异常波动、GC频率增加、日志/数据目录持续增长。
- 低(P4):短时抖动或超过预警阈值但未持续。
示例:本地阈值检查脚本(可作为告警前置)
#!/usr/bin/env bash
# 文件路径: /usr/local/bin/zk_check.sh
# 说明:检查存活与排队请求
HOST=127.0.0.1
PORT=2181
MNTR=$(echo mntr | nc $HOST $PORT)
STATE=$(echo "$MNTR" | awk '/zk_server_state/ {print $2}')
OUT=$(echo "$MNTR" | awk '/zk_outstanding_requests/ {print $2}')
if [[ "$STATE" != "leader" && "$STATE" != "follower" && "$STATE" != "observer" ]]; then
echo "CRITICAL: zk_server_state=$STATE"
exit 2
fi
if [[ "$OUT" -gt 50 ]]; then
echo "CRITICAL: outstanding_requests=$OUT"
exit 2
elif [[ "$OUT" -gt 10 ]]; then
echo "WARN: outstanding_requests=$OUT"
exit 1
else
echo "OK: outstanding_requests=$OUT"
exit 0
fi
7. 阈值设定原则#
- 以历史基线与容量评估为准,至少覆盖日峰值、周峰值。
- 同时监控趋势与突变,避免单点阈值误报。
- 对写密集场景适当上调延迟阈值,对读密集场景适当下调OutstandingRequests阈值。
- 阈值调整应记录变更与回归验证,防止“阈值漂移”。
练习
1. 使用mntr采集三台节点的zk_server_state与zk_synced_followers,判断是否满足法定人数并记录结果。
2. 用脚本实现zk_avg_latency超过30ms持续3次即告警,并输出时间戳。
3. 将autopurge配置生效后,观察一周内/var/log/zookeeper大小变化并分析是否需要调整保留数。