1.CAP是什么?
CAP定理是分布式系统的基本定理,它表明任何分布式系统最多只能具备一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)这三个属性中的两个。
2.分布式系统
让我们考虑一个非常简单的分布式系统,我们的分布式系统由两台服务器组成,G1和G2。这两台服务器都跟踪同一个初始值为V0的变量V,这两台服务器可以互相通信,同时也可以和外部客户端通信,以下就是我们分布式系统的样子。
客户端可以请求从任意服务器写入和读取。当服务器接受请求时,它可以执行它想要的任意计算,然后响应给客户端。以下就是写入的样子。
以下是读取的样子。
现在我们建立了这个分布式系统,让我们来看一下一致性、可用性、分区容错性意味着什么?
3.一致性(Consistency)
以下是Gilbert and Lynch描述的一致性:
在写操作完成之后开始的任何读操作都必须返回该值,或者后续写操作的结果。
在一致性系统中,客户端给任意服务器写入值一旦得到响应后,它就希望能从任意服务器读取到那个值(即更新后的值)
以下是不一致系统的例子:
我们的客户端往G1写入一个值V1,并且得到G1的确认。但是当客户端读取G2时,它得到的是之前的值V0。
以下是一致性系统的例子:
在这个系统中,G1给客户端发送确认之前会复制自己的值V1给G2。因此,当客户端从G2读取数据时,客户端将得到最新的值V1。
4.可用性(Availability)
以下是Gilbert and Lynch描述的可用性:
系统的一个非故障节点接受每一个请求后必须返回一个响应结果。
在一个可用性系统中,如果我们客户端发送一个请求给没有崩溃的服务器,那么服务器最终必须响应客户端。服务器不允许忽略客户端的请求。
5.分区容错性(Partition Tolerance)
以下是Gilbert and Lynch描述的分区容错性:
允许网络丢失从一个节点到另一个节点的任意多条信息。
这就意味着G1和G2互相发送的任意信息都能丢失。如果所有的信息都丢失了,系统就是以下这个样子。
尽管有任意网络分区,我们的系统必须能够正常运行才能实现分区容错。
6.证明
现在,我们熟悉了一致性、可用性、分区容错性的概念。我们能够证明一个系统不能同时具备这三个属性。
假设一个矛盾,一个系统同时存在一致性、可用性、分区容错性。第一件要做的事情就是系统分区,它就是这个样子:
下一步,我们客户端发送请求将V1值写入G1。因为我们的系统是可用的,G1必须响应。因为网络是分区,所以G1不能复制自己的数据给G2。Gilbert和Lynch称这个执行阶段为α1。
再下一步,我们客户端发送读请求到G2。因为我们的系统是可用的,G2必须响应。又因为网络是分区的,G2不能从G1更新它的值。G2返回的是V0 。Gilbert和Lynch称这个执行阶段为α2。
客户端将值V1写到G1后G2返回V0给客户端,这是不一致的。
我们假设一个一致性、可用性、分区容错性系统存在。但是我们刚刚展示了对于任意的系统都存在行为不一致的执行。因此,不存在一个都满足一致性、可用性、分区容错性的系统。
如果还想学习相关文章可以去看看以下文章:
https://www.cnblogs.com/stateis0/p/9062121.html
http://www.ruanyifeng.com/blog/2018/07/cap.html
https://mwhittaker.github.io/blog/an_illustrated_proof_of_the_cap_theorem/