【软件设计原则】系统设计面试基础:CAP 与 PACELC

【软件设计原则】系统设计面试基础:CAP 与 PACELC
最新回答
夏天晴

2026-03-28 09:06:54

CAP 与 PACELC 在系统设计面试中的基础理解

CAP 定理

CAP 定理是分布式系统设计中的一个核心指导原则,它指出分布式系统不可能同时满足以下三个理想属性:

  • 一致性(Consistency):所有节点同时看到相同的数据。这意味着用户可以读取或写入系统中的任何节点并接收相同的数据,相当于拥有一个最新的数据副本。
  • 可用性(Availability):系统中非故障节点收到的每个请求都必须产生响应。即使发生严重的网络故障,每个请求也必须终止。简单来说,可用性是指即使系统中的一个或多个节点出现故障,系统仍保持可访问性的能力。
  • 分区容差(Partition tolerance):分区是系统中任意两个节点之间的通信中断(或网络故障),即两个节点都已启动但无法相互通信。分区容错系统能够继续运行,即使系统中有分区。这样的系统可以承受任何不会导致整个网络故障的网络故障,数据在节点和网络的组合之间得到充分复制,以使系统在间歇性中断时保持正常运行。

根据 CAP 定理,任何分布式系统都需要从这三个属性中选择两个。实际上,由于在网络分区的情况下,不能容忍分区的系统将被迫放弃一致性或可用性,因此 CAP 定理可以表述为:在存在网络分区的情况下,分布式系统必须选择一致性或可用性。

CAP 定理的证明

我们无法构建一个持续可用、顺序一致且能容忍任何分区故障的通用数据存储。因为为了保持一致,所有节点都应该以相同的顺序看到相同的更新集。但是,如果网络丢失了一个分区,则一个分区中的更新可能无法在客户端读取最新分区后从过期分区读取之前到达其他分区。应对这种可能性的唯一方法是停止为来自过期分区的请求提供服务,但随后该服务将不再 100% 可用。

CAP 定理的局限性

CAP 定理主要关注的是在存在网络分区时,分布式系统应如何在一致性和可用性之间进行选择。然而,它并没有说明在没有网络分区时,分布式系统应如何运作。

PACELC 定理

为了弥补 CAP 定理的这一局限性,PACELC 定理被提出。PACELC 定理指出,在复制数据的系统中:

  • 如果存在分区(“P”),分布式系统可以在可用性和一致性(即“A”和“C”)之间进行权衡;
  • 否则(‘E’),当系统在没有分区的情况下正常运行时,系统可以在延迟(‘L’)和一致性(‘C’)之间进行权衡。

PACELC 定理的第一部分(PAC)与 CAP 定理相同,而 ELC 是对 CAP 定理的扩展。它假设我们通过复制来保持高可用性,因此当出现故障时,CAP 定理占上风。但如果不是,我们仍然需要考虑复制系统的一致性和延迟之间的权衡。

例子

  • Dynamo 和 Cassandra:它们是 PA/EL 系统,在发生分区时选择可用性而不是一致性;否则,它们会选择较低的延迟。
  • BigTable 和 HBase:它们是 PC/EC 系统,总是会选择一致性,放弃可用性和更低的延迟。
  • MongoDB:在默认配置下,MongoDB 可以被认为是 PA/EC 系统。在主要/次要配置中,所有写入和读取都在主节点上执行。由于所有复制都是异步完成的,当存在主节点丢失或在少数节点上被隔离的网络分区时,可能会丢失未复制到辅助节点的数据,因此会丢失分区期间的一致性。然而,在 MongoDB 配置为在多数副本上写入并从主副本上读取时,它可以归类为 PC/EC。

结论

CAP 和 PACELC 定理为分布式系统在各种分布式特性(如一致性、可用性、分区容限和延迟)之间选择理想的平衡提供了指导。这些定理是系统设计面试中的重要基础,有助于理解如何在不同的分布式系统场景中做出权衡和决策。

以上图示分别展示了 CAP 定理和 PACELC 定理的核心内容,有助于更直观地理解这两个定理在分布式系统设计中的应用。