文章目录
前言
聊到分布式架构,必然会聊到CAP理论。
CAP 理论起源于 2000 年,由加州大学伯克利分校的 Eric Brewer 教授在分布式计算原理研讨会(PODC)上提出,因此 CAP 定理又被称作 布鲁尔定理(Brewer’s theorem)。
2 年后,麻省理工学院的 Seth Gilbert 和 Nancy Lynch 发表了布鲁尔猜想的证明,CAP 理论正式成为分布式领域的定理。
一、简介
CAP 也就是 Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性) 这三个单词首字母组合。
- 一致性(Consistency) : 所有节点访问同一份最新的数据副本。
- 可用性(Availability): 非故障的节点在合理的时间内返回合理的响应(不是错误或者超时的响应)。
- 分区容错性(Partition Tolerance) : 分布式系统出现网络分区的时候,仍然能够对外提供服务。
二、详解
1.一致性(Consistency)
一致性分为三种情况:
- 强一致性: 当更新操作完成之后,在任何时刻所有的用户或者进程查询到的都是最近一次成功更新的数据。强一致性是程度最高一致性要求,也是最难实现的。
- 弱一致性: 当数据更新后,后续对该数据的读取操作可能得到更新后的值,也可能是更改前的值。
- 最终一致性: 在某一时刻用户或者进程查询到的数据可能都不同,但是最终成功更新的数据都会被所有用户或者进程查询到。简单理解为,就是在一段时间后,数据会最终达到一致状态。
AP 理论中的一致性是指强一致性( Strong Consistency ),又叫线性一致性( Linearizable Consistency ),它要求多节点组成的分布式系统,能像单节点一样运作,如果一个写操作成功写入,那么之后的读请求都必须读到这个新数据。
2.Availability (可用性)
CAP 理论对可用性的定义,指的是要求系统提供的服务必须处于 100% 可用的状态,对于用户的每一个操作请求,系统总能够在有限的时间内返回结果。
用户访问集群中的任意健康节点,必须能得到响应,而不是超时或拒绝或者访问失败。
3.Partition Tolerance(分区容错性)
-
Partition(分区):因为网络故障或其它原因导致分布式系统中的部分节点与其它节点失去连接,形成独立分区。
-
Tolerance(容错):在集群出现分区时,整个系统也要持续对外提供服务。
注意:
在分布式系统中,分区容错性我们必须要保证。在发生网络分区的情况下,如果系统不能容忍这种分区,可能会导致整个系统无法提供服务或者数据丢失。
三、选择
在选择了P(分区容错)之后,C(一致性)和A(可用性)我么只能选择其中一个。因为AC之间是相互冲突的。
当系统出现分区后,系统上的某个节点正在进行写操作。要想保证C(一致性),那么就必须禁止其他节点的读写操作以等待数据同步完成,但是这就和A(可用性)发生冲突了。同样,为了保证A,在数据同步完成之前,其他节点可以正常进行读写操作的话,就和C发生冲突了。
CP与AP如何取舍
满足CP舍弃A,也就是满足一致性和容错性,舍弃可用性。如果你的系统允许有段时间的访问失效等问题,这个是可以满足的。就好比多个人并发买票,后台网络出现故障,你买的时候系统就崩溃了。
满足AP舍弃C,也就是满足可用性和容错性,舍弃一致性。这也就是意味着你的系统在并发访问的时候可能会出现数据不一致的情况。
CAP实际应用案例
- ZooKeeper 保证的是 CP。
- Eureka 保证的则是 AP。
- Nacos 不仅支持 CP 也支持 AP。
- Redis中间件 ----> AP
- RocketMQ中间件 -----> AP
总结
在系统发生“分区”的情况下,CAP 理论只能满足 CP 或者 AP。要注意的是,这里的前提是系统发生了“分区”。
如果系统没有发生“分区”的话,节点间的网络连接通信正常的话,也就不存在 P 了。这个时候,我们就可以同时保证 C 和 A 了。