- 注:文章来源:极客时间的专栏《从0开始学架构》
CAP定理又称作布鲁尔定理。
CAP理论
- 第一版解释:
对于一个分布式计算系统,不可能同时满足一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三个设计约束。
- 第二版解释:
在一个分布式系统(指互相连接并共享数据的节点的集合)中,当涉及读写操作时,只能保证一致性、可用性、分区容错性三者中的两个,另外一个必须被牺牲。
差异点
- 第二版定义了什么才是CAP理论探讨的分布式系统,强调了两点:interconnected(互联)和share data。因为分布式系统并不一定会互联和共享数据。最简单的例如Memcache的集群,相互之间就没有连接和共享数据,因此Memcache集群这类分布式系统就不符合CAP理论探讨的对象;而MySQL集群就是互联和进行数据复制的,因此是CAP理论探讨的对象。
- 第二版强调了write/read pair。CAP关注的是对数据的读写操作,而不是分布式系统的所有功能。例如,Zookeeper的选举机制就不是CAP探讨的对象。
1. 一致性
- 第一版解释:
所有节点在同一时刻都能看到相同的数据。
- 第二版解释:
对某个指定的客户端来说,读操作保证能够返回最新的写操作结果。
差异点:
- 第一版从节点node的角度描述,第二版从客户端client的角度描述。
第二版更符合我们观察和评估系统的方式,即站在客户端的角度来观察系统的行为和特征。
对于系统执行事务来说,在事务执行过程中,系统其实处于一个不一致的状态,不同的节点的数据并不完全一致
2. 可用性
- 第一版解释:
每个请求都能得到成功或者失败的响应。
- 第二版解释:
非故障的节点在合理的时间内返回合理的响应(不是错误和超时的响应)。
差异点:
- 第一版是every request,第二版强调了A non-failing node。
第一版的every request是不严谨的,因为只有非故障节点才能满足可用性要求,如果节点本身就故障了,发给节点的请求不一定能得到一个响应。
- 第一版的response分为success和failure,第二版用了两个reasonable:reasonable response和reasonable time,而且强调了no error or timeout。
第一版的success/failure的定义太泛了,几乎任何情况,无论是否符合CAP理论,我们都可以说请求成功和失败,因为超时也算失败、错误也算失败、异常也算失败、结果不正确也算失败;即使是成功的响应,也不一定是正确的。例如,本来应该返回100,但实际上返回了90,这就是成功的响应,但并没有得到正确的结果。相比之下,第二版的解释明确了不能超时、不能出错,结果是合理的,注意没有说“正确”的结果。
3. 分区容错性
- 第一版解释:
出现消息丢失或者分区错误时系统能够继续运行。
- 第二版解释:
当出现网络分区后,系统能够继续“履行职责”。
差异点:
- 第一版用的是work,第二版用的是function。
work强调“运行”,只要系统不宕机,我们都可以说系统在work,返回错误也是work,拒绝服务也算work;而function强调“发挥作用”“履行职责”,这点和可用性是一脉相承的。也就是说,只有返回reasonable response才是function。
- 第一版描述分区用的是message loss or partial failure,第二版直接用network partitions。
第一版是直接说原因,即message loss造成了分区,但message loss的定义有点狭隘,因为通常我们说的是message loss(丢包),只是网络故障的一种;第二版直接说现象,即发生分区现象 ,不管什么原因,可能是丢包,也可能是连接中断,还可能是拥塞,只要导致了网络分区,就通通算在里面。
CAP应用
虽然CAP理论定义是三个要素中只能取两个,但放到分布式环境下来思考,我们会发现必须选择P(分区容错)要素,因为网络本身无法做到100%可靠,有可能出故障,所以分区是一个必然的现象。如果我们选了CA而放弃P,那么当发生分区现象时,为了保证C,系统需要禁止写入,当有写入请求时,系统返回error(例如,当前系统不允许写入),这又和A冲突了,因为A要求返回no error和 no timeout。因此,分布式系统理论上不可能选择CA架构,只能选择CP或者AP架构。
1. CP
如下图所示,为了保证一致性,当发生分区现象后,N1节点上的数据已经更新到y,但由于N1和N2之间的复制通道中断,数据y无法同步到N2,N2节点上的数据还是x。这时客户端C访问N2时,N2需要返回error,提示客户端C“系统现在发生了错误”,这种处理方式违背了可用性的要求,因此CAP三者只能满足CP。

2. AP
如下图所示,为了保证可用性,当发生分区现象后,N1节点上的数据已经更新到y,但由于N1和N2之间的复制通道中断,数据y无法同步到N2,N2节点上的数据还是x。这时客户端C访问N2时,N2将当前自己拥有的数据x返回给客户端C了,而实际上当前最新的数据已经是y了,这就不满足一致性的要求了,因此CAP三者只能满足AP。注意:这里N2节点返回x,虽然不是一个“正确”的结果,但是一个“合理”的结果,因为x是旧的数据,并不是一个错乱的值。

注:有兴趣了解极客时间专栏的同学,可以查看极客时间专栏—可提供返现服务