CAP原则概述
- C:Consistency(一致性)
- A:Availability(可用性)
- P:Partition tolerance(分区容错性)
CAP原则是分布式系统设计的重要原则,其具体含义是指在一个分布式系统中,最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项,不能同时满足这三项。
CAP原则定义
一致性
一致性,顾名思义,就是指数据更新操作成功后,所有节点的数据在同一时间保持一致。一致性模型有很多,包括弱一致性、强一致性、最终一致性等等。大多数人认为CAP原则中的一致性指的是强一致性。例如,在Zookeeper中,只有数据更新操作同步到所有节点后,才会返回写入成功。
可用性
可用性要求系统内的节点们接收到了无论是写请求还是读请求,都要能处理并给回响应结果。只是它有两点必须满足的条件:
条件 1:返回结果必须在合理的时间以内,这个合理的时间是根据业务来定的。业务说必须 100 毫秒内返回,合理的时间就是 100 毫秒,需要 1 秒内返回,那就是 1 秒,如果业务定的 100 毫秒,结果却在 1 秒才返回,那么这个系统就不满足可用性。
条件 2:需要系统内能正常接收请求的所有节点都返回结果。这包含了两重含义:如果节点不能正常接收请求了,比如宕机了,系统崩溃了,而其他节点依然能正常接收请求,那么,我们说系统依然是可用的,也就是说,部分宕机没事儿,不影响可用性指标。如果节点能正常接收请求,但是发现节点内部数据有问题,那么也必须返回结果,哪怕返回的结果是有问题的。比如,系统有两个节点,其中有一个节点数据是三天前的,另一个节点是两分钟前的,如果,一个读请求跑到了包含了三天前数据的那个节点上,抱歉,这个节点不能拒绝,必须返回这个三天前的数据,即使它可能不太合理。
分区容错性
首先解释下什么是分区。在一个分布式网络中,各个节点之间本来是正常互联互通的。但是,不论是网络故障,还是机器故障都会导致该网络的某些节点不连通。这些不连通的区域就叫分区。
当你一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了。这时分区就是无法容忍的。
提高分区容忍性的办法就是一个数据项复制到多个节点上,那么出现分区之后,这一数据项就可能分布到各个区里。容忍性就提高了。
然而,要把数据复制到多个节点,就会带来一致性的问题,就是多个节点上面的数据可能是不一致的。要保证一致,每次写操作就都要等待全部节点写成功,而这等待又会带来可用性的问题。
总的来说就是,数据存在的节点越多,分区容忍性越高,但要复制更新的数据就越多,一致性就越难保证。为了保证一致性,更新所有节点数据所需要的时间就越长,可用性就会降低。
CAP的证明
https://zhuanlan.zhihu.com/p/335617791