5.2 一致性与可用性的权衡
CAP 是分布式系统中进行平衡的理论,也是理解分布式系统的起点。1999 年,美国工程院院士 Eric A.Brewer 发表的论文 “Harvest, Yield, and Scalable Tolerant Systems”[1] 中,首次提出了 CAP 原理(CAP principle)。一年之后,Eric A.Brewer 又在 PODC 大会上演讲了名为“Towards robust distributed systems”的主题[2],会上又详细介绍了 CAP 原理,之后 CAP 的概念开始流传。
虽然 Eric A.Brewer 提出了 CAP,但此时的 CAP 仅是一种猜想,并没有被从理论上证明。
2002 年,麻省理工学院的 Seth Gilbert 和 Nancy Lynch 联合发表了一篇论文[3],用严谨的数学推理证明了 CAP 的正确性,此后 CAP 从原理转变成定理,并开始深远地影响着分布式系统领域。
CAP 定理描述的是一个分布式系统中,涉及共享数据问题时,以下三个特性最多只能同时满足其中两个。
- 一致性(Consistency):代表数据在任何时刻、任何分布式节点中所看到的都是符合预期的。基于证明严谨性的考虑,在学术的研究中一致性指的是强一致性(Strong Consistency)或者也叫做线性一致性(Linearizability)。
- 可用性(Availability):代表系统不间断地提供服务的能力,理解可用性要先理解与其密切相关两个指标:可靠性(Reliability)和可维护性(Serviceability)。可靠性使用平均无故障时间(Mean Time Between Failure,MTBF)来度量;可维护性使用平均可修复时间(Mean Time To Repair,MTTR)来度量。可用性衡量系统可以正常使用的时间与总时间之比,其表征为:A=MTBF/(MTBF+MTTR),即可用性是由可靠性和可维护性计算得出的比例值,譬如 99.9999%可用,即代表平均年故障修复时间为 32 秒。
- 分区容错性(Partition tolerance):代表分布式环境中部分节点因网络原因而彼此失联后,即与其他节点形成“网络分区”时,系统仍能正确地提供服务的能力。x
额外知识
笔者在这里提前补充一点:对一个分布式系统,因为必须要实现分区容错性,不能舍弃 P,CAP 其实是二选一(AP 和 CP 之间)而不是三选二而的权衡。
由于论文的定义非常苛刻,让很多系统既不是 CP,也不是 AP 类型的系统,而是处于这两个分类之外的状态,AP/CP 的二分法就不那么准确,Eric A.Brewer 在论文中还提出了弱 CAP 原则(weak CAP principle):
弱 CAP 原则
The stronger the guarantees made about any two of strong consistency, high availability, or resilience to partitions, the weaker the guarantees that can be made about the third.
在强一致性、高可用性、分区容错性三个属性中,任意两个属性越强,第三个属性就越弱。
不管是 CAP 定理还是弱 CAP 原则,都在说明可用性和一致性之间是对立的,需要在他们之间做出权衡。CAP 定理对 C 和 A 的定义非常严苛,只能衡量很少一部分系统,而弱 CAP 原则则给出了一种更普适的权衡。
由于 CAP 定理已有严格的证明,本节不去探讨为何 CAP 不可兼得,而是直接分析如果舍弃 C、A、P 时所带来的不同影响。
- 放弃分区容忍性(CA without P):意味着我们将假设节点之间通信永远是可靠(注意,笔者开篇的分布式八大缪误),永远可靠的通信在分布式系统中必定不成立,只要用到网络来共享数据,分区现象就会始终存在。没有 P,也谈不上是什么分布式系统。
- 放弃可用性(CP without A):意味着我们将假设一旦网络发生分区,节点之间的信息同步时间可以无限制地延长。在现实中,选择放弃可用性的 CP 系统情况一般用于对数据质量要求很高的场合中。
- 放弃一致性(AP without C):意味着我们将假设一旦发生分区,节点之间所提供的数据可能不一致。选择放弃一致性的 AP 系统目前是设计分布式系统的主流选择,因为 P 是分布式网络的天然属性,你再不想要也无法丢弃;而 A 通常是建设分布式的目的,如果可用性随着节点数量增加反而降低的话,分布式系统也就失去了存在的价值,除非银行、证券这些涉及金钱交易的服务,宁可中断也不能出错,否则多数系统是不能容忍节点越多可用性反而越低。
CAP 的定理讲完了,不知你是否对”放弃一致性,AP 系统反而成了分布式系统的主流“这个结论感到无语,“事务”原本的目的就是获得“一致性”,而在分布式环境中“一致性”却不得不成为通常被牺牲、被放弃的那一项属性。但无论如何,我们设计系统终究还是要确保操作结果至少在最终交付的时刻是正确的,这个意思是允许数据中间不一致,但应该在输出时被修正过来。
为此,工程师们又重新给一致性下了定义,将 CAP、ACID 中讨论的一致性称为强一致性,而把牺牲了 C 的 AP 系统但又要尽可能获得正确结果的行为称为追求”弱一致性“。不过,如果只单纯说”弱一致性“,那其实就是不保证一致性的意思。在弱一致性里,工程师又总结出稍微强一点的特例,被称为最终一致性。
最终一致性的概念来源于 eBay 的系统架构师 Dan Pritchett 在 ACM 发表了论文 “Base: An Acid Alternative“。该论文中 Dan Pritchett 基于实践总结出一种独立于 ACID 获得强一致性之外的、通过引入消息队列和幂等来达成一致性目的系统化技术手段。最终一致性的概念与 ACID 强一致性对立,因为 ACID 在英文中有的”酸“的含义,这个模型明显刻意拼凑成 BASE(BASE 英文中有碱的含义)。有 ACID vs BASE(酸 vs 碱)这个计算机浑然天成的梗,Dan Pritchett 论文被广泛传播,BASE 理论和最终一致性也被大家熟悉。
BASE 分别是 Basically Available(基本可用)、Soft State(软状态)和 Eventually Consistent(最终一致性)三个短语的缩写。其核心思想是在某些场景中,无需做到强一致性,以保证系统的可用性,同时业务系统可采用适当的方式使数据达到最终一致性。
额外知识
ACID 在英文中有的”酸“的含义,对应系统设计的强一致性,而 BASE 在英文中有”碱“的含义,对应系统放弃强一致性实现可用性的设计。酸 vs 碱衍生出 CAP 中的 AP 型可用性架构和 CP 型强一致性架构,所以 CAP 理论又戏称度量分布式系统的”Ph试纸“。