CAP、BASE

予早 2024-10-12 12:19:47
Categories: Tags:

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.

基本可用,软状态,最终一致性。

BASE 理论是对 CAP 理论的拓展,核心思想是即使无法做到强一致性(Strong Consistency,CAP 的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。

举例说明:12306买票时,搜索发现有票,然后购买发现没票,后面重新搜索,发现该票还是有,几分钟之后再次搜索,发现没票了。这就是在保证系统可用性的基础上,在数据一致性方面做了牺牲,这种就是牺牲了用户在查询票到买不到这一步的体验,但是在大流量情况下,没有因为卡在搜索这一步而阻塞用户使用。

通常就是,牺牲数据一致性,使得用户从A到B的体验差一点,但是保证当很多用户在进行a-b操作时,不会大多数人卡在A。

拓展分析

CAP理论中三选二是指三者强成立的情况下,三者最多只有两个可以成立,而基于CAP和BASE理论:

  1. 无法保证三个性质同时强成立
  2. 可以保证三个性质同时弱成立

基于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”