bigywater.tech
ZooKeeper · 19

maxClientCnxns 连接限制

maxClientCnxns 限制的是每个客户端 IP 的并发连接数。超过之后客户端看到的是什么?怎么释放?0 是什么意思?还有没有全局上限?这篇逐项验证。

5 成功 / 3 超时
maxClientCnxns=5 时,同一 IP 开 8 个客户端
日志里找原因
客户端只看到连接超时,拒绝原因只在服务端日志
maxClientCnxns=0
表示不限制;全局上限是另一个参数 zookeeper.maxCnxns

每个 IP 的上限

实测 · 本机执行输出
  成功 5 个,失败(连接超时)3 个
  服务端日志里「Too many connections」共 22 行,例: Message:Error accepting new connection: Too many connections from /127.0.0.1 - max is 5 Value:null

本机所有客户端都来自 127.0.0.1,所以同一个 IP 的限制很容易触发。生产环境里,如果客户端经过 NAT 或代理,大量客户端会共用一个源 IP,更容易撞上这个限制。(NAT 场景本文没有测。)

释放与不限制

实测 · 本机执行输出
  关闭 1 个后,新客户端连接:成功
  成功 80 个,失败 0 个;服务端连接数 81

全局上限

实测 · 本机执行输出
  成功 4 个,失败 4 个
  日志: ['maxCnxns configured value is 4.', 'Too many connections 4 - max is 4']

分步演示

连接数限制
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。单机,每个场景一个新实例;客户端是 kazoo(连接超时设 4 s);全局上限用 -Dzookeeper.maxCnxns=4
    • 没有验证:Netty 连接工厂下的行为、不同源 IP 之间互不影响(本机只有 127.0.0.1)、连接限流 connection throttling(BlueThrottle)、限制值与线程 / 文件描述符的关系
    京ICP备2026067502号-1京公网安备11010502063487号