CAP 理论是分布式系统的基本定理,也是我们理解分布式系统的起点。

1. CAP 理论

1998 年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标:

  • Consistency 一致性
  • Availability 可用性
  • Partition tolerance 分区容错性

并且在分布式系统中,三者不可兼得。这就是 CAP 定理

CAP理论

1.1 Consistency 一致性

一致性指的是在分布式系统中,是否所有节点都拥有数据的最新版本。

当其中一个节点的数据被更新时,如果其它节点的数据没有得到更新,用户再读取到的可能就是其它节点的旧数据,此时就出现了数据不一致的情况。

如果能保证当某一节点更新时,所有用户都能读取到数据的最新版本,就能说该分布式系统拥有强一致性

从 CAP理论 我们可以得知三者无法兼得,但选择 AP 并不意味着完全放弃 C,只是无法实现强一致性。一致性是分为多个级别的:

  • 强一致性:保证所有节点都拥有数据的最新版本,用户读取的永远是最新值
  • 弱一致性:无法保证立刻能取得最新值,但在一定时间后或许能实现一致
  • 最终一致性:弱一致性的特殊形式,指的是能保证数据在更新前,返回最新值。最终一致性是目前在工业界在大型分布式系统上广泛使用的一种一致性模型

1.2 Availability 可用性

可用性指的是在分布式系统中,系统提供的服务必须一直处于可用的状态,对用户的所有请求都必须能在有限时间内响应。

其中,有限时间指的是在系统设计之初就就设定好的指标。响应指的是系统在处理完后应该返回一个明确的结果而不该令用户感到困惑。

和一致性一样,这里的可用性指的是极致可用性。可用性的值域可以定义成0到100%的连续区间。

1.3 Partition tolerance 分区容错性

在分布式系统中,一般节点在各个网络中应该是连通的,然而由于网络或其它原因,节点之间的通信可能会失败,网络就给划分成了若干区域,这些区域就是分区。

假设当某项数据只存储在系统的一个节点中,当出现分区时,这个数据就可能无法被访问;或者用户的某些操作在系统中涉及多个节点,但由于分区使得操作无法进行,这些都是难以接受的。所以分区容错性就是在网络出现分区时,系统依然能够正常运行,或者说依然能保证一致性或可用性。

准确的定义是:

In order to model partition tolerance, the network will be allowed to losearbitrarily many messages sent from one node to another.

系统能够容忍节点间通信时丢失任意多的消息

2. 矛盾与选择

CAP 理论告诉我们,一致性、可用性和分区容错性无法兼得,为什么三者无法同时成立呢?我们先来考虑能选择的三种情况。

2.1 CA

放弃分区容错性,强一致性和极致可用性是可以保证的,但这意味着不允许系统中存在分区。实际上这在分布式系统中几乎是不可能的,由于各种天灾人祸,分区无法避免。所以 CA 系统基本就是传统的单机系统。或者说,分布式系统无法舍弃 P ,我们也默认 P 是必须实现的。

2.2 CP

降低对可用性的要求,追求强一致性和分区容错性。相当于对数据的任何操作都需要在节点间同步,而分区问题可能导致同步时间无限延长,可用性便降低了。

2.3 AP

追求可用性并允许分区,则当分区发生时,为了能够保持可用性,每个节点只能用本地的可能是过时的数据来提供服务,这就放弃了强一致性。AP 还是目前大多数分布式系统的选择。