bigywater.tech
ZooKeeper · 64

ZooKeeper JMX 监控

JMX 是 Java 世界的标准监控接口,ZooKeeper 也通过它暴露状态。这篇开启 JMX,用一个小 Java 程序连上去,把单机与集群节点注册的 MBean 和它们的属性、操作列出来。

2 个 / 层次化
单机只注册 2 个 MBean;集群按 ReplicatedServer → replica → Leader / Follower 分层
reset* 操作
JMX 不只是读,也能重置统计
无认证
实验里的 JMX 只绑定本机且关闭了认证,生产环境必须开认证与 SSL

单机的 MBean

实测 · 本机执行输出
   org.apache.ZooKeeperService:name0=StandaloneServer_port7300
   org.apache.ZooKeeperService:name0=StandaloneServer_port7300,name1=Connections,name2=127.0.0.1,name3=0x1000c57e25f0000
   org.apache.ZooKeeperService:name0=StandaloneServer_port7300,name1=InMemoryDataTree

属性与操作

实测 · 本机执行输出
   ATTR TickTime = 2000
   ATTR MinSessionTimeout = 4000
   ATTR MaxSessionTimeout = 40000
   ATTR ClientPort = 7300
   ATTR SecureClientPort = 
   ATTR MaxClientCnxnsPerHost = 60
   ATTR NumAliveConnections = 1
   ATTR OutstandingRequests = 0
   ATTR PacketsReceived = 502
   ATTR AvgRequestLatency = 17.4711
   ATTR MaxRequestLatency = 21
   ATTR Version = 3.9.6-${mvngit.commit.id}, built on 2026-09-14 21:34 UTC
  可调用的操作: ['resetFsyncThresholdExceedCount', 'resetLatency', 'resetMaxLatency', 'resetAuthFailedCount', 'resetNonMTLSConnCount', 'resetStatistics']

属性值与 mntr / Prometheus 里的同名指标同源(NumAliveConnections ↔ zk_num_alive_connections)。

集群节点

实测 · 本机执行输出
  leader(z64b-2):
     name0=ReplicatedServer_id2
     name0=ReplicatedServer_id2,name1=replica.1
     name0=ReplicatedServer_id2,name1=replica.2
     name0=ReplicatedServer_id2,name1=replica.2,name2=Leader
     name0=ReplicatedServer_id2,name1=replica.2,name2=Leader,name3=InMemoryDataTree
     name0=ReplicatedServer_id2,name1=replica.2,name2=Leader,name3=Learner_Connections,name4="127.0.0.1:58611",name5="id:1"
     name0=ReplicatedServer_id2,name1=replica.2,name2=Leader,name3=Learner_Connections,name4="127.0.0.1:58614",name5="id:3"
     name0=ReplicatedServer_id2,name1=replica.3
  follower(z64b-1):
     name0=ReplicatedServer_id1
     name0=ReplicatedServer_id1,name1=replica.1
     name0=ReplicatedServer_id1,name1=replica.1,name2=Follower
     name0=ReplicatedServer_id1,name1=replica.1,name2=Follower,name3=InMemoryDataTree
     name0=ReplicatedServer_id1,name1=replica.2
     name0=ReplicatedServer_id1,name1=replica.3

安全提醒

远程 JMX 如果不开认证,任何人连上就能调用 MBean 的操作;而且 JMX 基于 RMI,配置不当会有反序列化类的风险(这是通用的 Java 安全常识,本文没有测)。生产环境应当开认证 + SSL,或者干脆用 Prometheus 端点(第 63 篇)并关闭 JMX 远程端口。

分步演示

JMX
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。JMX 端口 7391 / 7392+,仅本机、无认证、无 SSL(实验用);客户端是自己写并用 javac 编译的 JmxProbe.java
    • 没有验证:JConsole / VisualVM 等图形工具、带认证与 SSL 的 JMX、MBean 的每一个属性的含义、通过 JMX 调用 reset 操作后指标的变化
    京ICP备2026067502号-1京公网安备11010502063487号