It states, that though its desirable to have Consistency, High-Availability and Partition-tolerance in every system, unfortunately no system can achieve all three at the same time.
在分布式系统的设计中,没有一种设计可以同时满足一致性,可用性,分区容错性 3个特性

1. 概述

在计算机科学理论中,CAP理论也被称为布鲁尔理论(AKA Brewer’s theorem),目前看起来,它的存在已经是分布式系统设计与搭建的一大块非常重要的基石,它于1998年被加州伯里克大学的一位计算机科学家——埃里·布鲁尔「Eric Brewer」以假说的身份被提出,于2002年被证明是一个定理,它的理论简单来说,指的是在任意一个分布式计算体系中,都不可能同时满足以下三点特性

  • 一致性「Consistency」: 指的是所有的节点在同一时刻都拥有相同的数据
  • 可用性「Availability」: 保证对于每个请求都会有一个成功or失败的响应
  • 分区容错性「Partition Tolerance」: 系统中信息的丢失或失败都不会影响系统的运行

CAP定理指出在构建一个分布式系统时,以上3点特性最多只能满足2个,对于所涉及系统的强调点不一样,所采取的策略也会不一样,对于大型系统来说,一般会保证可用性 & 分区一致性,再通过其他的业务手段来应对一致性

也不应该把主要的精力花在研究如何设计出一个同时满足3个特性的完美分布式系统,而应该不同的需求特性来确定需要偏重的具体方向会更加的合适

CAP Theorem

2. C -> 一致性

在分布式系统中,数据可能存在着多个副本集,而一致性的意思是在对数据发出操作指令后,其背后的副本集也能实时同步为相同的结果,并且仅有当所有的副本集都同步成功,此次操作才算为成功,否则为失败,所有的操作结果都将进行回滚,回滚至发出操作指令前的状态

如果一个系统是能够保证一致性的,那么有意思的一点是,不管在哪个节点读取该数据,读取出来的数据都会是最新的,而不会存在不同的节点读取出来的数据不一致

3. A -> 可用性

可用性指的是客户端在对服务器发起请求后,能够得到响应,比如最近在JD上抢购抗原检测试剂时,即便已经没货了,但APP界面仍然会显示可抢购,但在进入购买页后,却会发现商品库存不足,实际上这种应对机制就是保证了可用性,对不可用的定义则是一个操作请求超过了最大的等待时间而无法返回最终结果(即便是失败的)

然而如上所述可用性也仅仅只能够保证服务是可用的,而无法确保数据是最新的,最明显的标志是能够对操作请求做出一个响应(即便是失败的响应)

4. P -> 分区容错性

在分布式系统中,为了提高系统整体的性能,可以将同一数据的副本存放在不同的地点,分布式容错性指的也就是分布式系统的容错性

可以理解成是仅当所有系统关联的网络节点都出现故障,否则单独一个子片区的网络出现故障并不会影响整个系统都无法响应(比如至少会有节点返回网络错误or请求错误)

如果网络被切断,则分区会形成,两分区之间的节点则无法进行通信,网络分区指的就是由于网络被分成若干个孤立的互不连通的区域

分区容错性也可以理解成是整个系统在网络分区的情况下仍然满足一致性和可用性的结果

5. 证明

假设:存在节点集{G1, G2},同时由于G1与G2分区网络存在异常无法相互联通

随后:在G1写入数据,再在G2立马读取数据

则:

  • 为了保证一致性,需要等待G2将数据从G1同步过来,而由于网络异常无法联通必然会陷入长时间的等待,长时间的等待会影响可用性
  • 为了保证可用性,则需要立即响应G2的读取数据请求,而如果立即返回G2中当前的数据,则返回的数据可能不会是最新的数据
  • 为了保证分区容错性,则会导致不一致性,而由于一致性的要求,G2又必须返回一致性的结果

因此:CAP理论可以通过以上例子简单快速地进行证明,分布式系统无法同时满足以上3个特性

6. 三选二原则

目前互联网世界中大多数分布式系统都是首先满足可用性 & 分区容错性,当面对CAP选择时,存在以下选项

[AP] 放弃一致性

选择分区容错性 & 可用性,当遇到部分节点宕机时,则不再需要为了保证一致性而进行等待,可以立即返回响应结果(只不过这个结果可能不是最新的

[CA] 放弃分区容错性

要满足一致性 & 可用性则一定会需要回滚操作和事务机制,这样的系统在扩展性上会相对有限,现如今使用最广泛的MySQL则是应用了CA

[CP] 放弃可用性

当出现节点宕机无法提供服务时,仍然需要保持一致性,则需要各个节点之间的网络有强连通性,印象中Redis集群则是采用了CP机制,各个节点之间的数据一致,同时当DOWN掉的节点恢复过来时,会将自身的数据拉到与其他节点一致的状态


NoSQL一般都会以满足可用性优先,数据一致性为次,而传统的关系型DB则会严格遵循着ACID特性(原子性、一致性、隔离性和持久性)

7. BASE模型

BASE -> Basically Available, Soft-state, Eventually consistent

BASE模型在20世纪90年代末提出,它基于同性质之间做了取舍,考虑了高可用的设计,BASE是基本可用、软状态、最终一致性几个英文单词的缩写,总的来说,它是通过牺牲一致性来提高可用性和系统性能的一种思想,也是CAP理论结合解决实际问题的产物,目标就是能够通过不同的方式来尽可能地达到最终一致性

基本可用

它的定义是系统能够基本运行、始终提供服务,通过牺牲高一致性,来获得可用性分区容错性,一个例子是电商大促(是的没错大促指双十一)的时候,电商平台会提前关闭退款入口 or 关闭历史订单查询入口,以保护和提升系统整体的基本可用性

软状态

是指系统不要求时时刻刻都保持强一致性,可以有一段时间不进行同步,同时也允许数据存在中间状态,同时有个大前提是这个中间状态不会影响系统的整体可用性

不同程度的一致性

a. 强一致性

也称之为实时一致性,假设存在节点集{G1, G2, G3},在往G1写入1条数据后,需要保证立即能够从G2和G3节点集中查询出该条数据

b. 弱一致性

假设存在节点集{G1, G2, G3},在往G1写入1条数据后,不能保证在任意节点集中读取到的数据就一定是最新的

c. 最终一致性

强调的是最终达到数据一致,假设存在节点集{G1, G2, G3},在往G1写入1条数据后,虽然无法保证数据在3组节点集中立刻同步一致,但能保证在经过n时长后,最终节点集内的数据达到一致的状态