什么是 CAP 定理?为什么 CAP 原则不能同时被满足,只能满足其中的两条?

85 阅读3分钟

什么是 CAP 定理?

CAP 定理是分布式系统设计中的核心理论,由 Eric Brewer 提出,它指出一个分布式系统无法同时满足 一致性(Consistency)可用性(Availability)分区容错性(Partition Tolerance) 这三个特性,最多只能同时满足其中两个。

cap原理.webp

cap原理图

三个特性的核心定义如下:

  • 一致性(C):所有节点在同一时间访问到的数据是完全一致的,即对数据的更新操作执行成功后,所有节点都能看到最新结果。

  • 可用性(A):系统在任何时候(即使部分节点故障),只要收到用户的合法请求,就必须在合理时间内返回非错误的响应。

  • 分区容错性(P):当分布式系统中的网络发生分区(即部分节点与其他节点通信中断)时,系统仍能继续正常运行。

为什么 CAP 不能同时满足?

核心矛盾源于网络的不确定性,即分布式系统中“分区(P)”是客观存在且无法避免的(如网络延迟、断网)。当发生分区时,系统只能在“一致性(C)”和“可用性(A)”之间做权衡,无法两者兼得,具体推导如下:

1.假设同时满足 P 和 C,必然牺牲 A

  • 当网络分区发生时,系统被分成 A、B 两个独立集群。若客户端向 A 集群写入了新数据,为保证一致性(C),B 集群必须同步该数据才能提供读取服务。但由于分区,A、B 无法通信,B 集群无法获取最新数据,此时系统只能拒绝 B 集群的读取请求(否则会返回旧数据,破坏 C),这就导致 B 集群不可用,即牺牲了可用性(A)。

2.假设同时满足 P 和 A,必然牺牲 C

  • 同样发生网络分区后,为保证可用性(A),A、B 集群都需正常响应客户端请求。若客户端先向 A 写入新数据,再向 B 读取数据,由于分区导致数据未同步,B 会返回旧数据,此时系统无法保证数据一致性(C),即牺牲了一致性。

3.假设同时满足 C 和 A,必然无法应对 P

  • 若要同时保证一致性和可用性,前提是网络始终稳定(无分区),所有节点能实时同步数据。但分布式系统的本质是跨网络部署,分区(P)无法避免,一旦发生分区,C 和 A 就无法同时满足,因此“同时满足 C、A、P”在分布式环境下是不可能实现的。

综上,由于网络分区的客观存在,分布式系统在设计时必须根据业务场景取舍:优先保证一致性和分区容错性(如银行转账系统),或优先保证可用性和分区容错性(如电商商品详情页)。