CAP 原理详细分析

CAP  原理(也称为Brewer定理)指出,分布式数据库系统只能保证以下三个特征中的两个:一致性、可用性和分区容错性。

CAP 定理
CAP 定理

一致性(Consistency)

如果所有节点同时看到相同的数据,则认为系统是一致的。 注意, 这里的一致性指的是强一致性,也就是数据更新完,访问任何节点看到的数据完全一致,要和弱一致性,最终一致性区分开来。

CAP-一致性
CAP-一致性

简而言之,如果我们在一致的系统上执行读取操作,则它应该返回最新写入操作的值。 这意味着,读取应该使所有节点返回相同的数据,即最近写入的值。

可用性(Availability)

分布式系统中的可用性可确保系统 100% 的时间保持运行,即高可用性。 不管节点的状态如何,每个请求都会得到一个(非错误)响应。也就是说,任何没有发生故障的服务必须在有限的时间内返回合理的结果集。

CAP-可用性
CAP-可用性

注意:这不能保证响应中包含最新的写入。   上图显示了一个“不可用(unavailable)”系统。

分区容错性(Partition Tolerance)

这里的分区是指网络意义上的分区。由于网络是不可靠的,所有节点之间很可能出现无法通讯的情况,在节点不能通信时,要保证系统可以继续正常服务。此条件表明,无论消息在系统中的节点之间丢失还是延迟,系统都不会发生故障。 

CAP-分区容错性
CAP-分区容错性

分布式系统中,分区容错性比其它选项更有必要。 通过在节点和网络的组合之间充分复制记录,可以实现这一点。

CAP 原理说明,一个数据分布式系统不可能同时满足 C、A 和 P这三个条件。所以架构师在设计系统时,不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。由于网络的不可靠性质,大多数开源的分布式系统都会实现 P,也就是分区容错性,之后在 C 和 A 中做抉择。

CAP 原理其实是对分布式数据存储系统的一个定论。我们假设一个分布式系统各个节点都读写同一个 Mysql 实例,那么对于这个分布式系统来说,讨论 CAP 原理是没有意义的。因为各个节点之间可以不用因为数据复制而进行通信,满足分区容忍性(P),可以随时响应请求,满足可用性(A),同时因为访问的是一个数据库实例,本身已经保证了数据一致性(C)。

因此,在讨论 CAP 原理的时候,更多的是针对那些有数据存储、数据复制场景的分布式存储系统,也就是我们熟悉的 NoSql 数据库。

CAP 场景分析

假设有节点 data1 和节点 data2,一开始有个数据 number=1。之后向 data1 提交更新,将数据 number 设置为 2。接着 data1 就需要将更新推送给 data2,让 data2 也更新 number 数据。下面分 3 个场景进行分析。

1、在保证 C 和 P 的情况下

为了保证数据一致性,data1 需要将数据复制给 data2,即 data1 和 data2 需要进行通信。但是由于网络是不可靠的,我们系统有保证了分区容忍性,也就是说这个系统是可以容忍网络的不可靠的。这时候 data2 就不一定能及时的收到 data1 的数据复制消息,当有请求向 data2 访问number 数据时,为了保证数据的一致性,data2 只能阻塞等待数据真正同步完成后再返回,这时候就没办法保证高可用性了。所以,在保证 C 和P 的情况下,是无法同时保证 A 的。

2、在保证 A 和 P 的情况下

为了保证高可用性,data1 和 data2 都有在有限时间内返回。同样由于网络的不可靠,在有限时间内,data2 有可能还没收到 data1 发来的数据更新消息,这时候返回给客户端的可能是旧的数据,和访问 data1 的数据是不一致的,也就是违反了  C。

3、 在保证 A 和 C 的情况下

如果要保证高可用和一致性,只有在网络情况良好且可靠的情况下才能实现。这样 data1 才能立即将更新消息发送给 data2。但是我们都知道网络是不可靠的,是会存在丢包的情况的。所以要满足即时可靠更新,只有将 data1 和 data2 放到一个区内才可以,也就丧失了 P 这个保证。其实这时候整个系统也不能算是一个分布式系统了。

结语

关于 CAP 原理,还需要特别注意的一点是,虽然说我们设计系统时不能同时保证拥有三点。但是也并不是说,保证了其中 2 点后,就要完全抛弃另外一点。只是相对的要做一些牺牲。比如在保证 CP 的情况下,虽然没办法保证高可用性,但这不意味着可用性为 0,我们可以通过合理的设计尽量的提高可用性,让可用性尽可能的接近 100%。同理,在 AP 的情况下,也可以尽量的保证数据的一致性,或者实现弱一致性,即最终一致性。

对于大数据的研发人员而言,CAP 原理尤为重要。

文件参考:

《CAP 原理详细分析》的相关评论

发表评论

必填项已用 * 标记,邮箱地址不会被公开。