Lihang Liu's Homepage

CAP 理论和 PACELC 理论

CAP 理论

CAP 理论阐述的是,一个分布式系统不可能同时满足一致性(consistency)、可用性(availability)和分区容错性(partition tolerance)这 3 个特性,至多只能满足其中的两个,实际上要么满足 CP(一致性+分区容错性),要么满足 AP(可用性+分区容错性)。

一致性 consistency

读请求(read request)总是能得到最新的值,也就是说,在任何时间,分布式系统中所有节点对于任一一个值存储的都是相同版本。这便是一致性。

可用性 availability

可用性意思是,每一个请求都能够收到非异常返回,但并不保证请求拿到的值就是最新的值。

分区容错性 partition tolerance

分区(partition)意味着分布式系统的任意一对节点出现了通讯中断。而分区容错性则要求,即便在内部节点出现故障时,整个系统依然能够运行,部分节点之间的网络异常不会导致整个系统的失效。

分区容错的必要性

分区容错性是一个分布式系统不可或缺的特性,因为任何系统的任意节点之间都有可能出现网络故障。当一个系统出现分区,部分内部节点无法访问彼此的时候,必须要在一致性和可用性之间做出选择:是为了保障服务依然可用而损害一致性呢,又或者是保障一致性而拒绝服务?

举个例子,考虑上图的情况,假设有两个节点 A 和 B 之间发生了分区的情况,当用户先向节点 B 给 X 变量写一个值后,从节点 A 读取 X 变量,那么系统面临着两个选择:

  • 它可以选择其中一个请求返回失败,但这样就损害了可用性
  • 它可以处理两个请求,但是针对读请求返回一个旧的值,但这样就破坏了一致性

因此,我们能够得出结论:

实际上,CAP 理论要求一个分布式系统在内部节点发生网络故障,分区错误发生时,要么选择保留一致性,要么选择维护可用性。

PACELC 理论

PACELC 理论是 CAP 理论的补充,以下这段文字摘抄自维基百科 PACELC theorem - Wikipedia,它指出了 PACELC 这几个字母的缩写是怎么来的:

In theoretical computer science, the PACELC theorem is an extension to the CAP theorem. It states that in case of network partitioning (P) in a distributed computer system, one has to choose between availability (A) and consistency (C) (as per the CAP theorem), but else (E), even when the system is running normally in the absence of partitions, one has to choose between latency (L) and consistency (C).

一个分布式系统也不会一直面临着分区网络故障,当内部节点之间不存在通讯问题时,一致性和可用性都是可以得到保证的,特别是可用性基本不会出现问题。

不过,为了保证一致性,数据在节点之间进行复制时会需要一定的时间,这部分复制时间可能会给用户请求带来不小的延迟,因此,在一致性和延迟(latency)之间有存在利弊权衡:

  1. 系统可以牺牲一致性,不等待值在所有节点写入完成;或者
  2. 保证强一致性,但请求需要等待值在各个节点完成写入后才能够收到返回

基于 PACELC 理论的系统分类

我们可以根据系统是否发生了分区错误、分区错误发生时选择维持哪种特性(C 或 A),以及未发生分区错误时系统是否想要保持强一致性,来给分布式系统做如下 4 种分类:

分区错误发生时 系统没有分区错误
AP EL
AP EC
CP EL
CP EC

其中的 E 表示 else,举例来说,AP/EL 系统在分区错误发生时希望维持系统的可用性,除此之外也就是内部节点没有网络故障时,希望保持低延迟。

一般来说,一个系统要么希望是高可用、低延迟的,要么总是要求强一致性,因此大多数系统都落到了 AP/EL 或 CP/EC 这两个类别之中。