bigywater.tech
ZooKeeper · 3

zoo.cfg 参数详解

zoo.cfg 里几个参数最常被问:tickTime、会话超时、maxClientCnxns、initLimit / syncLimit。这篇不抄文档,每个都起一个实例,用四字命令 conf 和 cons 看它实际生效的值,并试一试写错参数名会怎样。

2 × tick ~ 20 × tick
服务端允许的会话超时范围(默认);客户端请求的值被夹在里面
20000 ms
tickTime=1000 时,客户端请求 60000 ms 实际得到的会话超时
静默忽略
拼错的参数名不会报错、日志里也没有提示

默认值

实测 · 本机执行输出
  tickTime           = 2000
  minSessionTimeout  = 4000
  maxSessionTimeout  = 40000
  maxClientCnxns     = 60
  clientPort         = 7300
  (单机模式的 conf 输出里没有 initLimit / syncLimit,它们只对集群起作用,见第三节的集群 conf)

会话超时怎么协商

实测 · 本机执行输出
  tickTime=1000  minSessionTimeout=2000  maxSessionTimeout=20000
  客户端请求    500 ms → 服务端协商为 2000 ms
  客户端请求   2000 ms → 服务端协商为 2000 ms
  客户端请求   8000 ms → 服务端协商为 8000 ms
  客户端请求  60000 ms → 服务端协商为 20000 ms

在客户端库里设置的「会话超时」只是一个请求值。想知道真正生效的值,要看服务端:四字命令 cons 里每个连接的 to=。

自己设置的值与连接限制

实测 · 本机执行输出
  conf → {'tickTime': '500', 'minSessionTimeout': '1000', 'maxSessionTimeout': '3000', 'maxClientCnxns': '2'}
  请求 20000 ms → 协商为 3000 ms
  maxClientCnxns=2:同一个 IP 已有 2 个连接时,第 3 个客户端 → KazooTimeoutError
  此时再发四字命令 cons(也是一个连接)→ '' (空,也被拒绝)
  集群节点的 conf → {'tickTime': '2000', 'initLimit': '3', 'syncLimit': '2'}

maxClientCnxns 是按客户端 IP 统计的并发连接数上限。注意:监控脚本用四字命令也会占用名额,上限设得很小时,监控自己会被拒绝。

写错参数名

实测 · 本机执行输出
  启动成功: standalone | conf 里的 tickTime = 2000 (没有变成 1000)
  日志里提到 tickTim 的行数: 0 []

改完配置后,务必用 conf 命令确认值真的变了,不要只看进程启动成功。

分步演示

zoo.cfg 的生效值
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。四字命令白名单设为 *(默认只有 srvr 等少数命令可用,见第 66、67 篇);客户端 kazoo
    • 没有验证:全部 zoo.cfg 参数(如 autopurge、snapCount 见第 53、54 篇;forceSync 见第 55 篇)、initLimit / syncLimit 对集群行为的影响(只验证了 conf 里能看到)、动态配置文件(第 50 篇)
    京ICP备2026067502号-1京公网安备11010502063487号