画图证明CAP理论
Posted IT原理
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了画图证明CAP理论相关的知识,希望对你有一定的参考价值。
https://mwhittaker.github.io/blog/an_illustrated_proof_of_the_cap_theorem/
CAP理论是分布式系统的基础理论.CAP理论阐述到,任意的分布式系统最多含有下列三个属性中的最大两个.
一致性
可用性
分区容忍性
CAP理论讲到分布式系统是不能同时具有一致性,可用性以及分区容忍的.听起来非常简单,但是一致性\可用性\分区容忍性都是什么意思呢?
在这个章节中,我们将要介绍一个简单的分布式系统,并且解释在这个系统里,一致性\可用性\分区容忍性都意味着什么.
让我们试想一个简单的分布式系统。这个系统有两个服务器G1、G2组成。这两个服务器都持有相同的变量V,其初始值为v0。G1和G2之间可以进行通信,并且可以与外部的客户端进行交互.下面是我们系统的样子.
客户端可以请求对任意服务器进行读写.当服务端收到请求时候,会进行必要的计算然后进行响应. 下面是写请求的系统图.
下面是读请求看起来的样子:
目前我们的系统已经建立起来了,让我们过一下一致性/可用性/分区容忍性对这个系统意味着什么.
在一致性系统里,一旦将值写入到任意的服务器并且得到响应,并且从任意的其它服务器中能够获取到最新值.
下面是非一致性系统样子:
客户端将V1写入到G1,并且G1进行了确认.但是当从G2读取的时候,读取的是过期值V0.
另一方面,下面是一致性系统的例子.
在这个系统里, G1在对客户端进行确认前,会将它的值备份到G2上.因此当客户端从G2读取的时候,会读取最新的值V1.
系统里任一个非奔溃节点在收到请求的之后,必须给出响应结果.
在一个可用的系统里,如果客户端发送请求到服务器,并且服务器没有崩溃,那么服务器最终必须对客户端进行响应.服务器不允许忽略请求.
允许网络将一个节点发送到另一个节点的任意消息丢弃
这意味着G1和G2发送到另一个节点的消息可以丢弃.如果所有的消息都被丢弃,那么我们系统就看起来如下图这样:
为了分区容忍性,尽管任意的网络分区,我们的系统必须能够正确的提供功能。
现在我们已经对一致性、可用性、分区容忍性的概念熟悉了,我们就可以证明一个系统里不能同时拥有三个特性.
为了反向证明,假设存在一个一致的,可用的,分区容忍的系统.第一件事就是将系统进行分离.看起来是这个样子的.
下一步,我们有个客户端,请求将v1写入G1。因为我们的系统是可用的,所以 G1必须进行响应.因为网络是分离的,所以说G1不能将它的值备份到G2.
下一步,客户端发送一个对G2的读请求.又一次,因为我们系统是可用的,G2必须进行响应.并且因为网络是分离的,G2不能更新来自G1的值,G2会返回V0.
在客户端已经将v1写入到G1后,G2返回V0给客户端.这是不一致的.
我们假设一致的,可用的,分区容忍的系统存在是存在的,但是我们刚看到这样系统的情况下,实际上这样的系统是不一致的.
因此是没有这样的系统的.
个人总结:
CAP分别都是什么意思?
C:强一致性.所有分布式节点在任意时刻都是强一致的
A: 基本可用性
P: 分区容忍性
能否同时支持CAP和CA?
当发生网络分区时,也就不能保证一致性和可用性.因为节点数据不能同步,所以一致性无法满足. 同时因为网络问题,可用性也就不能保证了.
因此只能在AP和CP里选择一个.
AP: 暂时牺牲节点间的强一致性,保证可用性和分区容忍性.
CP: 暂时牺牲可用性,保证一致性和分区容忍性. 当网络分区发生时,为了保证一致性,返回客户端为error.
以上是关于画图证明CAP理论的主要内容,如果未能解决你的问题,请参考以下文章