知识卡片
CAP三选二对应的三类真实系统选择
内容
CAP定理说分布式系统中一致性(Consistency,任何时刻任何节点看到的数据都 符合预期)、可用性(Availability,系统持续提供服务的能力)、分区容忍性 (Partition Tolerance,节点间失联时仍能正确服务的能力)三者最多同时满足 两个,且已由严谨数学证明。放弃分区容忍性(CA without P)意味着假设节点 通信永远可靠,现实中唯一站得住脚的例子是像Oracle RAC这样通过共享磁盘 (而非网络)同步数据的集群——它虽由多实例组成,但本质不是分布式数据库, 因为它压根没有网络分区问题需要面对。放弃可用性(CP without A)意味着一旦 分区就可以让同步无限期拖延,问题因此退化成单服务多数据源场景,可以用 2PC/3PC解决,HBase的RegionServer宕机后对应键值范围整体离线直到恢复, 就是典型CP系统。放弃一致性(AP without C)是分布式系统设计的主流选择—— 因为P是网络的天然属性、丢不掉,而A通常才是做分布式的初衷,多数NoSQL和 分布式缓存(如Redis集群)都是AP系统,分区时各节点仍用本地数据对外服务, 代价是不同节点可能返回不一致的结果。选P还是选C/A本质是问自己:这套系统 的存在意义,是”绝对正确”更重要,还是”一直能用”更重要。
结构图:
flowchart TD
CAP[CAP三选二] -->|放弃P: 假设网络永远可靠| CA["CA without P<br/>如Oracle RAC共享磁盘集群<br/>本质非分布式"]
CAP -->|放弃A: 分区时可无限等待同步| CP["CP without A<br/>如HBase, 退化为2PC/3PC问题"]
CAP -->|放弃C: 分区时允许数据不一致| AP["AP without C<br/>如Redis集群, 主流分布式选择"]
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第3章"事务处理"3.4.1节
"CAP与ACID"(源文件:_epub-src对应OEBPS/Text/chapter31.xhtml)
- 结论依据:原文分别用Oracle RAC共享磁盘、HBase RegionServer离线、
Redis集群分区时仍用本地数据服务三个具体系统例子,说明放弃P/A/C各自
对应的现实选择,直接支撑本卡片的分类结构。
- 原始内容:如果放弃分区容忍性……以Oracle的RAC集群为例……并不能称作
分布式数据库。如果放弃可用性……著名的HBase也属于CP系统。如果放弃
一致性……目前大多数NoSQL库和支持分布式的缓存框架都是AP系统,以Redis
集群为例……