CAP、ACID、BASE理解
CAP
CAP原则又称CAP定理,指的是一个分布式系统中,Consistency(一致性)、Availabiliy(可用性)、Partition Tolerance(分区容错性),三者不可兼得。
CAP理论将分布式系统的三个特性进行了系统归纳:
- 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否为同样的值。即同样数据在分布式系统中所有地方都是被复制成相同。
对于分布式的存储系统中,一份数据往往会复制多份并存放在不同的主机上。一致性保证了对于客户对一份数据的操作的同时,其他数据也会相应进行同样的操作,而不会出现同一份数据在不同的主机上会有不同的副本的情况。 - 可用性(A):在集群中的一部分节点故障后,集群整体是否还能响应客户端的读写要求。即所有在分布式系统活跃的节点都能够处理操作且能响应查询。
对于客户的操作,系统能够在部分节点故障(不可用)的情况下,仍然能够响应客户的操作并作出相关的数据修改。 - 分区容错性(P):是否允许数据的分区,即是否允许集群中的节点之间不进行通信。即除全部网络节点全部故障以外,所有子节点集合的故障都不允许导致整个系统不正确响应。即使部分的组件不可用,施加的操作也可以完成。
在两个不同地方的存储节点由于某种原因,无法进行正常连接时,需要有一套完整的容错机制来保证数据的可操作。
一个数据存储系统不可能同时满足上述三个特性,只能同时满足其两个特性。如下所示:
- CA - 满足数据的一致性和高可用性,但没有可扩展性。
- CP - 满足数据的一致性和分区性。但当节点达到一定数目时,性能(也即可用性)就会下降很快,并且节点之间的网络开销还在,需要实时同步各节点之间的数据。
- AP - 满足数据的高可用性和分区性,但在数据一致性方面会用牺牲,各节点的之间数据无法立即做到同步更新,但能保存数据的最终一致性。
在软件架构设计过程中,往往倾向于构建高可用、数据高度一致且具备扩展性的大型软件工程项目,但基于以上分析可知,我们无法同时满足三个特点。尤其在于进行分布式架构设计时,必须做出取舍。而对于分布式数据系统,分区容忍性是基本要求,否则就失去了价值。因此设计分布式数据系统,就是在一致性和可用性之间取一个平衡。对于大多数web应用,其实并不需要强一致性,因此牺牲一致性而换取高可用性,是目前多数分布式数据库产品的方向。
ACID
传统关系型数据库系统的事务特点可以囊括为ACID:
- Atomic(原子性):整个事务当中的所有操作,要么全部执行,要么全部不执行,不可能停滞在中间某个阶段。当事务在执行过程中发生错误时,会进行回滚(rollback)到事务最初状态,数据不会受到影响。
- Consistent(一致性):在事务开始之前和事务开始之后,数据库的完整性约束没有被破坏
- Isolated(隔离性):两个事务的执行是互不干扰的。
- Durable(持久性):在事务完成以后,该事务对数据库所有的更改是永久的,不可恢复的。
在传统数据库系统中,事务的ACID保证了数据库的高度一致性。比如在银行转账系统中,转账就是一个事务,从原账户扣除金额,以及向目标账户添加金额,两个操作总结为一个原子化的逻辑操作,不可拆分。
但在分布式操作系统中,ACID或许就是一个很好的选择,ACID的要求是数据的高度一致性。比如在大型的图书网站购买图书,每当用户进行购书并完成付款时,数据库系统就会锁住相关的数据库进行数据的修改(相关书本数量减少)。当数据修改完成后,其他用户都会看到该图书的库存减少了。以上操作,并不允许同一时间有两个或两个以上的用户进行图书的购买,不利于数据的高并发处理。基于以上例子,我们知道ACID放弃了系统的性能(P),进而保证数据的高度一致(C)。
BASE
BASE是站在ACID的对立面,与其截然不同的设计思想。BASE有以下三个特点:
- Basically Availablilty(基本可用性):指在分布式系统中在出现不可遇见的故障的时候,允许损失部分可用性。
正常情况下,在电子商务网站上购物时,消费者都能够以较流畅的过程来完成每一笔订单,但在面对数据高并发的情况(如双11),为了保护系统的稳定性以及提高性能,设计者往往采取服务降级的措施,来满足主要服务器的性能需求。 - Sotf-State(软状态)
与硬状态相比,其允许系统中的数据处于中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间更新存在一定的时间延迟。例如,在图书网站秒杀活动中,经常出现不同用户看到同一本畅销书的库存数量不同。 - Eventually Consistency(最终一致性):指在系统中所有的数据副本,经过一段时间的同步后,最能能够到达一个一致的状态。
最终一致性的本质在于所有数据在一定时间过后,一定能够到达一致状态,而不强制要求数据的实时一致性。
BASE其核心思想是即使无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。
参考资料:
[1] http://www.cnblogs.com/duanxz/p/5229352.html
[2] http://blog.csdn.net/sinat_27186785/article/details/52032510
[3] http://www.sigma.me/2011/06/17/database-ACID-and-BASE.html