CAP
理论
CAP
理论的提出者布鲁尔在提出CAP
猜想的时候,
并没有详细定义Consistency
、Availability
、Partition Tolerance
三个单词的明确定义。
一般大家的理解是:
在理论计算机科学中,CAP
定理(CAP theorem
)指出对于一个分布式系统来说,当设计读写操作时,只能同时满足以下三点中的两个:
- 一致性(
Consistency
):所有节点访问同一份最新的数据副本 - 可用性(
Availability
):非故障的节点在合理的时间内返回合理的响应(不是错误或者超时的响应)。 - 分区容错性(
Partition tolerance
):分布式系统出现网络分区的时候,仍然能够对外提供服务。
网络分区
分布式系统中,多个节点之前的网络本来是连通的,但是因为某些故障(比如部分节点网络出了问题)某些节点之间不连通了,整个网络就分成了几块区域,这就叫网络分区。
简单的表述:一致性、可用性、分区容忍性三者你只能同时达到其中两个,不可能同时达到。
实际上这是一个误导性质的说法。
最新的解释是:
当发生网络分区的时候,如果我们要继续服务,那么强一致性和可用性只能2
选1
。</br>
也就是说当网络分区之后P
是前提,决定了P
之后才有C
和A
的选择。</br>
也就是说分区容错性(Partition tolerance
)我们是必须要实现的。</br>
简单的表述:CAP
理论中分区容错性P
是一定要满足的,在此基础上,只能满足一致性C
或者可用性A
。
因此,分布式系统理论上不可能选择CA
架构,只能选择CP
或者AP
架构。 </br>
比如:
ZooKeeper
、HBase
就是CP
架构,Cassandra
、Eureka
就是AP
架构Nacos
不仅支持CP
架构也支持AP
架构。
为什么不可能选择CA
架构呢?
举个例子:若系统出现分区
,系统中的某个节点在进行写操作。
为了保证C
(一致性), 必须要禁止其他节点的读写操作,这就和A
(可用性)发生冲突了。
如果为了保证A
(可用性),其他节点的读写操作正常的话,那就和C
(一致性)发生冲突了。
选择CP
还是AP
的关键在于当前的业务场景,没有定论,大部门业务功能是满足AP
,但是对于需要确保强一致性的场景,如:银行,车票,一般会选择保证CP
。
需要补充说明的一点是:如果网络分区正常的话(系统在绝大部分时候所处的状态),也就说不需要保证P
的时候,C
和A
能够同时保证。
BASE
理论
BASE
是Basically Available
(基本可用) 、Soft-state
(软状态)和Eventually Consistent
(最终一致性) 三个的缩写。
BASE
理论是对CAP
中一致性C
和可用性A
进行一个权衡的结果,</br>
理论的核心思想就是:我们无法做到强一致,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。
也就是牺牲数据的一致性来满足系统的高可用性,系统中一部分数据不可用或者不一致时,仍需要保持系统整体主要可用
。
BASE
理论本质上是对CAP
的延伸和补充,更具体地说,是对CAP
中AP
方案的一个补充。
CAP
理论里面说过,如果系统没有发生分区
的话,节点间的网络连接通信正常的话,也就不存在P
了。
这个时候,就可以同时保证C
和A
了。因此,如果系统发生分区
,我们要考虑选择CP
还是AP
。
如果系统没有发生分区
的话,我们要思考如何保证CA
。
因此,AP
方案只是在系统发生分区的时候放弃一致性,而不是永远放弃一致性。
在分区故障恢复后,系统应该达到最终一致性
。这一点就是BASE
理论延伸的地方。