11.9.1 监控体系与指标分类
ZooKeeper 的监控体系应覆盖主机层、JVM层、进程层、服务层与业务层,形成从资源到一致性再到请求质量的全链路视角。常见实践是将系统资源指标与 ZooKeeper 内建指标统一采集,并结合业务事件做关联分析,保证告警可定位、可行动。
监控体系原理草图(分层采集)
指标分类与范围
1. 系统资源层指标:CPU、负载、内存、磁盘 IO、网络吞吐与丢包,反映运行环境健康度。
2. JVM 层指标:堆内存使用、GC 次数与停顿、线程数、直接内存,反映进程稳定性。
3. 进程层指标:进程存活、文件描述符、打开文件数、端口监听状态。
4. ZooKeeper 服务层指标:会话数、请求延迟、吞吐、连接状态、数据同步与一致性相关指标。
5. 业务层指标:业务注册数、临时节点数量、watcher 数量、关键路径节点变化频率。
核心指标清单(按功能域)
- 连接与会话:活跃连接数、会话数、会话过期数、连接状态分布
- 请求与延迟:平均/95线/99线请求延迟、每秒请求数、请求队列长度
- 一致性与复制:leader/follower 状态、同步延迟、zxid 差、快照/日志耗时
- 数据与节点:数据节点总数、临时节点数、watcher 数量、节点变更速率
- 资源与稳定性:JVM 堆/非堆使用率、GC 时间占比、线程数、FD 使用率、磁盘写入延迟
指标采集分层策略
- 基础采集:系统与 JVM 指标固定采集,保证基础健康判定。
- 服务采集:通过四字命令、JMX 或导出器采集 ZooKeeper 内建指标。
- 业务采集:基于客户端侧埋点或业务网关统计关键路径指标。
四字命令采集示例(服务层指标)
说明:需要在
zoo.cfg中配置白名单后重启。
# 1) 配置四字命令白名单
# /etc/zookeeper/zoo.cfg
4lw.commands.whitelist=ruok,srvr,stat,mntr,cons
# 2) 重启服务(以 systemd 为例)
sudo systemctl restart zookeeper
# 3) 获取服务健康状态
echo ruok | nc 127.0.0.1 2181
# 预期输出:imok
# 4) 获取关键指标(mntr)
echo mntr | nc 127.0.0.1 2181
# 典型输出字段:zk_avg_latency、zk_packets_sent、zk_num_alive_connections 等
# 5) 获取服务角色/版本(srvr)
echo srvr | nc 127.0.0.1 2181
# 预期输出包含:Mode: leader/follower/observer
进程与端口检查示例(进程层指标)
# 1) 进程存活与启动参数
ps -ef | grep -v grep | grep zookeeper
# 说明:确认 Java 进程存在且参数指向正确的 zoo.cfg
# 2) 端口监听
ss -lntp | grep 2181
# 说明:2181 为客户端端口,2888/3888 为集群通信端口
# 3) 文件描述符使用情况
pid=$(pgrep -f zookeeper)
ls /proc/$pid/fd | wc -l
# 说明:观察 FD 数量增长,结合 ulimit 排查
JVM 指标采集示例(JMX Exporter)
# /opt/jmx_exporter/zookeeper.yml
startDelaySeconds: 0
ssl: false
lowercaseOutputName: true
rules:
- pattern: "java.lang<type=Memory><HeapMemoryUsage>\\.(used|max)"
- pattern: "java.lang<type=GarbageCollector,name=(.*)><>CollectionTime"
# 启动参数中加入 JMX Exporter
# /etc/zookeeper/zoo.cfg 旁的启动脚本或 systemd Environment
JAVA_OPTS="$JAVA_OPTS -javaagent:/opt/jmx_exporter/jmx_prometheus_javaagent-0.20.0.jar=9404:/opt/jmx_exporter/zookeeper.yml"
# 验证指标暴露
curl -s http://127.0.0.1:9404/metrics | head
# 预期:输出 jvm_memory_used_bytes 等指标
指标命名与维度建议
- 统一命名规范,区分集群、实例、角色(leader/follower/observer)。
- 必要维度:集群名、实例名、机房/可用区、角色、版本。
- 保持粒度可控,避免高基数标签导致存储膨胀。
常见排错要点(与分类关联)
- ruok 超时:先查主机层负载与网络丢包,再查进程层端口监听与 FD。
- mntr 无输出:检查 4lw.commands.whitelist 是否生效、配置文件路径是否正确。
- JVM 堆持续上升:查看业务层 watcher/临时节点数量是否异常增长。
练习
1. 在测试节点启用四字命令白名单,使用 mntr 输出并标注 5 个关键指标含义。
2. 使用 ss 与 ps 验证 ZooKeeper 端口与进程状态,给出预期输出截图。
3. 设计一个最小监控集:主机层 3 个指标、服务层 3 个指标、业务层 2 个指标,并说明原因。