bigywater.tech
ZooKeeper · 2

单机、伪集群与集群部署

ZooKeeper 有单机、伪集群、集群三种部署方式。它们在配置、角色和可用性上有什么区别?这篇自己起进程逐个验证,包括「只起一部分节点」这种最容易让人误会的状态。

standalone / leader / follower
用四字命令 srvr 的 Mode 就能看出节点的角色
2.0 倍
3 节点集群的同步写延迟与单机的比(本机)
1/3 不服务
进程在、ruok 回 imok,但没有多数派就拒绝服务

单机模式

实测 · 本机执行输出
  Mode: standalone | 节点数 / quorum: 1 / 无
  写延迟(中位数,300 次同步 create):3.00 ms

没有 server.N 配置就是单机。适合开发测试,不适合生产(没有容错)。

伪集群

实测 · 本机执行输出
  z2e-1: client 7310  myid 1  Mode: follower
  z2e-2: client 7311  myid 2  Mode: follower
  z2e-3: client 7312  myid 3  Mode: leader
  zoo.cfg 里的集群部分: ['server.1=127.0.0.1:7410:7510', 'server.2=127.0.0.1:7411:7511', 'server.3=127.0.0.1:7412:7512']
  写延迟(中位数,300 次同步 create,连接到集群):6.07 ms(对比单机 3.00 ms)

「伪集群」只是把多个节点放在同一台机器上,靠不同的端口与数据目录区分;配置与真正的集群完全一样(server.N=host:quorumPort:electionPort 加 myid 文件)。它不提供机器级别的容错,但用来学习与测试一致性行为非常合适——本系列后面的集群实验都是这样做的。

只起了一部分节点

实测 · 本机执行输出
  只起 1/3:ruok → imok | srvr → This ZooKeeper instance is not currently serving requests
  客户端连接 / create → KazooTimeoutError
  起到 2/3 后: {'z2q-1': 'follower', 'z2q-2': 'leader'}
  客户端 create → 成功(2/3 够多数派)

用 ruok 做健康检查会被骗:它只表示进程能响应,不表示能服务。更可靠的是 srvr 的 Mode 或 mntr。

分步演示

三种部署方式
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。伪集群 3 个进程同一台机器;写延迟是 300 次同步 create 的中位数,磁盘为本机 SSD,默认会 fsync
    • 没有验证:跨机器的网络延迟、3 节点以外的规模(第 31 篇量 5 节点)、observer(第 29 篇)、仲裁方式的其它配置(如分组权重)
    京ICP备2026067502号-1京公网安备11010502063487号