监控 Zookeeper 运行状态的实用方案
一 快速健康检查与命令行
- 使用四字命令直连 2181 端口,快速判断存活与角色:
- 存活探测:echo ruok | nc localhost 2181(返回 imok 表示进程存活)
- 简要状态:echo stat | nc localhost 2181(版本、角色、连接数等)
- 详细指标:echo mntr | nc localhost 2181(延迟、收发包、连接数等)
- 会话与监听:echo cons | nc localhost 2181;echo wchs | nc localhost 2181
- 节点角色:/path/to/zookeeper/bin/zkServer.sh status(显示 Leader/Follower)
- 客户端连通性:/path/to/zookeeper/bin/zkCli.sh -server : 并执行 stat
- 日志排查:检查安装目录下的 logs/ 日志文件,定位异常与告警。
二 指标采集与可视化
- Prometheus + Grafana(推荐)
- 方式A(Zookeeper 3.6+):在 zoo.cfg 启用内置指标暴露
- 配置:metricsProvider.classname=org.apache.zookeeper.server.metrics.PrometheusMetricsProvider
- 配置:metricsProvider.httpport=9090
- Prometheus 抓取:scrape_configs 新增 job,targets: :9090
- 方式B(通用):通过 JMX Exporter 暴露 JMX 指标,再由 Prometheus 抓取
- Grafana:添加 Prometheus 数据源,导入 Zookeeper 仪表盘进行可视化
- Telegraf
- 启用 inputs.zookeeper 插件,servers=[“localhost:2181”],将指标送入 InfluxDB/Prometheus 等后端
- 企业监控
- Zabbix:通过自定义 UserParameter 调用 zkServer.sh status 或四字命令,结合触发器告警
- Site24x7:部署 Site24x7 Agent 与 Zookeeper 插件,集中展示与告警。
三 JMX 深度监控
- 本地/远程 JMX
- 在 zkServer.sh 的 JVM 参数中加入:
- -Dcom.sun.management.jmxremote.port=5000
- -Dcom.sun.management.jmxremote.authenticate=true/false
- -Dcom.sun.management.jmxremote.ssl=false/true
- 如需鉴权:-Dcom.sun.management.jmxremote.access.file=jmxremote.access
- 如需鉴权:-Dcom.sun.management.jmxremote.password.file=jmxremote.password
- 使用 jconsole 或 jvisualvm 连接 :5000 查看 MBean(如请求延迟、收发包、连接数等)
- 安全建议:生产环境开启鉴权与 SSL,限制来源 IP,避免暴露公网。
四 关键指标与告警建议
- 可用性
- 存活探测 ruok 非 imok 连续失败 ≥ 3 次(间隔 10s)
- 集群角色异常:节点长时间非 Leader/Follower(结合 mntr 或 zkServer.sh status)
- 延迟与吞吐
- AvgLatency/MaxLatency 突增(如超过基线 2–3σ)
- PacketsReceived/PacketsSent 与业务峰值不匹配(可能连接风暴或 GC 抖动)
- 连接与会话
- NumAliveConnections 持续接近 maxClientCnxns
- cons 显示异常会话数增长或大量临时节点未释放
- 存储与快照
- 数据目录磁盘使用率 ≥ 80%
- 观察 wchs/wchc/wchp 的 Watcher/临时节点异常增长(可能客户端泄漏)
- 日志与异常
- logs/ 中出现 ERROR/WARN、频繁 Session expired、Commit failed 等。
五 一键健康检查脚本示例
- 用法:./zk_check.sh <port=2181>
- 功能:四字命令探测(ruok/mntr/stat)、角色检查、简单阈值判断与退出码
#!/usr/bin/env bash
set -euo pipefail
HOST="${1:-localhost}"
PORT="${2:-2181}"
TIMEOUT=5
zk_cmd() {
local cmd="$1"
echo "$cmd" | nc -w "$TIMEOUT" "$HOST" "$PORT" 2>/dev/null
}
if [[ "$(zk_cmd ruok)" != "imok" ]]; then
echo "CRITICAL: ruok not ok from $HOST:$PORT"
exit 2
fi
ROLE=$(zk_cmd stat 2>/dev/null | awk '/Mode:/ {print $2}')
if [[ -z "$ROLE" ]]; then
echo "CRITICAL: Cannot get role from $HOST:$PORT"
exit 2
fi
echo "OK: Role=$ROLE"
read -r _ _ _ _ _ _ _ AVG_LATENCY MAX_LATENCY < <(zk_cmd mntr 2>/dev/null | egrep '^avgLatency|^maxLatency')
if [[ -n "$AVG_LATENCY" && "$AVG_LATENCY" -gt 100 ]]; then
echo "WARNING: avgLatency=$AVG_LATENCY ms > 100 ms"
exit 1
fi
if [[ -n "$MAX_LATENCY" && "$MAX_LATENCY" -gt 1000 ]]; then
echo "CRITICAL: maxLatency=$MAX_LATENCY ms > 1000 ms"
exit 2
fi
echo "OK: Zookeeper $HOST:$PORT healthy"
exit 0
- 建议:配合 cron 每 10s 执行,将输出接入 Zabbix/Site24x7 或通过 curl 上报到告警网关。