CAP理论
CAP理论作为分布式系统的基础理论,它描述的是一个分布式系统在以下三个特性中:
- 一致性(Consistency)
- 可用性(Availability)
- 分区容错性(Partition tolerance)
最多满足其中的两个特性。也就是下图所描述的。分布式系统要么满足CA,要么CP,要么AP。无法同时满足CAP。
什么是CAP定理
CAP定理指出,分布式系统不能同时具有一致性、可用性和分区容错性。
下边简单描述下一个简单的分布式系统,并解释该系统可用、一致和分区容错的含义。
一个分布式系统
让我们考虑一个非常简单的分布式系统。我们的系统由两台服务器组成,G1和G2。这两个服务器都在跟踪同一个变量,v,其值为初始值v0。
G1和G2可以相互通信,也可以与外部客户端通信。这是我们的系统的样子。
客户机可以请求从任何服务器进行读写。当服务器接收到一个请求时,它执行任何它想要的计算,然后响应客户端。例如,下面是写的样子。
下边是一个读的事例
现在我们已经建立了系统,让我们来看看系统的一致性、可用性和分区容错性意味着什么。
一致性
在写操作完成后的任何读操作都必须返回该值,或稍后的写操作的结果
在一个一致的系统中,一旦客户端向任何服务器写入一个值并获得响应,它就会期望从它所读取的任何服务器获得那个值(或一个新的值)。
我们先看一个非一致的系统
我们的客户端将v1写入了G1并得到了G1的确认,但是当它读取G2,它得到陈旧的数据:v0。
下边是一个一致性的系统
在此系统中,G1将其值复制到G2在向客户端发送确认之前。因此,当客户端读取G2,它获得最新的值v:v1。
可用性
在一个可用的系统中系统中一个非失败节点接收到的每个请求都必须得到响应,如果客户端向服务器发送请求,而服务器没有崩溃,那么服务器最终必须响应客户端。不允许服务器忽略客户端的请求。
Partition Tolerance
分区容错性
网络将允许任意多的从一个节点发送到另一个节点的消息丢失。
这意味着G1和G2互相发送的任何消息都是可以被丢弃的。如果所有的消息都被丢弃,那么我们的系统就会像这样。
我们的系统必须能够在任意网络分区的情况下正常工作,以便具有分区容错能力。
证明
既然我们已经熟悉了一致性、可用性和分区容错的概念,我们就可以证明系统不能同时拥有这三个概念。
为了避免矛盾,假设确实存在一个一致、可用和分区容错的系统。我们要做的第一件事是对系统进行分区。它是这样的。
接下来,我们有我们的客户端请求v1被写入G1。由于我们的系统可用,G1必须做出回应。然而,由于网络是分区的,G1无法将其数据复制到G2。吉尔伯特和林奇把这个阶段称为执行阶段α1。
接下来,我们让客户端发出一个read请求G2。因为我们的系统是可用的,G2必须做出回应。由于网络是分块的,G2无法更新其值G1。它返回v0。吉尔伯特和林奇把这个阶段称为执行阶段α2。
G2返回v0给客户端,当客户端已经将v1写入G1中。这是不一致的。
我们假设存在一个一致的、可用的、分区容错的系统,但是我们发现任何这样的系统都存在运行不一致的情况。因此,不存在这样的系统