CAP 由 Eric Brewer 在 2000 年 PODC 会议上提出,包含以下 3 个要素:
Consistency (数据一致性)
如果系统对一个写操作返回成功,那么之后的读请求都必须读到这个新数据;
如果返回失败,那么所有读操作都不能读到这个数据,对调用者而言数据具有强一致性(strong consistency) (又叫原子性 atomic、线性一致性 linearizable consistency)。
Availability(服务可用性)
所有读写请求在一定时间内得到响应,可终止、不会一直等待。
Partition-tolerance(分区容错性)
在网络分区的情况下,被分隔的节点仍能正常对外服务。
在某时刻如果满足AP,分隔的节点同时对外服务但不能相互通信,将导致状态不一致,即不能满足C;
如果满足CP,网络分区的情况下为达成C,请求只能一直等待,即不满足A;
如果要满足CA,在一定时间内要达到节点状态一致,要求不能出现网络分区,则不能满足P。
C、A、P三者最多只能满足其中两个,和 FLP 定理一样,CAP 定理也指示了一个不可达的结果(impossibility result)。
如图所示,是我们证明CAP的基本场景,网络中有两个节点N1和N2,可以简单的理解N1和N2分别是两台计算机,他们之间网络可以连通,N1中有一个应用程序A,和一个数据库V,N2也有一个应用程序B和一个数据库V。现在,A和B是分布式系统的两个部分,V是分布式系统的数据存储的两个子数据库。