CAP定理又称布鲁尔定理,是计算机科学家 Eric brewer 提出的,是分布式系统领域的一个定理。
若想设计一个分布式架构的系统,掌握这项定理不可或缺。
**C是Consistency,也就是一致性,在CAP中的是强一致性。A是Availability ,可用性。P是Partition tolerance,分区容错性。在分布式系统中三者不可兼得,只能选两个。这就是CAP定理。**例如你保证了一致性和分区容错性就无法保证可用性。
Consistency
这里的一致性是强一致性,强一致性的意思就是例如节点A更新了数据,节点B能同时更新,这样客户端在每次读取获得数据都是最近更新的。但是在定理中是忽略掉我们平日里的网络延迟的。现实情况网络延迟在现在还是无法避免的,所以我们只能实现最终一致性,但是目标还是贴近强一致性,也就是尽力降低延时的时间。
Availability
可用性指的是非故障的节点需要在合理的时间返回合理的响应。合理的响应的意思也就是不能搞个报错,不能是超时失败。举个例子比如说节点A更新了数据,同时要发布到节点B上,但是中间传输的电缆被挖掘机挖断了,此时用户去访问节点B,此时节点B应该返回老的数据,而不应该报错。这就是可用性。让用户感觉系统还是能用的。
Partition tolerance
分区容错性,指的是当网络分区了,系统还能正常的运行和响应。比如节点A和节点B无法通信,你要考虑这个时候系统如何应该。虽然网络分区的概率低而且时间短但是这种情况是会发生的。所以理论上是牺牲C或者A,P是一定要达到的。
举个例子,把P扔了。所以此时系统需要保证CA,然后此时发生了网络分区,节点A和B无法通信了,此时客户端想要往节点A写入数据,但是因为此时无法同步数据至节点B。所以只有保证A不写入因此才能保证一致性。那你不让客户端往A写数据,你就只能报个错返回给客户端,说此时不能写,那是不是违反了可用性了?
所以在分布式系统中P是一定要保证的。所以在分布式系统中是CP,AP这样搭配的。
那CA呢?请注意,CAP所说的CAP三者只能存在两者,所以CA是可以能搭配的。就是在系统没有P的时候,CA搭配。也就是说当系统不存在分区情况的时候要满足C和A,当系统出现分区情况的之后视情况抛弃C或者A。
注意
CAP理论不是系统级别的,是数据级别的。啥意思呢?
也就是说当出现网络分区的情况,你可以一部分数据遵守CP,一部分数据遵守AP。例如用户注册场景可以上CP,保证用户注册之后登录的成功。而用户更换头像这种就上AP,毕竟用旧的数据影响也不会很大。
因此我们要根据不同的业务场景来选择不同的应对方案。CAP是可以灵活搭配的