CAP 原则与 BASE 理论
分布式系统有一个重要的定理:布鲁尔定理(Brewer’s theorem),也被称为 CAP 定理。该理论由 Eric Brewer 在 2000 年的 PODC 会议上提出,后被证明从而成为一个定理。
CAP 定理
分布式系统中有三个要素,一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)。CAP 定理指出,一个分布式系统不能同时满足这三个要素,最多只能同时满足其中的两个。
一致性
一致性要求在任意时刻所有节点的数据完全一致,也就是说读操作总能返回最新的数据。对于调用者而言,数据具有强一致性,也可以叫做原子一致性(Atomic Consistency)或者线性一致性(Linearizable Consistency)。
可用性
可用性是指对分布式系统的每个请求都可以在一定的时间内得到非错的响应,但是不保证获取到的数据是最新的。
分区容错性
分区容错性是指在网络分区的情况下,被分隔的节点仍能正常对外提供服务。比如:分布式系统的一个节点部署在东京,另一个节点部署在上海,它们本来能够互相通信并对外提供服务,但是可能由于海底光缆中断或者其他原因导致两个节点不能互相通信从而形成网络分区,网络分区单从字面上可以理解为系统被分隔成多个单独的部分,但是看回 CAP 的证明中对 P 的定义为:
In order to model partition tolerance, the network will be allowed to lose arbitrarily many messages sent from one node to another.
可以发现,网络分区符合该定义,但是网络丢包也同样符合,另外节点宕机造成的通信失败也符合该定义。在实际的效果上,分区相当于对通信有时限要求,分布式系统如果不能在时限内达成数据一致性,也就意味着发生了分区的情况。因此,基本上我们可以认为分区的问题无法避免,CAP 理论可以描述成:在满足分区容错的前提下,无法同时满足一致性和可用性。
对 CAP 的误解
由于分布式系统天生就要满足分区容错性,所以 CAP 理论通常被简单理解成满足分区容错下的二选一,然而实际上一致性和可用性都有不同的程度和等级,比如一致性就分为强一致性、顺序一致性(Sequential Consistency)和弱一致性。很多时候可以根据实际情况放宽约束来兼顾一致性和可用性,这就引出了 BASE 理论。
BASE 理论
BASE 理论是 Basically available(基本可用)、Soft state(软状态)和 Eventual consistency(最终一致性)的缩写。BASE 是对 CAP 中一致性和可用性权衡的结果,它强调系统基本可用,即使无法做到强一致性,也可以通过适当的方式达到最终一致性。
基本可用
基本可用是指系统在发生了不可预知的故障时,允许损失部分可用性。比如:响应时间延长、部分功能不可用等。
软状态
软状态是指允许系统中的数据存在中间状态,并认为该中间状态不会影响系统整体的可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。
最终一致性
最终一致性是指系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。在实际的工程实践中,最终一致性根据更新数据后各进程访问到数据的时间和方式的不同大致又可以分为以下五类变种:
- 因果一致性(Causal consistency)
如果进程 A 通知进程 B 它更新了数据,那么进程 B 后续的读取操作则读取 A 更新的最新数据,更新操作也必须基于最新数据,而与进程 A 没有因果关系的其他进程则没有这种限制。 - 读己所写一致性(Read your writes consistency)
如果进程 A 更新了数据,那么进程 A 的后续操作都会基于最新的数据,但是其他进程可以等待数据同步后获取到最新数据。 - 会话一致性(Session consistency)
在客户端与服务端交互的整个会话阶段保证读己所写一致性。 - 单调读一致性(Monotonic read consistency)
如果进程 A 已经读取了一个数据项的某个值后,那么后续该进程不会读到该数据项的更早的值。 - 单调写一致性(Monotonic write consistency)
保证系统对于来自同一个进程的写操作会被顺序的执行。