CAP 理论
CAP 讨论网络分区下的一致性与可用性保证。本文负责定义、冲突推导和操作级取舍。
1. 面试核心
先记住这几条,再读正文- 线性一致性。 CAP 的 C 指线性一致性,要求操作遵守真实时间顺序。
- CAP 可用性。 CAP 的 A 要求非故障节点收到的每个请求最终正常完成。卡 · 多数派服务与请求范围
- 分区下的取舍。 持续网络分区下,系统无法同时保证 C 与 A。卡 · 三个性质的定义
- 多数派的可用范围。 多数派继续服务时,少数派拒绝请求仍违反 CAP 的全节点可用性。
- 正常网络下的取舍。 PACELC 补充网络正常时的延迟与一致性取舍。
2. 三个性质的定义
C 是线性一致性。操作看起来在调用与返回之间原子生效。已完成写入之后开始的读,应看到该写或更新结果。
A 是每个非故障节点收到的请求最终正常完成。定义没有固定的毫秒级期限。返回错误无法完成数据操作,因此不满足这里的 A。
P 表示模型允许节点间发生通信分区。消息可被丢弃,使两个节点长期无法交换信息。分区发生后,系统仍需决定如何处理读写。
3. 网络分区时的约束
假设 A、B 都保存初始值 0。网络分区后,A 接受写入 1 并返回成功。随后,客户端从 B 读取。
B 看不到 A 的写入。若返回 0,就违反该次读取的线性一致性。若无限等待通信恢复,请求就无法最终完成。
B 也无法可靠猜测新值。对 B 而言,远端写入 1 与写入 2 的执行无法区分。它在两种情况下给出同一结果,至少有一次错误。
CAP 排除的是同时保证三项性质。网络可通信且节点足够时,系统仍可正常提供一致服务。
4. 一致优先
一致优先的协议拒绝缺少安全依据的读写。多数派复制可在拥有有效多数的一侧继续写入。少数派放弃相关操作的可用性。
一致性无需等待所有副本。提交、读取和选举协议共同保护已确认结果。具体多数派规则见Raft。
5. 可用优先
可用优先允许不同分区分别处理请求。网络恢复后,需要传播与合并版本。
LWW 按确定的顺序选择一个版本。CRDT 可合并符合其模型的更新。业务也可保留冲突并交给用户处理。选择需说明哪些更新会被丢弃,以及窗口内返回什么结果。
6. 按操作选择
商品描述可读取旧副本,库存扣减则使用协调协议。系统也可开放陈旧读,同时拒绝缺少授权的写入。
CP 或 AP 是简化标签。接口应明确分区期间的结果:成功、陈旧值、冲突或错误。
6.1 多数派服务与请求范围
三节点分成两节点和单节点两个分区。多数侧可以继续确认写入。若单节点侧仍能收到请求却拒绝处理,全系统就缺少 CAP 的 A。
把客户端路由到多数侧可改善工程可用率。它改变了实际访问路径,但不改变 CAP 的全节点要求。SLO 则按指定入口、窗口和事件范围计算。
7. CAP 与一致性模型
CAP 的 C 使用线性一致性,其他可见性语义见一致性模型。ACID 的一致性则指事务维护业务约束。
8. 延迟与一致性
PACELC 将两类取舍放在一起。分区发生时,比较可用性与一致性。正常通信时,比较延迟与一致性。
例如,写入等待远端确认会增加网络耗时。本地先返回则留下传播窗口。实际成本还取决于副本位置和访问模式。
9. 常见问题
9.1 单机与分区模型
单节点内部没有副本间网络分区。通过网络复制后,客户端访问和故障切换才涉及这里的取舍。
9.2 超时与可用率
工程系统用超时限制等待,并按 SLO 统计影响。CAP 的 A 只要求最终完成,没有固定延迟上界。两种定义应分开使用。
10 · 面试题卡片
本页题目与参考回答
10.1 网络分区发生时,为什么一致性和可用性无法同时保证
考察重点
- CAP 三个性质的严格定义。
- 分区期间旧读、拒绝请求与多数派。
- 操作级权衡、一致性模型和延迟成本。
参考回答
持续分区时,一侧无法获知另一侧的新写入,因此无法同时保证线性一致性和每个非故障节点的可用性。
节点 A 已确认写入后,节点 B 若返回旧值,会破坏线性一致性;若一直等待分区恢复,请求就无法保证最终完成。
多数派协议可保留一致性,让少数侧拒绝操作。允许旧值或冲突的业务则可继续本地受理。CAP 的 A 覆盖每个非故障节点,且没有固定响应时限;工程可用率按 SLO 定义的范围统计。
10.2 三节点分区后多数侧仍可读写,是否满足 CAP 的可用性?
考察重点:全节点请求范围与工程可用率。
相关内容:多数派服务与请求范围。
参考回答
不满足全系统的 CAP 可用性保证。
少数侧节点仍在运行,却拒绝收到的相关请求。多数侧继续服务可以改善实际可用率。把请求路由到多数侧是工程策略,CAP 的定义仍覆盖非故障节点。