CAP理论

Most of the data, Most of the time.

一. 什么是CAP

1. Atomic Data Objects (Consistent)

为了保证一致性,所有的操作必需保证有序,且每一个操作看起来在一瞬间完成。这等价于要求分布式的共享内存好像就在一个节点上,一次相应一个操作。对于原子的读写共享内存操作有一个重要的性质,即当完成一个写操作后,读操作必需返回正确的值。这是一致性最简单的模型。

2. Available Data Objects(Availble)

关于可用性一个比较弱的定义:对于一个算法完成的时间没有限制,即允许无限制的计算。一个比较强的定义是:即使当严重网络故障发生时,每个请求都必须要能终止(返回给客户端)。

3. Partition Tolerance

分区即当不允许消息任意的在节点间传输。当一个网络被分割,从一个分区内的任意节点往另一个分区的节点发送的消息都会丢失。

例如:如果有一个数据库允许在80个节点上分布于两个机架,当连接两个机架的的网络故障时,现在这个数据库是被分区的。如果数据库是分区容错的,那么数据库现在在各自的分区仍然可以进行读写操作。如果不是分区容错,那么这个集群就完全不能访问。

定理:任何分布式系统只可同时满足以上二点,没法三者兼顾。


忠告:架构师不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。

二. 概念、定理

两个基本概念:

异步网络模型    没有时钟,节点所做的决定只依据收到的消息和本地计算

In the asynchronous model,there is no clock,and nodes must make decisions based only on the messages received and local computation.

部分同步网络模型      network to have a clock,且每个节点的时钟频率是一样的,但是节点自身是不同步的。因此同一时刻不同节点有可能有不同的值。

 

定理一:在异步网络模型中,对数据对象的读写操作无法保证以下属性:对所有的正常操作(包括消息丢失)都具有有效性和一致性。

Theorem1  It is impossible in the asynchronous network model to implement a read/write data object that guarantees the following properties:
• Availability
• Atomicconsistency
in all fair executions(including those in which messages are lost).

推论一:在异步网络模型中,对数据对象的读写操作无法保证以下属性:对所有正常的执行都保证有效性,且在没有数据丢失的执行中保证一致性

Corollary1.1  It is impossible in the asynchronous network model to implement a read/write data object that guarantees the following properties:
• Availability, in all fair executions,
• Atomic consistency, infair executions in which no messages are lost.

CAP理论的证明:

1. 在网络中有两个节点,N1和N2。它们共享数据V,值为V0。对A和B分别是是节点N1和N2上安全、可靠的操作。

image

2. A写一个新的值给V,B读取V的新值。

1)A给V赋了一个新值V1   

2)从N1往N2发送一个消息M,更新N2中V的值

3)从B中读取V的值,返回值V1

3.  假如A和B被分区(分割),N1和N2的值是非一致的,N2返回V0

 

三. 任意两个组合均成立

image

1. 原子性和分区容错性

用一个指定节点维护数据的值。当一个节点收到客户发来的请求时,将该请求转发给指定节点,当从指定节点收到确认消息后,节点再发送一个反馈信息给客户端。

2. 原子性和有效性

如果没有分区,上面的算法同样满足这个条件

3. 有效性和分区容错性

如果没有并发请求,服务对任意的请求都可以返回初始值

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>