CAP理论
CAP是描述分布式系统中一致性、可用性、分区容错性三者间关系的理论。
CAP理论,CAP三选二,不可能三者同时成立。
一致性
Consistency : Every read receives the most recent write or an error.
一致性:每次读取获取到最新写入的数据或者一个错误。
CAP中说,不可能同时满足的这个一致性指的是强一致性。
可用性
Availability : Every request receives a (non-error) response – without the guarantee that it contains the most recent write.
可用性:每次请求获取到一个非错误响应,该响应不保证一定是最新写入的数据。
通常我们描述一个系统的可用性时,我们说淘宝的系统可用性可以达到5个9,意思就是说他的可用水平是99.999%,即全年停机时间不超过 (1-0.99999)*365*24*60 = 5.256 min,这是一个极高的要求。
分区容错性
Partition tolerance : The system continues to operate despite an arbitrary number of messages being dropped (or delayed) by the network between nodes.
分区容错性:任意数量消息被节点间网络丢失(或延迟)系统仍继续提供服务。
大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(partition)。分区容错的意思是,区间通信可能失败。比如,一台服务器放在中国,另一台服务器放在美国,这就是两个区,它们之间可能无法通信。
简单点说,就是在网络中断,消息丢失的情况下,系统如果还能正常工作,就是有比较好的分区容错性。
实际情况下,网络必然会出现不稳定的情况,所以分区容错性必然需要保障
CAP权衡
CA
保证CA不保证P,而实际上,网络必然会出现不稳定的情况,网络分区的情况不可避免,所以设计分布式系统时必然要考虑P,若不考虑P,当网络分区出现时,相当于每一个分区都是一个独立的CA系统。
CP
保证CP不保证A,不保证可用性,若发生网络分区,各节点为保证一致性将不断尝试同步数据,则最差情况会导致同步时间无限延长,同步期间系统对外不可用。
ZooKeeper是个CP(一致性+分区容错性)的,即任何时刻对ZooKeeper的访问请求能得到一致的数据结果,同时系统对网络分割具备容错性。但是它不能保证每次服务请求的可用性,也就是在极端环境下,ZooKeeper可能会丢弃一些请求,消费者程序需要重新请求才能获得结果。ZooKeeper是分布式协调服务,它的职责是保证数据在其管辖下的所有服务之间保持同步、一致。所以就不难理解为什么ZooKeeper被设计成CP而不是AP特性的了。
AP
保证AP不保证C,不保证一致性,若发生网络分区,各节点为保证可用性将继续对服务,会造成节点间数据不一致。
注意:这里的可用性仅仅指系统功能上的可用性,站在业务角度上讲,数据不一致会导致功能返回数据有问题,该功能“不可用”
样例:NoSQL数据库
BASE
Basically Available, Soft state, Eventually consistent.
基本可用,软状态,最终一致性。
- 基本可用,Basically Available:分布式系统在出现不可预知故障的时候,允许损失部分可用性
- 软状态,Soft state:软状态也称为弱状态,和硬状态相对,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。
- 最终一致性,Eventually consistent:最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性
BASE 理论是对 CAP 理论的拓展,核心思想是即使无法做到强一致性(Strong Consistency,CAP 的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。
举例说明:12306买票时,搜索发现有票,然后购买发现没票,后面重新搜索,发现该票还是有,几分钟之后再次搜索,发现没票了。这就是在保证系统可用性的基础上,在数据一致性方面做了牺牲,这种就是牺牲了用户在查询票到买不到这一步的体验,但是在大流量情况下,没有因为卡在搜索这一步而阻塞用户使用。
通常就是,牺牲数据一致性,使得用户从A到B的体验差一点,但是保证当很多用户在进行a-b操作时,不会大多数人卡在A。
拓展分析
CAP理论中三选二是指三者强成立的情况下,三者最多只有两个可以成立,而基于CAP和BASE理论:
- 无法保证三个性质同时强成立
- 可以保证三个性质同时弱成立
基于CAP理论和BASE理论设计高性能分布式系统的核心点:
- 分区容错性是业务现实基础,一致性是业务运转约束,可用性是业务服务需要。
- 在分区容错性存在的前提下,根据业务需求保证尽量降低一致性需要以保证尽量提高可用性需要。
1…
分布式系统中并不是任意节点间都要使用CAP和BASE理论进行分析,只有相关联节点才需要分析。
C与A之间的取舍可以在同一系统内以非常细小的粒度反复发生,而每一次的决策可能因为具体的操作,乃至因为牵涉到特定的数据或用户而有所不同。
举个例子,有ABC三个节点对外提供服务,其中AB节点上各自存储一份d数据,BC节点上各自存储一份e数据,在分析的时候AB两个单独分析,BC单独分析即可,如何数据本就不相同则无序保证数据一致性,则无需分析,分析CAP是希望根据数据特点在P情况存在的基础上分析出CA如何设计。
2…
CAP这三种性质都可以在程度上衡量,并不是非黑即白的有或无。可用性显然是在0%到100%之间连续变化的,一致性分很多级别,连分区也可以细分为不同含义,如系统内的不同部分对于是否存在分区可以有不一样的认知。
CAP、BASE综合权衡
首先,分区容忍性一定需要满足,分布式系统要考虑网络分区出现的情况,分析时通常要根据地域范围分出不同区域,例如美国区,中国区,分析出哪些情况可以容忍,哪些情况不能容忍
其次,在确定分区容忍性后,分析一致性与可用性。比如一些搜索数据,可以牺牲一定一致性保证可用性,即使短时间内不一致也可以,做到最终一致性就行,又例如扣减余额,就需要严格保证数据一致性
[1]: http://www.hollischuang.com/archives/666 “分布式系统的CAP理论”
[2]: https://www.pdai.tech/md/dev-spec/spec/dev-th-cap.html “分布式理论 - CAP”