CAP 理论被很多人拿来作为分布式系统设计的金律,然而感觉大家对 CAP 这三个属性的认识却存在
不少误区,那么什么是 CAP 理论呢?CAP 原本是一个猜想,2000 年 PODC 大会的时候大牛
Brewer 提出的,他认为在设计一个大规模可扩放的网络服务时候会遇到三个特性:一致性
(consistency)、可用性(Availability)、分区容错(partition-tolerance)都需要的情景,
然而这是不可能都实现的。之后在 2003 年的时候,Mit 的 Gilbert 和 Lynch 就正式的证明了这三
个特征确实是不可以兼得的。
CAP 是 Consistency、Availablity 和 Partition-tolerance 的缩写。分别是指:
1)一致性(Consistency):每次读操作都能保证返回的是最新数据。也就是说所有的节点数据一
致!
2)可用性(Availablity):任何一个没有发生故障的节点,会在合理的时间内返回一个正常的结
果。也就是说一个或者多个节点失效,不影响服务请求!
3)分区容忍性(Partition-torlerance):当节点间出现网络分区,照样可以提供服务。也就是说
节点间的网络连接失效,仍然可以处理请求!
其实,任何一个分布式系统,需要满足这三个中的两个。CAP 理论指出:CAP 三者只能取其二,不
可兼得。其实这一点很好理解,理由如下:
1-首先,单机都只能保证 CP。
2-有两个或以上节点时,当网络分区发生时,集群中两个节点不能相互通信(也就是说不能保证
可用性 A)。此时如果保证数据的一致性 C,那么必然会有一个节点被标记为不可用的状态,违反
了可用性 A 的要求,只能保证 CP。
3-反正,如果保证可用性 A,即两个节点可以继续各自处理请求,那么由于网络不通不能同步数据,
必然又会导致数据的不一致,只能保证 AP。
一、单实例
单机系统和显然,只能保证 CP,牺牲了可用性 A。单机版的 MySQL,Redis,MongoDB 等数据
库都是这种模式。