「ZooKeeper 集群要奇数个节点」是怎么来的?这篇不推导公式,直接起 3、4、5 个节点的集群,杀掉不同数量的节点,看剩下的能不能继续写。
节点数 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。选奇数是在同样容忍度下用最少的节点。