5.2 一致性与可用性的权衡 CAP 是分布式系统中关于一致性与可用性权衡的理论,是理解分布式系统的起点。 1999 年,美国工程院院士 Eric A.Brewer 发表的论文《Harvest, Yield, and Scalable Tolerant Systems》[^1] 中,首次提出了 CAP 原理(CAP Principle)。不过彼时的 CAP 仅是一种猜想,尚未得到理论上的证明。2002 年,麻省理工学院的 Seth Gilbert 和 Nancy Lynch 用严谨的数学推理证明了 CAP 的正确性。 此后,CAP 从原理转变成定理,在分布式系统领域产生了深远的影响。
CAP 是分布式系统中关于一致性与可用性权衡的理论,是理解分布式系统的起点。
1999 年,美国工程院院士 Eric A.Brewer 发表的论文《Harvest, Yield, and Scalable Tolerant Systems》1 中,首次提出了 CAP 原理(CAP Principle)。不过彼时的 CAP 仅是一种猜想,尚未得到理论上的证明。2002 年,麻省理工学院的 Seth Gilbert 和 Nancy Lynch 用严谨的数学推理证明了 CAP 的正确性。
此后,CAP 从原理转变成定理,在分布式系统领域产生了深远的影响。
:::center
图 5-1 CAP 定理
:::
CAP 定理描述的是一个分布式系统中,涉及共享数据问题时,以下三个特性最多只能同时满足其中两个。
:::tip 额外知识
对于分布式系统而言,必须实现分区容错性(P)。因此,CAP 定理实际上要求在可用性(A)和一致性(C)之间进行选择,即在 AP 和 CP 之间权衡取舍。
:::
由于 CAP 定理已有严格的证明,本节不去探讨为何 CAP 不可兼得,而是直接分析如果舍弃 C、A、P 时所带来的不同影响。
从上述分析可以看出,原本事务的主要目的是保证“一致性”。但在分布式环境中,一致性往往不得不成为牺牲的属性,AP 类型的系统反而成为了分布式系统的主流。但无论如何,我们设计系统终究还是要确保操作结果至少在最终交付的时刻是正确的,这个意思是允许数据中间不一致,但应该在输出时被修正过来。
为此,工程师们又重新给一致性下了定义,将 CAP、ACID 中讨论的一致性(C)称为“强一致性”,而把牺牲了 C 的 AP 系统但又要尽可能获得正确结果的行为称为追求“弱一致性”。
不过,若只是单纯地谈论“弱一致性”,通常意味着不保证一致性。在弱一致性中,工程师们进一步总结出了一种较强的特例,称为“最终一致性”(Eventual Consistency),它由 eBay 的系统架构师 Dan Pritchett 在 BASE 理论中提出。
:::tip 额外知识
ACID 在英文中有的“酸”的含义,对应系统设计的强一致性,而 BASE 在英文中有“碱”的含义,对应系统放弃强一致性实现可用性的设计。酸 vs 碱衍生出 CAP 中的 AP 型可用性架构和 CP 型强一致性架构,所以 CAP 理论又戏称度量分布式系统的“Ph试纸”。
:::