「脑裂」指集群分成两半、各自选出 leader、各自接受写入。ZooKeeper 靠多数派规则避免它。这篇把 5 节点集群切成 2 | 3,持续采样所有节点的角色,看会不会同时出现两个 leader。
共采样 198 次;任一时刻同时报告 leader 的节点数最大 = 1;出现 ≥2 个 leader 的采样 0 次 多数派一侧的客户端写 /from-majority: 成功 (分区后 5358 ms)
采样用 srvr 的 Mode,间隔 100 ms,所以很短(<100 ms)的重叠可能看不到;这是实验方法的局限。理论上旧 leader 在发现失去多数派之前,确实仍认为自己是 leader,但它的任何写都因凑不齐多数派的 ack 而不能提交。
连在旧 leader 上的客户端 create /from-minority 的结果: ConnectionLoss
网络恢复后读:/from-majority → True | /from-minority → False
各节点 Mode: {'z48-1': 'follower', 'z48-2': 'follower', 'z48-3': 'follower', 'z48-4': 'follower', 'z48-5': 'leader'}
各节点 Zxid: {'z48-1': '0x300000001', 'z48-2': '0x300000001', 'z48-3': '0x300000001', 'z48-4': '0x300000001', 'z48-5': '0x300000001'}
各节点上 /from-majority 的数据: {'z48-1': b'y', 'z48-2': b'y', 'z48-3': b'y', 'z48-4': b'y', 'z48-5': b'y'}