一句话定义
CAP 定理证明:网络分区(P)发生时,系统只能在一致性(C)与可用性(A)之间二选一;工程实践因此展开为一条「一致性谱系」——从线性一致到最终一致,按业务代价选择落点,而不是喊口号「选 CP 还是 AP」。
为什么重要
- 它是分布式数据库一切「为什么不能既要又要」讨论的理论支点:跨机房多活、复制模式选择、Quorum 参数设计都在其框架内。
- 「CAP 三选二」是最流传也最常被误读的理论,澄清误解(P 不是可选项、分区之外可以三者兼得)直接影响架构判断质量。
- 一致性谱系给了选型语言:读己之写、单调读、线性一致、因果一致——每档都有明确代价(kp-023 的延迟、kp-018 的阻塞)。
前置知识
kp-018(跨节点提交)、kp-023(复制与延迟)。
核心概念
- 一致性(C):线性一致(Linearizability)——所有操作表现得像在单一节点上按全局顺序执行。
- 可用性(A):每个非故障节点都能在合理时间内响应。
- 分区容忍(P):网络分区(消息丢失/延迟)下系统仍能工作;现实网络中 P 必然发生,不可放弃。
- 一致性阶梯:线性一致 > 顺序一致 > 因果一致 > 读己之写/单调读(会话保证)> 最终一致。
- Quorum:
R + W > N读写集交集非空,以概率/机制方式逼近强读(Dynamo 风格)。 - PACELC:分区时选 A 或 C;无分区(Else)时在延迟(L)与一致性(C)间权衡——更贴近日常。
原理与机制
Gilbert-Lynch 证明的直觉:分区发生时,若系统仍要响应读(A),各侧只能用本地数据(放弃 C);若坚持全局一致(C),跨分区操作必须等待或拒绝(放弃 A)。关键澄清有三:其一,正常(无分区)运行时 C 与 A 可兼得,CAP 只约束分区时刻;其二,「选择」不是一次性开关,而是按数据域/操作粒度决策——支付走强一致、点赞走最终一致;其三,最终一致不等于「随便读旧值」,可叠加会话保证(读己之写、单调读)修复最常见的用户侧违和。Quorum 机制 N=3, R=2, W=2 使读写必有重叠副本,读到「最新已确认」值;但 Quorum ≠ 线性一致(并发写排序、时钟漂移仍可破坏全局序),Dynamo 用向量时钟/last-write-wins 收敛冲突,LWW 依时钟定胜负、时钟异常即丢更新。
实例或案例
电商多活架构的数据域分级:库存与支付走「CP 域」(单写主 + 同步复制,分区时拒绝服务,宁可不可用不可超卖);商品详情走「AP 域」(异步多主复制,分区时各区可售可读,恢复后收敛);购物车走「会话保证域」(按用户哈希单主,保证读己之写)。同一系统三种档位并存——这就是 CAP 的工程化读法。Quorum 案例:N=3, W=2, R=2,一个副本宕机仍可读写;两个宕机则降级为读旧值(保持可用)或拒绝读(保持一致),由业务开关决定。
常见误区
- 把 CAP 当「三选二的静态配置」:P 是必然选项,真正的选择发生在分区时刻的行为策略与日常的延迟-一致权衡(PACELC)。
- 认为异步复制「违反 CAP」:违反与否只在分区时行为里评价,日常异步复制是 PACELC 中「L 换 C」的合法落点。
- 把最终一致理解为「数据会自动变对,无需设计」:冲突收敛策略(LWW/CRDT/业务合并)必须显式设计,否则是「最终乱」。
自测题
- 为什么说「CAP 中 P 不可放弃」? 答:现实网络必然出现消息丢失与延迟(分区态),放弃 P 的系统在第一次网络抖动时整体失效,不具备工程意义。
R + W > N能否保证线性一致? 答:不能。Quorum 只保证读写集有交集、能读到已确认值;并发写的全局排序、时钟偏差仍可能破坏线性一致,需共识协议(kp-026)加持。
公式或模型
Quorum 交集条件:R + W > N;写可用性 ≈ C(N, W) 副本组合存活概率,读新鲜性随 R 增大而增强、读延迟随 R 增大而升高——三个参数是延迟/一致性滑杆。
图示
直观类比
一家连锁店的价签管理:线性一致像总部每变一次价、全部门店实时同步后才允许交易(最准最慢);最终一致像每晚总部把最新价目广播下去(白天各店可能卖旧价);读己之写像「你自己刚改过的价签你自己必能看到」——大部分纠纷靠这条小保证就能平息。
与其他知识点的关系
kp-023 的三种复制模式即谱系上的三个锚点;kp-026 的共识是把 C 档做到极致的机制;kp-030 的选型框架把「数据域一致性档位」作为第一层决策。
延伸阅读
- Brewer《CAP Twelve Years Later: How the "Rules" Have Changed》(IEEE Computer 2012)
- Gilbert & Lynch(SIGACT News 2002)CAP 形式化证明