内容纲要
简介
CAP 定理又称 布鲁尔定理。对于设计分布式系统的架构师来说,是一个必须掌握的定理。
定义
在一个分布式系统(指相互连接并共享数据的节点的集合:不是所有分布式系统都互联和共享数据,CAP 理论只讨论互联和共享数据的分布式系统),当涉及读写操作时(CAP 关注数据的读写操作,对分布式系统中的其它功能不一定关注),只能保证一致性(C)、可用性(A)和分区容忍性(P)中的两个,另一个必须牺牲。
- C(Consistency:一致性)
- 节点角度(不够严谨):所有节点在同一时刻都能看到相同的数据(CAP 是忽略延迟的;实际上很难保证数据在同一时刻完全一致,因为网络必然存在延迟)
- 客户端角度:对指定客户端来说,读操作能保证返回最新的写操作结果
- A(Availability:可用性)
- 非故障的节点在合理的时间内返回合理的响应(不是错误和超时响应;合理响应结果不一定是正确响应结果)
- P(Partition Tolerance:分区容忍性)
- 当出现网络分区后,能够继续履行职责
组合
- CA
- 保证一致性和可用性,牺牲分区容忍性
- 当出现网络分区时(网络不可能 100% 可靠,分区必然出现),为了保证一致性,系统必须禁止写入,当有写入请求时,系统会返回错误,这将导致可用性不能被满足
- 分布式系统理论上不能使用保证 CA 的架构
- 当出现网络分区时(网络不可能 100% 可靠,分区必然出现),为了保证一致性,系统必须禁止写入,当有写入请求时,系统会返回错误,这将导致可用性不能被满足
- 保证一致性和可用性,牺牲分区容忍性
- CP
- 保证一致性和分区容忍性,牺牲可用性
- AP
- 保证可用性和分区容忍性,牺牲一致性
“牺牲”不代表什么都不做,需要为分区故障恢复后坐准备。
CAP 关注的粒度是数据,而不是整个系统;在实际设计过程中,每个系统不可能只有一种数据,有得数据必须选择 CP,有的数据必须选择 AP,我们做系统设计时,不能从整个系统的角度去选择 CP 或者 AP,不然怎么选都会有问题;我们需要根据不同的应用场景和要求进行分类,分别选择不同的策略。
应用
系统设计时,需要考虑分区情况。
- 分区未发生
- 正常运行状态下不存在 CP、AP 的选择,可以同时满足 CA
- 分区发生
- 保证 CP 或者 AP
- 在分区故障解决后进行恢复,让系统恢复到 CA 的状态
架构选择 CP、AP 只是在出现网络分区的情形下需要的保证;当系统处于正常运行中(99.99%、99.999% 可用等),不管是 CP 还是 AP,都需要同时满足 CA。
其它理论
ACID
ACID 是数据库系统为了保证事务的正确性而提出来的一个理论。它包含了 4 个约束:
- 原子性(Atomicity)
- 一个事务中,要么全部完成,要么全部不完成
- 事务在执行过程中发生错误,会回滚到执行前的状态
- 一致性(Consistency)
- 在事务开始之前和结束之后,数据库的完整性没有遭到破坏
- 隔离性(Isolation)
- 数据库允许多个事务同时对数据进行读写和修改(防止多个事务同时执行时由于交叉执行导致数据不一致)
- 隔离分为不同级别
- 未提交(read uncommitted)
- 读提交(read committed)
- 可重复读(repeatable read)
- 串行化(Serializable)
- 持久性(Durability)
- 事务处理后,对数据的修改是永久的,即使数据库故障也不会丢失
BASE
BASE 理论是对 CAP 的一种延伸和补充(对 AP 方案的补充), 核心思想是即使无法达到强一致性(CAP 的一致性就是强一致性),但应用可以使用适当的方式来达到最终一致性。
- 基本可用性(Basically Available)
- 分布式系统在故障时,允许损失部分可用性,即保证核心可用
- 软状态(Soft State)
- 允许系统存在中间状态(CAP 理论中的数据不一致),而该中间状态不会影响系统整体可用性
- 最终一致性(Eventual Consistency)
- 系统中的所有数据副本在经过一段时间后,最终能达到一致的状态