CAP 定理,又称布鲁尔定理(Brewer’s Theorem),是分布式系统领域最核心的理论之一。它指出:在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)这三个要素最多只能同时实现两个,不可能三者兼得。
CAP 的三个维度
- C - 一致性 (Consistency):
- 含义:所有节点在同一时间看到的数据完全一致。
- 表现:对某个节点写入数据后,后续从任何节点读取该数据,都必须返回刚刚写入的最新的值(或报错),而不是旧数据。
- A - 可用性 (Availability):
- 含义:系统提供的服务必须一直处于可用状态。
- 表现:每一个非故障节点收到的请求都必须在合理的时间内给出响应(非错误响应),无论数据是否是最新的。
- P - 分区容错性 (Partition tolerance):
- 含义:当系统内部出现网络分区(即节点之间通信丢失,但节点自身仍在运行)时,系统仍能继续工作。
- 表现:分布式系统必须能够容忍网络故障。
为什么只能“三选二”?
在分布式系统中,P(分区容错性)通常是必须保证的,因为网络故障在分布式环境下是不可避免的。因此,架构师通常需要在 CP 和 AP 之间做出权衡:
CP (Consistency + Partition tolerance)
- 策略:为了保证数据强一致,在发生网络分区时,系统会拒绝服务或等待同步。
- 场景:强一致性系统在网络异常时会选择停止服务(牺牲可用性 A)来确保数据不出错。
- 典型例子:Zookeeper、Etcd、大多数关系型数据库的强一致模式。
AP (Availability + Partition tolerance)
- 策略:为了保证高可用,即使发生网络分区,每个节点依然响应请求,但这可能导致不同节点返回的数据不一致。
- 场景:对实时性要求高、但对数据短时间不一致容忍度高的系统。
- 典型例子:Cassandra、DynamoDB、Redis(某些配置下)。
CA (Consistency + Availability)
- 策略:同时保证一致性和可用性。
- 现实情况:这在分布式系统中几乎是不存在的,因为放弃了 P 意味着系统不能有网络分区。这通常只存在于单机数据库或极其理想的局域网环境中。
总结
CAP 定理提供了一个理论边界:如果你追求强一致性(C),那么在网络不稳定的极端情况下(P),你必须接受系统可能暂时不可用(牺牲 A)。