CAP和BASE理论

一、CAP定理

CAP理论告诉我们,一个分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:Availability)、分区容错性(P:Partition tolerance)这三个基本需求,最多只能同时满足其中两项。

1、Consistency

分布式环境中,一致性是指数据在多个副本之间是否能够保持一致的特性。在一致性的需求下,当一个系统在数据一致的状态下执行更新操作,应该保证系统的数据仍然处于一致的状态。
对于一个将数据副本分布在不同分布式节点上的系统来说,如果对第一个节点的数据进行了更新操作并且更新操作成功后,却并没有使第二个节点上的数据得到相应更新,那么在对第二节点的数据进行读取操作时,获取到的依然是老数据(脏数据),这就是典型的分布式数据不一致。
强一致性: 如果更新数据后,并发访问情况下可立即感知该更新。
弱一致性: 如果允许之后部分或者全部感知不到该更新。
最终一致性: 若在之后的一段时间(通常该时间不固定)后,一定可以感知该更新。

2、Availability

指系统提供的服务必须一直处于可用状态,对于用户的每一个操作请求总是能够在有限的时间内返回合理的结果

3、Partition tolerance

分布式系统在遇到任何网络分区故障的时候,任然需要能够保证对外提供满足一致性和可用性的服务

二、CAP定理应用

一个分布式系统中无法同时满足上述三个需求,只能满足其中两项,因此,在对CAP定理的应用时,我们就需要抛弃其中一项,如图:

放弃CAP定理 说明
放弃P 如果希望能够避免系统出现分区容错性问题,一种较为简单的做法是将所有的数据(或者仅仅是那些与事务相关的数据)都放在一个分布式节点上。这样的做法虽然无法100%保证系统不会出错,但至少不会出现由于网络分区带来的负面影响。但是,放弃P的同时也就意味着放弃了整个系统的可扩展性。而既然是一个分布式系统,那其中组件必然会被部署到不同不同节点,否者也就没有所谓的分布式系统里,所以必然有子网络。
放弃A 一旦系统遇到网络分区或者其他故障时,那么受影响的服务需要等待一定时间,因此,在等待期间系统无法对外提供正常的服务,即不可用。
放弃C 这里所谓的放弃一致性,并不是完全不需要数据一致性,如果真是那样的话,那么系统数据都是没意义的,整个系统也是没有价值的。 事实上放弃一致性是放弃强一致性,而保留数据的最终一致性。这样的系统无法保证数据保持实时的一致性,但能够保证得是,数据最终能够达到一个一致的状态。这就引入了一个时间窗口的概念,具体多久能够达到数据一致取决于系统的设计,主要包括数据副本在不同节点之间复制时间长短。

三、BASE理论

BASE是Basically Available(基本可用)、Soft state(软状态)、Eventually consistent(最终一致性)三个短语的简写。

BASE是对CAP中一致性和可用性权衡的结果,其源于对大规模互联网系统分布式实践的总结是基于CAP定理逐渐演化而来的,其核心思想是即使无法做到强一致性(Strong consistency),但每个应用都可以根据自生的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。

1、Basically Available(基本可用)

基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性,但是这绝不等价于系统不可用,例如:
响应时间上的损失:正常情况下,一个在线搜索引擎需要在0.5秒内返回给用户相应的查询结果,但是由于故障(比如系统部分机房断电或者断网),查询结果响应时间增加到3秒。
功能上的损失: 正常情况下,在一个电子商务网站上进行购物,消费者几乎能够顺利的完成每一笔订单,但是在一些节日大促购物高峰的时候(例如:双十一),由于消费者的购物行为激增,为了保护购物系统的稳定性,部分消费者可能会被引导到一个降级页面。

2、弱状态

弱状态也称为软状态,和硬状态相对,是指系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。

3、最终一致性

最终一致性强调的是系统中所有的数据副本,在进过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。

在实际的工程中,最终一致性存在以下变种:

  1. 因果一致性(Causal consistency):因果一致性是指,如果进程A在更新完某个数据项后通知了进程B,那么进程B之后对该数据项的访问都应该能够获取到进程A更新后的最新值,并且如果进程B要对该数据项进行更新操作的话,务必基于进程A更新后的最新值,即不能发生丢失更新情况。与此同时,与进程A无因果关系的进程c的数据访问则没有这样的限制。
  2. 读己之所写(Read your writes):读己之所写是指,进程A更新一个数据项之后,它自己总是能够访问到更新过的最新值,而不会看到旧值。也就是说,对于单个数据获取者来说,其读取到的数据,一定不会比白己上次写人的值旧。因此,读己之所写也可以看作是一种特殊的因果一致性。
  3. 会话一致性(Session consistency):会话一致性将对系统数据的访问过程框定在一个会话当中:系统能保证在同一个有效的会话中实现“读己之所写”的一致性,也就是说,执行更能操作之后,客户端能够在同一个会话中始终读取到该数据项的最新值。
  4. 单调读一致性(Monotonic read consistency):单调读一致性是指如果一个进程从系统中读取出一个数据项的某个值后,那么系统对该进程后续的任何数据访问都不应该返回更旧的值。
  5. 单调写一致性(Monotonic write consistency):单调写一致性是指,一个系统需要能够保证来自同一个进程的写操作被顺序地执行。

猜你喜欢

转载自blog.csdn.net/qq_37502106/article/details/80268673