bigywater.tech
ZooKeeper · 12

Session 会话机制

会话(Session)是 ZooKeeper 里最核心的概念:临时节点、watch、重连都围绕它。这篇用 3 节点集群看会话 id 怎么构成、空闲时怎么保活、服务端怎么跟踪它。

最高字节 = myid
会话 id 的构成:服务端 id + 时间戳 + 计数
timeout / 3
ping 的间隔:6 s 超时 → 每 2 秒一个
global_sessions
会话是集群级的,不管连在哪个节点

会话 id

实测 · 本机执行输出
  连 1 号节点(follower)→ 会话 id 0x01000bc837b30000
  连 2 号节点(follower)→ 会话 id 0x02000bc838110000
  连 3 号节点(leader)→ 会话 id 0x03000bc837b40000

保活:ping

实测 · 本机执行输出
  空闲 12 秒:连接发送包数 1 → 7(多了 6 个,都是 ping 的响应);6 秒超时 ÷ 3 = 2 秒一个 ping → 约 6 个

如果客户端持续有请求,请求本身就能保活;只有空闲时才需要 ping。

服务端怎么跟踪

实测 · 本机执行输出
  leader(z12-3):dump 共 17 行,前几行: ['SessionTracker dump:', 'Session Sets (4)/(2):', '0 expire at Thu Oct 01 09:25:25 CST 2026:', '0 expire at Thu Oct 01 09:25:27 CST 2026:']
  follower(z12-1):dump 共 15 行,前几行: ['SessionTracker dump:', 'Global Sessions(2):', '0x1000bc837b30001\t6000ms', '0x1000bc837b30002\t8000ms']
  leader 的 dump 里含该会话与临时节点: True

集群级会话

实测 · 本机执行输出
  leader 的 zk_global_sessions = 2 | zk_local_sessions = 0 | follower 的 zk_global_sessions = 2

「本地会话」(local session)是 ZooKeeper 的可选特性,本文没有启用也没有验证。

分步演示

会话
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。3 节点伪集群;ping 次数取自 cons 里该连接的 sent 差值
    • 没有验证:会话过期的细节(第 13 篇)、本地会话(localSessionsEnabled)、会话升级、dump 输出里每一项的完整含义、大量会话的跟踪开销(第 14 篇)
    京ICP备2026067502号-1京公网安备11010502063487号