CAP 理论笔记
一、CAP 理论概述
CAP 理论由 Eric Brewer 于 2000 年提出,并在 2002 年被正式证明。它描述了分布式系统在 一致性(Consistency)、可用性(Availability)、分区容忍性(Partition Tolerance) 三个特性之间的取舍。
CAP 三个核心概念:
- C(Consistency,一致性)
所有节点在同一时间的数据视图一致。
表现:客户端无论连接哪个节点,都能读取到最新数据。 - A(Availability,可用性)
每个请求都能在有限时间内得到响应(成功或失败)。
表现:即使部分节点宕机,系统也能正常对外提供服务。 - P(Partition Tolerance,分区容忍性)
系统能够容忍网络分区(节点间通信中断)并继续提供服务。
表现:即使集群被分隔成多个子集群,系统仍能运行。
二、为什么不能同时满足 CAP 三者?
原因:
分布式系统不可避免会出现 网络分区(P),如果系统要求 可用性(A),必须继续响应请求;如果要求 一致性(C),必须等待所有节点同步完成再返回结果。这两者在网络分区时是冲突的。
直观示例:
- 如果要保证 一致性(C):
网络分区后,某个节点接到写请求,必须等待另一个分区的节点确认,导致无法响应,降低可用性。 - 如果要保证 可用性(A):
网络分区后,节点仍然独立处理请求,但不同分区的数据可能不一致。
三、CAP 三者的关系
CAP 理论核心结论:
在分布式系统中,网络分区(P)必然会发生,因此只能在 一致性(C)和可用性(A)之间取舍。
对应组合:
- CP 系统(Consistency + Partition Tolerance)
特点:牺牲可用性,保证一致性。
示例:ZooKeeper、HBase。 - AP 系统(Availability + Partition Tolerance)
特点:牺牲强一致性,保证可用性,采用最终一致性。
示例:Cassandra、Eureka。 - CA 系统(Consistency + Availability)
特点:不考虑网络分区(单机数据库)。
示例:MySQL 单机模式。
四、分布式场景下的 CAP 取舍
系统类型 | 选择 | 典型案例 |
---|---|---|
单机数据库 | CA | MySQL 单机 |
分布式协调服务 | CP | Zookeeper、etcd |
分布式缓存系统 | AP | Redis Cluster、Cassandra |
五、CAP 理论在常见系统中的应用
1. MySQL 主从复制
-
目标:数据一致性高(主从同步),但延迟可能影响可用性。
-
方案:
- 强一致性(CP):主从同步采用 同步复制,但可用性下降。
- 高可用(AP):主从同步采用 异步复制,提升可用性,但可能出现短暂不一致。
2. Redis Cluster
-
目标:高可用性。
-
Redis 选择 AP:
- 分区时,仍然接受请求,保证可用性。
- 通过 异步复制 + 最终一致性 解决数据一致性问题。
3. ZooKeeper
-
目标:强一致性。
-
ZooKeeper 选择 CP:
- 网络分区时,为保持一致性,部分节点拒绝服务,降低可用性。
六、CAP 与 BASE 理论
CAP 是基础理论,而实际工程中,很多系统选择 AP + 最终一致性,这就是 BASE 理论:
- Basically Available(基本可用)
- Soft State(软状态)
- Eventually Consistent(最终一致性)
七、图解 CAP
CAP 三角关系+-----------+| C || || |+----+----+ || | |A P
- CA:单机系统。
- CP:一致性 + 分区容忍 → 牺牲可用性。
- AP:可用性 + 分区容忍 → 牺牲强一致性。
八、面试高频问答
Q1:CAP 理论中,为什么不能同时满足三者?
- 网络分区(P)在分布式系统中必然发生。
- 分区发生时,保证 一致性(C) 需要同步确认,降低可用性。
- 保证 可用性(A) 则必须放弃强一致性。
Q2:MySQL 属于 CAP 哪种?
-
单机:CA。
-
主从复制:
- 同步复制:CP。
- 异步复制:AP。
Q3:Redis 属于 CAP 哪种?
- Redis Cluster:AP(高可用 + 最终一致性)。
Q4:ZooKeeper 属于哪种?
- CP(牺牲可用性,保证一致性)。
Q5:CAP 理论与 BASE 理论区别?
- CAP:理论模型,三者不可兼得。
- BASE:工程实践,强调最终一致性。
九、总结表
特性 | 含义 | 典型场景 |
---|---|---|
C | 所有节点数据一致 | 事务数据库 |
A | 每次请求都能得到响应 | 分布式缓存 |
P | 系统能容忍分区故障并继续提供服务 | 所有分布式系统必须具备的能力 |