分布式架构之CAP理论

Posted 愉悦滴帮主)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式架构之CAP理论相关的知识,希望对你有一定的参考价值。

前言

        随着互联网行业的发展,传统的单机模式已经不能满足庞大的业务需求,其中随着业务量越来越多代码也变得越来越冗余耦合。这使得分布式系统(distributed system)正变得越来越重要,大型网站几乎都是分布式的。

        分布式系统的最大难点,就是各个节点的状态如何同步。CAP 定理是这方面的基本定理,也是理解分布式系统的起点。

        本文介绍该定理。它其实很好懂,而且是显而易见的。下面的内容主要参考了 Michael Whittaker 的文章


 CAP 定理的说明性证明

        该CAP定理是在分布式系统中的一个基本定理,指出任何分布式系统最多可以有两个以下三个属性。

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

什么是CAP定理?

        CAP 定理指出,分布式系统最多满足其中的两个特性,要么满足CA,要么CP,要么AP。无法同时满足CAP。不能同时具有一致性、可用性和分区容忍性。听起来很简单,但保持一致是什么意思?可用的?分区容忍?哎呀,你说的分布式系统到底是什么意思?

        在本节中,我们将介绍一个简单的分布式系统,并解释该系统可用、一致和分区容忍意味着什么。有关系统和三个属性的正式描述,请参阅 Gilbert 和 Lynch 的论文


分布式系统

        让我们考虑一个非常简单的分布式系统。我们的系统由两台服务器组成,G1 和 G2. 这两个服务器都在跟踪相同的变量 v,其初始值为 v0G1 和 G2 可以相互通信,也可以与外部客户端通信。这是我们的系统的样子。

客户端可以请求从任何服务器写入和读取。当服务器收到请求时,它会执行它想要的任何计算,然后响应客户端。例如,这是写入的样子。

 这是阅读的样子。

现在我们已经建立了我们的系统,让我们来看看系统的一致性、可用和分区容错意味着什么。


一致性

以下是吉尔伯特和林奇如何描述一致性:

any read operation that begins after a write operation completes must return that value, or the result of a later write operation

在写操作完成后开始的任何读操作都必须返回该值,或写操作完成后的结果

在一致的系统中,一旦客户端向任何服务器写入一个值并获得响应,它就希望从它读取的任何服务器获取该值(或更新的值)。 

1. 下面是一个不一致系统的例子。

如图:假设分布式系统有G1,G2两个节点,初始值都是v0。现在有一个client向系统中的G1节点服务写入了值v1。写完之后client再去读取这个值,这时读到了G2节点。可能由于网络延迟或一些其他问题,导致G2节点与G1节点失去连接,这时G1节点上的数据还未同步到G2节点,因此客户端读取到的是修改之前的值v0。 这就出现了不满足一致性的情况了。

相当于满足了可用性,失去了一致性。


2.另一方面,这是一个一致系统的例子。

在这个系统中,客户端client向系统中的G1节点服务写入了值v1,在向客户端发送确认之前, G1 将其值复制到 G2。因此,当客户端从G2,它获取最新的值 v: v1。

缺点:如果系统保证了强的一致性,那么在client 写完G1节点后, 而G1向G2节点同步数据出现了问题,这时如果client再去读取G2节点的数据时,client就会一直处于等待状态,因为系统内各节点数据未同步完成,需要等同步完成才能使用。

这就相当于满足了一致性,而失去了可用性。


可用性

以下是吉尔伯特和林奇如何描述可用性。

every request received by a non-failing node in the system must result in a response

系统中非故障节点收到的每个请求都必须导致响应 

在一个可用的系统中,如果我们的客户端向服务器发送请求并且服务器没有崩溃,那么服务器最终必须响应客户端。不允许服务器忽略客户端的请求。


分区容差

以下是 Gilbert 和 Lynch 描述分区的方式。

the network will be allowed to lose arbitrarily many messages sent from one node to another

网络将被允许丢失从一个节点发送到另一个节点的任意多条消息

这意味着 G1 和 G2发送的任何消息可以被丢弃。如果所有消息都被丢弃,G1节点与G2节点将没有通信。那么我们的系统将如下所示。 

我们的系统必须能够在任意网络分区的情况下正常运行才能进行分区容忍。


证据

现在我们已经熟悉了一致性、可用性和分区容错性的概念,我们可以证明一个系统不能同时拥有这三者。

假设存在一个矛盾的系统,它是一致的、可用的和分区容忍的。我们要做的第一件事是对系统进行分区。它看起来像这样。

 接下来,我们的客户端要求对G1写入v1。由于我们的系统满足可用性,G1必须回应。然而,由于网络是分区的,G1 无法将其数据复制到 G2。吉尔伯特和林奇将这个阶段称为执行阶段α1。

 接下来,我们让我们的客户端对G2节点做同样的操作,由于我们的系统满足可用性,G2必须回应。由于网络是分区的,G1无法更新G2写入后的值v1 它只能返回v0。吉尔伯特和林奇将这个阶段称为执行阶段α2。

G2 返回 v0,但是 在客户端已经将值v1写入G1节点。这就不满足不一致性。


结论:

我们说,CAP 不可能同时满足,而分区容错是对于分布式系统而言,是必须的。最后,我们说,如果系统能够同时实现 CAP 是再好不过的了,所以出现了 BASE 理论。

以上是关于分布式架构之CAP理论的主要内容,如果未能解决你的问题,请参考以下文章

分布式架构之CAP理论

分布式架构之CAP理论

12.软件架构设计:大型网站技术架构与业务架构融合之道 --- CAP理论

分布式架构之设计篇-聊聊cap

系统架构师福音—浅谈 CAP 理论

架构学习系列:了解CAP理论