bigywater.tech
ZooKeeper · 11

ZooKeeper 客户端连接流程

客户端怎么连上 ZooKeeper 集群?连接串里的多个地址怎么用?服务端挂了会发生什么?这篇用真实的 3 节点集群和 kazoo 把连接建立、握手确认和故障转移逐步量出来。

随机选择
连接串里的地址被打乱后依次尝试(kazoo 行为)
SUSPENDED → CONNECTED
服务端被 kill 后,客户端在同一个会话里换节点重连
sid 最高字节
会话 id 的最高字节是创建它的服务端的 myid

连接串与选择

实测 · 本机执行输出
  连到的客户端端口 → 次数: {7300: 4, 7301: 5, 7302: 3}

连接串里的写法是 host1:port,host2:port,host3:port(可以带 chroot 路径后缀)。不同语言的客户端选择策略可能不同,这里测的是 kazoo。

握手确认了什么

实测 · 本机执行输出
  客户端会话 id 0x3000bc80dc50003,连在端口 7302(服务端 z11-3,leader)
  该节点的 cons: 127.0.0.1:51083[1](queued=0,recved=1,sent=1,sid=0x3000bc80dc50003,lop=SESS,est=1790817899852,to=8000,lcxid=0x0,lzxid=0x100000019,lresp=197660424,llat=

服务端挂了

实测 · 本机执行输出
  状态变化(相对 kill 的毫秒): [(3, 'SUSPENDED'), (350, 'CONNECTED')]
  重连到端口 7301(原来 7302);会话 id 不变:True;临时节点还在:True

SUSPENDED 表示「连接断了、会话还可能有效」,此时客户端不应当假设自己持有的锁、临时节点已经失效,也不应当继续假设它们有效——要等到重新 CONNECTED 或者 LOST 才能决定(下一篇看 LOST)。

只写一个地址

实测 · 本机执行输出
  单地址客户端在节点停止 3 秒后的状态: ['SUSPENDED'] | 连接状态 connected = False
  节点重新启动后: ['SUSPENDED', 'CONNECTED'] | connected = True

分步演示

客户端连接
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。3 节点伪集群;客户端 kazoo 2.11.0;被 kill 的节点是客户端当时连着的那个
    • 没有验证:Java 客户端(Curator)的选择策略与 DNS 解析(第 92 篇)、chroot、TLS 连接(第 75 篇)、连接超时 / 读超时的具体值、客户端在 SUSPENDED 期间的请求排队行为
    京ICP备2026067502号-1京公网安备11010502063487号