分布式理论CAP原则和BASE理论


CAP原则

CAP原则又称CAP定理,指的是在一个分布式系统中,存在Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性),三者不可同时保证,最多只能保证其中的两者。

  • 一致性(C):在分布式系统中的所有数据备份,在同一时刻都是同样的值(所有的节点无论何时访问都能拿到最新的值)

  • 可用性(A):系统中非故障节点收到的每个请求都必须得到响应(比如服务降级和熔断,其实就是一种维持可用性的措施,虽然服务返回的是没有什么意义的数据,但是不至于用户的请求会被服务器忽略)

  • 分区容错性(P):一个分布式系统里面,节点之间组成的网络本来应该是连通的,然而可能因为一些故障(比如网络丢包等,这是很难避免的),使得有些节点之间不连通了,整个网络就分成了几块区域,数据就散布在了这些不连通的区域中(这样就可能出现某些被分区节点存放的数据访问失败,我们需要来容忍这些不可靠的情况)

总的来说,数据存放的节点数越多,分区容错性就越高,但是要复制更新的次数就越多,一致性就越难保证。同时为了保证一致性,更新所有节点数据所需要的时间就越长,那么可用性就会降低。

所以说,只能存在以下三种方案:

AC 可用性+一致性

要同时保证可用性和一致性,代表着要保障节点故障后分布式系统的可用以及某个节点数据更新之后,可以立即将结果通知给其他节点,这样才能及时响应保证一致性,这就对网络的稳定性要求非常高。但是实际情况下,网络很容易出现丢包等情况,并不是一个可靠的传输,这会导致很多问题。比如用于检测节点是否健康的心跳检测机制,由于网络抖动,它的状况会被一部分节点误判;网络问题还有可能导致系统内多个节点数据不一致,系统为了达成“数据一致态”,会不断触发重试机制,造成外部请求阻塞,一直无法成功写入。如果需要避免这种问题,就只能将节点全部放在一起,但是这显然违背了分布式系统的概念,所以对于我们的分布式系统来说,是几乎不可能实现的。

CP 一致性+分区容错性

为了保证一致性,那么就得将某个节点的最新数据发送给其他节点,并且需要等到所有节点都得到数据才能进行响应,同时有了分区容错性,那么代表我们可以容忍网络的不可靠问题,所以就算网络出现卡顿,那么也必须等待所有节点完成数据同步,才能进行响应,因此就会导致服务在一段时间内完全失效,所以可用性是无法得到保证的。

AP 可用性+分区容错性

既然CP可能会导致一段时间内服务得不到任何响应,那么要保证可用性,就只能放弃节点之间数据的高度统一,也就是说可以在数据不统一的情况下,进行响应,因此就无法保证一致性了。虽然这样会导致拿不到最新的数据,但是只要数据同步操作在后台继续运行,一定能够在某一时刻完成所有节点数据的同步,那么就能实现最终一致性,所以AP实际上是最能接受的一种方案。

BASE理论

Basically Available、Soft state、Eventually consistent简称为BASE理论,由eBay系统架构师Dan Pritchett于2008年发布,该理论提出了三个概念:

  • BA(基本可用): 分布式系统在出现故障时,允许损失部分可用性,即保证核心可用,而其他非核心可用性可以暂时停止服务。比如电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。

  • S(软状态): 软状态是指允许系统中的数据存在中间状态,而该中间状态的存在不会影响系统的整体可用性。就比如传统关系型数据库里的事务机制,假设没有事务机制,写入数据就只有成功、失败两种状态,而有了事务机制后,在成功与失败之间,多了一个中间态,即:数据写入成功,事务暂未提交,这个中间态的存在,也不会影响数据库整体的可用性。

  • E(最终一致性): 最终一致性是指系统中的所有数据副本,在经过一段时间的同步后,最终能够达到一致的状态。在BASE理论中,最终一致性是和软状态绑定的,两者需要结合在一起理解。前面说到,软状态允许系统内存在中间态,但要记住:如果这个中间态,一直不变成终态,而是卡在那里的话,就会影响系统整体的可用性。比如一个事务处于中间态(写入成功,但一直不提交);当其他请求继续对该事务操作的数据行进行更新时,就会被阻塞,从而影响了系统的可用性,这就违背了“软状态”的定义。

BASE和CAP的关系

有人说BASE理论是对CAP理论的延伸:BASE理论认为,即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性,即BASE理论是在CAP基础上,满足AP后对C方面的拓展与延伸。其实这种认知是错误的, BASE理论中的一致性和CAP中的一致性并不相同,CAP中的一致性是要保证分布式系统中每个节点在同一时间的数据的,即每个节点中存储的数据是相同的,而BASE理论中的一致性和数据库的ACID特性中的一致性是差不多的意思。

ACID中的一致性: 一个事务执行前后,数据库只能从一个一致状态转变为另一个一致状态。比如小明要往小红的账户转10万元,小明的账户原本有66万,小红的账户原本有56万,小明转了10万元之后,小明的账户就变成了56万,小红的账户就变成了66万,而总的钱不变,仍为122万元,这就是一个一致性状态的转变。CAP的一致性,关注的是数据一致性;BASE的一致性,关注的是状态一致性。与其说BASE理论是对CAP理论的延伸,不如说BASE理论是对ACID理论的延伸(特指分布式场景)。

CAP和BASE中对于可用性的定义是不同的:CAP中A节点出现故障, 去B节点也可以得到相同的响应(CAP中的节点是全量复制的,理想情况下解释完全相同的). 而在BASE中, 基本可用是用来降低风险的, 不同的节点是完全不同的, 可以类比为将数据库做了水平拆分, 如果总共10个节点, 三个挂了, 只会有30%的用户受到影响.

CAP理论更局限于分布式存储领域, 而BASE理论适用于各类分布式系统, 其中定义的三个概念,覆盖了分布式系统的大多数场景.