bigywater.tech
ZooKeeper · 69

ZooKeeper 滚动升级

升级 ZooKeeper 不应该停服务。这篇用官方发行包的 3.8.4 起一个 3 节点集群,持续写入的同时逐个节点升级到 3.9.6,看混合版本能不能工作、每一步对客户端的影响多大。

3.8.4 → 3.9.6
混合版本的集群正常服务,最终 3 个节点都是 3.9.6
761 ms
升级 leader 时写入的最长间隔(重新选举)
0 个丢失
309 个已确认的写入全部保留

起点

实测 · 本机执行输出
   {'z69-1': '3.8.4 follower', 'z69-2': '3.8.4 leader', 'z69-3': '3.8.4 follower'}

逐个节点升级

实测 · 本机执行输出
  步骤                        耗时 s        该步写入最长间隔 ms  升级后版本与角色(全体)
  升级 z69-1(follower)     1.2                450  {'z69-1': '3.9.6 follower', 'z69-2': '3.8.4 leader', 'z69-3': '3.8.4 follower'}
  升级 z69-3(follower)     1.2                 25  {'z69-1': '3.9.6 follower', 'z69-2': '3.8.4 leader', 'z69-3': '3.9.6 follower'}
  升级 z69-2(leader)     1.3                761  {'z69-1': '3.9.6 follower', 'z69-2': '3.9.6 follower', 'z69-3': '3.9.6 leader'}

顺序是先 follower、最后 leader,这样 leader 只需要变换一次。每次都等升级的节点 zxid 追上 leader 再继续下一个。

结果

实测 · 本机执行输出
  版本与角色: {'z69-1': '3.9.6 follower', 'z69-2': '3.9.6 follower', 'z69-3': '3.9.6 leader'}
  写线程确认的写入 309 个,失败(异常)的调用 2 次;确认后丢失 0 个
  新版本的 znode 数据与升级前一致:/up 下子节点数 309 | zxid 一致: True

只验证了这一对版本

本文只测了 3.8.4 → 3.9.6。其它版本之间(尤其跨大版本如 3.4 → 3.5 以上)有各自的升级注意事项(例如配置格式、动态配置),没有测。升级前仍应阅读目标版本的发行说明,并先备份(第 59 篇)。

分步演示

滚动升级
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。3.8.4 来自 archive.apache.org 的 apache-zookeeper-3.8.4-bin.tar.gz;写线程是 kazoo,每 10 ms 一次;3 节点伪集群
    • 没有验证:跨更多版本的升级、降级、客户端库对服务端版本的兼容、升级过程中配置参数的差异、客户端(Java / Go)在升级中的行为
    京ICP备2026067502号-1京公网安备11010502063487号