温馨提示×

如何监控Zookeeper的运行状态

小樊
46
2025-11-22 22:02:47
栏目: 大数据

监控 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
    • 使用 jconsolejvisualvm 连接 :5000 查看 MBean(如请求延迟、收发包、连接数等)
  • 安全建议:生产环境开启鉴权与 SSL,限制来源 IP,避免暴露公网。

四 关键指标与告警建议

  • 可用性
    • 存活探测 ruokimok 连续失败 ≥ 3 次(间隔 10s
    • 集群角色异常:节点长时间非 Leader/Follower(结合 mntrzkServer.sh status
  • 延迟与吞吐
    • AvgLatency/MaxLatency 突增(如超过基线 2–3σ
    • PacketsReceived/PacketsSent 与业务峰值不匹配(可能连接风暴或 GC 抖动)
  • 连接与会话
    • NumAliveConnections 持续接近 maxClientCnxns
    • cons 显示异常会话数增长或大量临时节点未释放
  • 存储与快照
    • 数据目录磁盘使用率 ≥ 80%
    • 观察 wchs/wchc/wchp 的 Watcher/临时节点异常增长(可能客户端泄漏)
  • 日志与异常
    • logs/ 中出现 ERROR/WARN、频繁 Session expiredCommit 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
}

# 1) 存活探测
if [[ "$(zk_cmd ruok)" != "imok" ]]; then
  echo "CRITICAL: ruok not ok from $HOST:$PORT"
  exit 2
fi

# 2) 角色检查
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"

# 3) 关键指标阈值示例:平均/最大延迟
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
  • 建议:配合 cron10s 执行,将输出接入 Zabbix/Site24x7 或通过 curl 上报到告警网关。

0