bigywater.tech
ZooKeeper · 30

Quorum 多数派

「ZooKeeper 集群要奇数个节点」是怎么来的?这篇不推导公式,直接起 3、4、5 个节点的集群,杀掉不同数量的节点,看剩下的能不能继续写。

多数派 = ⌊N/2⌋+1
需要超过一半的投票节点存活
4 节点 = 3 节点
都只容忍 1 个故障,4 节点的多数派是 3
5 节点容忍 2 个
杀 2 个能写,杀 3 个不能

逐个组合验证

实测 · 本机执行输出
     节点数 N    多数派   杀掉 k 剩余模式                               能写?   
         3      2      1 ['leader', 'follower']             能     
         3      2      2 ['不服务']                            不能    
         4      3      1 ['follower', 'leader', 'follower'] 能     
         4      3      2 ['不服务', '不服务']                     不能    
         5      3      2 ['leader', 'follower', 'follower'] 能     
         5      3      3 ['不服务', '不服务']                     不能    

「能写」的判定是:对存活节点建立连接并创建、删除一个临时节点(6 秒内)。「不服务」是 srvr 返回的「not currently serving requests」。

为什么取奇数

从实测结果就能看出:3 → 4 个节点,容忍的故障数没有增加(都是 1),但多数派变大了,每次写要等更多节点确认。5 个节点才把容忍数提高到 2。选奇数是在同样容忍度下用最少的节点。

分步演示

多数派
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。3/4/5 个节点的伪集群,kill -9 杀掉前 k 个节点(含 leader 时需要重新选举),等 3 秒后判定;每种组合一次
    • 没有验证:6 节点及以上、杀掉的节点恰好是 follower 还是 leader 的区别、observer 的影响(第 28 篇)、自定义分组仲裁(hierarchical quorum)
    京ICP备2026067502号-1京公网安备11010502063487号