CAP 理论简介
CAP 理论是分布式系统、特别是分布式存储领域中被讨论得最多的理论。其中 C 代表一致性(Consistency),A 代表可用性(Availability),P 代表分区容错性(Partition tolerance)。CAP 理论告诉我们:C、A、P 三者不能同时满足,最多只能满足其中两个。
三个性质的含义:
- 一致性(Consistency):一个写操作返回成功,那么之后的读请求都必须读到这个新数据;如果返回失败,那么所有读操作都不能读到这个数据。所有节点访问同一份最新的数据
- 可用性(Availability):对数据更新具备高可用性,请求能够及时处理,不会一直等待,即使出现节点失效
- 分区容错性(Partition tolerance):能容忍网络分区,在网络断开的情况下,被分隔的节点仍能正常对外提供服务
CAP 三选二
三者最多同时满足其二,常见的取舍组合如下:
flowchart TD
CAP["CAP 三选二"] --> CA["CA:放弃分区容错<br/>单机/集中式数据库的思路"]
CAP --> CP["CP:放弃可用性<br/>分区时拒绝部分请求,优先保证一致性"]
CAP --> AP["AP:放弃强一致性<br/>分区时各节点继续服务,允许数据暂时不一致"]
一般来说,使用网络通信的分布式系统无法舍弃 P 性质,那么就只能在一致性和可用性上做一个艰难的选择。
对 CAP 理论的理解
理解 CAP 理论最简单的方式是想象两个副本处于分区两侧,即两个副本之间的网络断开,不能通信:
- 如果允许其中一个副本更新,则会导致数据不一致,即丧失了 C 性质
- 如果为了保证一致性,将分区某一侧的副本设置为不可用,那么又丧失了 A 性质
- 除非两个副本可以互相通信,才能既保证 C 又保证 A,这又会导致丧失 P 性质
CAP 理论的表述很好地服务了它的目的,开阔了分布式系统设计者的思路,在多样化的取舍方案下设计出多样化的系统。在过去的十几年里确实涌现了不计其数的新系统,也随之在一致性和可用性的相对关系上产生了相当多的争论。
CAP 理论深入理解
在 CAP 理论提出十二年之后,其作者又出来”辟谣”:“三选二”的公式一直存在着误导性,它会过分简单化各性质之间的相互关系:
- 首先,由于分区很少发生,那么在系统不存在分区的情况下没什么理由牺牲 C 或 A
- 其次,C 与 A 之间的取舍可以在同一系统内以非常细小的粒度反复发生,而每一次的决策可能因为具体的操作,乃至因为牵涉到特定的数据或用户而有所不同
- 最后,这三种性质都可以在程度上衡量,并不是非黑即白的有或无。可用性显然是在 0% 到 100% 之间连续变化的,一致性分很多级别,连分区也可以细分为不同含义,如系统内的不同部分对于是否存在分区可以有不同的认知
所以一致性和可用性并不是水火不容、非此即彼的。Paxos、Raft 等分布式一致性算法就是在一致性和可用性之间做到了很好平衡的见证。
在 AP 方向上对 CAP 的延伸与补充,见下一篇 分布式理论 - BASE。