架构设计之「 CAP 定理 」

CAP定理是分布式系统中最基础的原则。因此理解和掌握了CAP,对系统架构的设计相当重要。网络

「 CAP定理 」又被称为 布鲁尔定理,它提出对于一个分布式系统而言,不能同时知足如下三点:架构

  • Consisteny(一致性)
  • Availability(可用性)
  • Partition tolerance(分区容错性)

也就是说CAP定理指明了,任何分布式系统只能同时知足这三项中的两项。分布式

 

 

如上图,若是是最多同时知足两项,那咱们能够有三个组合:CA、CP、AP。在聊这三个组合以前,咱们先分别看一下 Consisteny(一致性)、Availability(可用性)、Partition tolerance(分区容错性)的含义。设计

假设某个系统当前有两个节点A和B,两个节点分别能够由Actor进行读写,两个节点之间的数据会自动完成同步。blog

1. Consisteny(一致性)同步

一致性的要求是指,对于任何客户端(上图Actor)来讲,每次的读操做,都能得到最新的数据。即,当有客户端向A节点写入了新数据以后,其它客户端从B节点中进行读操做所得到的数据必须也是最新的,是与A节点数据保持一致的。it

2. Availability(可用性)io

可用性的要求是指,每一个请求都能在合理的时间内得到符合预期的响应(不保证获取的结果是最新的数据)。系统架构

按照上图来看就是,客户端只要向A节点或B节点发起请求后,只要这两个节点收到了请求,就必须响应给客户端,但不须要保证响应的值是否正确。基础

3. Partition tolerance(分区容错性)

分区容错性是指,当节点之间的网络出现问题以后,系统依然能正常提供服务。

讲完了C、A、P的含义和要求,咱们继续来看看它们之间如何组合使用。

2、CAP怎么应用

有 CA、CP、AP 三种组合方式,可是在分布式系统的结构下,网络是不可能作到100%可靠的。若是选择 CA组合,放弃 P(分区容错性)。仍是以最上面的图中A和B节点来举例,当发生节点间网络故障时,为了保证 C(一致性),那么就必须将系统锁住,不容许任何写入操做,否者就会出现节点之间数据不一致了。可是锁住了系统,就意味着当有写请求进来的时候,系统是不可用的,这一点又违背了 A(可用性)原则。

所以分布式系统理论上是不可能有CA组合的,因此咱们只能选择 CP 和 AP组合架构。

下面咱们来详细看一下  CP架构 和 AP架构的特色:

CP 架构

CP架构即 Consisteny(一致性)与 Partition tolerance(分区容错性)的组合。

 

 

1. 如上图,因为网络问题,节点A和节点B以前不能互相通信。当有客户端(上图Actor)向节点A进行写入请求时(准备写入Message 2),节点A会不接收写入操做,致使写入失败,这样就保证了节点A和节点B的数据一致性,即保证了Consisteny(一致性)。

而后,若是有另外一个客户端(上图另外一个Actor)向B节点进行读请求的时候,B请求返回的是网络故障以前所保存的信息(Message 1),而且这个信息是与节点A一致的,是整个系统最后一次成功写入的信息,是能正常提供服务的,即保证了Partition tolerance(分区容错性)。

上述状况就是保障了CP架构,但放弃了Availability(可用性)的方案。

2. AP 架构

AP架构即 Availability(可用性)与 Partition tolerance(分区容错性)的组合架构。

 

 

如上图,因为网络问题,节点A和节点B以前不能互相通信。当有客户端(上图Actor)向节点A进行写入请求时(准备写入Message 2),节点A容许写入,请求操做成功。但此时,因为A和B节点以前没法通信,因此B节点的数据仍是旧的(Message 1)。当有客户端向B节点发起读请求时候,读到的数据是旧数据,与在A节点读到的数据不一致。但因为系统能照常提供服务,因此知足了Availability(可用性)要求。

所以,这种状况下,就是保障了AP架构,但其放弃了 Consisteny(一致性)。

以上,就是对CAP定理的一些思考。但愿对你们有所帮助。

参考 https://mp.weixin.qq.com/s/BtHPlZOvy8HNK1TuOrDxLA

相关文章
相关标签/搜索