CAP为什么不能同时满足

如下图所示,在网络中有两个节点分别为G1和G2,这两个节点上存储着同一数据的不同副本,现在数据是一致的,两个副本的值都为V0,A、B分别是运行在G1、G2上与数据交互的应用程序。

CAP理论概述:NoSQL数据管理系统的基础


▲网络节点及数据分布图

 

在正常情况下,操作过程如下(如下图所示):

(1)A将V0更新,数据值为V1;

(2)G1发送消息m给G2,数据V0更新为V1;

(3)B读取到G2中的数据V1。

CAP理论概述:NoSQL数据管理系统的基础


▲正常情况

 

如果发生网络分区故障,那么在操作的步骤(2)将发生错误:G1发送的消息不能传送到G2上。这样数据就处于不一致的状态,B读取到的就不是最新的数据,如图2-3所示。如果我们采用一些技术如阻塞、加锁、集中控制等来保证数据的一致,那么必然会影响到系统的可用性和分区容错性。

CAP理论概述:NoSQL数据管理系统的基础


▲网络分区故障

 

CAP理论告诉我们如果系统具有较高的可用性和较小延迟,那么节点必须能够容忍网络分区,但这时候应用程序可能会得到不同的数据(B读取到的值为V1)。

有人可能会想,如果我们对步骤(2)的操作加一个同步消息,问题会不会解决呢(同时满足CAP理论三个特性)?答案是否定的。不加同步的情况下,G1到G2的更新是不可知的,也就是说,B读取到得数据可能是V1也可能是V2,但是服务是可用的。即同时满足了“A”和“P”,但是不保证“C”一定满足。加了同步消息之后,将能够保证B读取到数据V1。但是这个同步操作必定要消耗一定的时间,尤其是在网络规模较大的情况下,当节点规模成百上千的时候,不一定能保证此时的服务是可用的。这种情况下只能满足“C”和“P”,而不能保证“A”一定满足。

CAP理论不但对此网络和通信模型有效,对其他模型同样有效,有兴趣的读者可以换其他的网络和通信模型来验证CAP理论。

根据CAP理论,系统满足三个条件中不同的两个条件会具有不同的特点,见下表:处理CAP问题的选择。

 

可以看出,三种不同的组合对应着放弃了CAP三个特性当中的一个。

·放弃P:如果想避免分区容错性问题的发生,一种做法是将所有的数据(与事务相关的)都放到一台机器上。虽然无法100%地保证系统不会出错,但不会碰到由分区带来的负面效果。当然,这个选择会严重影响系统的扩展性。

·放弃A:相对于放弃“分区容错性”来说,其反面就是放弃可用性。一旦遇到分区容错故障,那么受到影响的服务需要等待数据一致,因此在等待期间系统就无法对外提供服务。

·放弃C:这里所说的放弃一致性,并不是完全放弃数据的一致性,而是放弃数据的强一致性,而保留数据的最终一致性。以网络购物为例,对只剩最后一件库存的商品,如果同时接收到了两份订单,那么较晚的订单将被告知商品售罄。

转载:http://www.d1net.com/bigdata/solution/240330.html

猜你喜欢

转载自lbxc.iteye.com/blog/1966040