一致性与 Quorum⚓︎
在分布式系统中共识算法和数据复制协议中,超过半数规则与 Quorum(法定人数)机制是确保强一致性(Strong Consistency)和分区容错性(Partition Tolerance)的底层基石。
超过半数(Majority)的理论基础⚓︎
1. 脑裂的预防机制(Split-Brain Prevention)⚓︎
当网络链路断开,将系统分割为两个或多个子网络时,必须防止不同子网络各自选举出独立的领导者并处理写请求,这种现象称为脑裂(Split-Brain)。
采用超过半数规则,意味着在任何分区中,最多只能有一个子网络包含超过半数的节点。包含多数节点的子网络可以继续完成选举和写入,而少数节点子网络由于无法凑齐半数确认,其操作将被阻塞。这从物理结构上防止了数据分歧。
2. 容错率与可用性的数学平衡⚓︎
将阈值设定为超过半数是在容错能力和系统可用性之间取得的数学平衡。
在 CFT 模型中,系统总节点数公式为 N = 2f + 1。如果要求 f + 1 个节点存活即可工作,系统最多可以容忍 f 个节点宕机。这是在保证任意两个多数派集合必定相交的前提下,允许宕机节点数量的最大化。如果提高确认阈值(如要求 80% 节点确认),系统的容错节点数将会减少,整体可用性反而降低。
Quorum 交集性质⚓︎
在无主复制(Leaderless Replication)的分布式存储中,为了保证读取操作能获取到最新的写入数据,系统读写法定节点数之和必须大于系统总节点数:
- W:写入操作必须获得确认的节点数。
- R:读取操作必须访问的节点数。
- N:系统总节点数。
当设定 W 和 R 都为超过半数(即 \lfloor N/2 \rfloor + 1)时,根据鸽巢原理,任意一个执行写操作的节点集合与执行读操作的节点集合必定存在交集节点。该交集节点保存了最新的数据和版本号。读操作通过比对版本号,确保客户端读取的是最新写入的数据,从而实现逻辑上的线性一致性(Linearizability)。
容错阈值的区别⚓︎
分布式系统中的多数派阈值与所选择的容错模型直接相关:
- CFT 模型:系统总节点数必须达到 N \ge 2f + 1。
- BFT 模型:为确保响应中的正常节点数严格大于恶意节点数,需要满足 (N - f) - f > f,即系统总节点数必须达到 N \ge 3f + 1。因此 BFT 的容错阈值提升至超过三分之二。
宽松的法定人数与提示移交(Sloppy Quorum & Hinted Handoff)⚓︎
在实际工程中,网络分区或节点宕机可能导致读写请求无法达到 Quorum 阈值,从而使得系统整体不可用。在一些强调可用性(如基于 Dynamo 论文的系统)的无主复制模型中,引入了宽松的法定人数(Sloppy Quorum)与提示移交(Hinted Handoff)机制。
当目标节点由于网络分区暂时不可达时,系统会将数据暂存到网络上能够连接的其他健康节点上。该暂存操作虽然打破了严格的 W + R > N 交集保证,但是在节点故障时允许系统接收写入,从而极大提升了系统的持续可用性。
当网络连接恢复或者目标节点重新上线后,暂存节点会通过后台任务开启提示移交(Hinted Handoff)流程,将之前暂存的数据重新同步回原始目标节点,确保集群状态达到最终一致。
并发冲突与读修复(Read Repair)⚓︎
在 Quorum 交集模型下,系统允许客户端通过比对版本号读取到最新的写入结果。但这并未彻底解决高并发下的写入冲突与落后数据更新问题。
- 读修复(Read Repair):当客户端通过 Quorum 机制发起读请求,并在多个副本的响应数据中发现某些节点的数据版本(版本号或时间戳)已经落后时,系统或客户端将在后台或同步触发读修复流,主动将最新数据推送给过时节点,从而修补副本间的差异。
- 反熵纠错(Anti-Entropy):除了读修复以外,多数无主存储还会依靠后台机制定期执行反熵操作以补偿数据同步。节点之间会通过 Merkle Tree(默克尔树)来高效比对数据的整体哈希散列差异,进而主动发现并修补未被客户端大量读取所触发修复的冷数据,以此强化集群全量状态的一致性担保。