CAP理论和ACID, BASE

10年前,Eric Brewer教授提出了非常著名的CAP理论,后人也论证了CAP理论的正确性。CAP理论指出:一个分布式系统不可能同时满足一致性(Consistency),可用性(Availibility)和分区容忍性(Partition Tolerance)这三个需求。最多只能同时满足其中的两个。架构师不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。

  • 一致性(Consistency):

对于分布式的存储系统,一个数据往往会存在多份。简单的说,一致性会让客户对数据的修改操作(增/删/改)要么在所有的数据副本(在英文文献中常称为Replica)全部成功,要么全部失败。即,修改操作对于一份数据的所有副本而言,是原子(Atomic)的操作。

如果一个存储系统可以保证一致性,那么则客户读写的数据完全可以保证是最新的。不会发生两个不同的客户端在不同的存储节点中读取到不同副本的情况。

  • 可用性(Availability):

可用性很简单,顾名思义,就是指在客户端想要访问数据的时候,可以得到响应。但是注意,系统可用(Available)并不代表存储系统所有节点提供的数据是一致的。比如客户端想要读取文章评论,存储系统可以返回客户端数据,但是评论缺少最新的一条。这种情况,我们仍然说系统是可用的。

往往我们会对不同的应用设定一个最长响应时间,超过这个响应时间的服务我们仍然称之为不可用的。

  • 分区容忍性(Partition Tolerance):

如果你的存储系统只运行在一个节点上,要么系统整个崩溃,要么全部运行良好。一旦针对同一服务的存储系统分布到了多个节点后,整个存储系统就存在分区的可能性。比如,两个存储节点之间联通的网络断开(无论长时间或者短暂的),就形成了分区。

对当前的互联网公司(例如Google)来说,为了提高服务质量,同一份数据放置在不同城市乃至不同国家是非常正常的。因此节点之间形成分区也很正常。

Gilbert 和Lynch将分区容忍性定义如下:

No set of failures less than total network failure is allowed to cause the system to respond incorrectly(除全部网络节点全部故障以外,所有子节点集合的故障都不允许导致整个系统不正确响应。)

我在另外一篇文章(BASE: An Acid Alternative)中找到了一个对分区容忍性更为恰当好理解的解释:

Operations will complete, even if individual components are unavailable.(即使部分的组件不可用,施加的操作也可以完成)

CAP说明:在设计一个分布式存储系统时,你不得不在三个特性中选择放弃一个。

如果选择Partition Tolerance和Consistency,那么即使坏了节点,操作必须又一致,又能顺利完成。所以就必须100%保证所有节点之间有很好的连通性。这是很难做到的。最好的办法就是将所有数据放到同一个节点中。但是显然这种设计是不满足Availability的。

如果要满足Availability和Consistency,那么,为了保证可用,数据必须要有Replica。这样,系统显然无法容忍Partition。当同一数据的两个副本(Replica)分配到了两个无法通信的Partition上时,显然会返回错误的数据。

最后看一下满足Availability和Partition Tolerance的情况。满足可用,就说明数据必须要在不同节点中有replica。然而还必须保证在产生Partition的时候仍然操作可以完成。那么,必然操作无法保证一致性。

基于ACID的关系型数据库选择的是C和P。因此能够提供很高的一致性,但是却在系统繁忙的时候不可用(Service Unavailable)。但是对于大多数互联网应用来讲,强一致性对他们来说并不一定非要满足,可用性往往是更加重要的。比如,某博客网站在北京和上海的存储服务器突然不联通,北京用户和上海用户无法看到对方的评论显然要比北京用户和上海用户访问网站都返回HTTP 500错误要好的多。

当然,对于银行这种业务来讲,一致性是不能放弃的。

下面这篇文章对CAP理论作了详细解释和论证:

http://www.julianbrowne.com/article/viewer/brewers-cap-theorem

或者看这个中文翻译版:

http://pt.alibaba-inc.com/wp/dev_related_728/brewers-cap-theorem.html

 

关于ACID和BASE: 

关系数据库的ACID模型拥有高一致性和可靠性,丧失可用性。

ACID,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。其中的一致性强调当程序员定义的事务完成时,数据库处于一致的状态。如对于转帐来说,事务完成时必须是A少了多少钱B就多了多 少钱。 

对于很多互联网应用来说,对于一致性要求可以降低,而可用性(Availability)的要求则更为明显。从而产生了弱一致性的理论BASE。 BASE模型反ACID模型,完全不同ACID模型,牺牲高一致性,获得可用性或可靠性。

BASE,即Basically Availble(基本可用)、Soft-state (软状态)、Eventual Consistency (最终一致性)。

参考链接:
http://ultimatearchitecture.net/index.php/2010/06/22/cap_theory/
http://blog.csdn.net/winniepu/article/details/5485899

posted @ 2012-11-30 10:23  beanmoon  阅读(1210)  评论(0编辑  收藏  举报