知识卡片
CAP理论适用范围的精确化:互联且共享数据的读写系统
内容
CAP定理(又称布鲁尔定理)由Eric Brewer在2000年提出、2002年由MIT的Seth Gilbert和Nancy Lynch证明成立,但布鲁尔提出猜想时并没有给Consistency、Availability、Partition Tolerance三个词下精确定义,导致不同资料的表述有细微差异。以Robert Greiner的两版CAP解释为参照,第一版给出的是”任意分布式系统不可能同时满足C、A、P三者”这样一句极简结论;第二版把适用范围收窄为更精确的表述——”在一个由互相连接(interconnected)并共享数据(share data)的节点组成的分布式系统里,涉及一次读写操作(write/read pair)时,只能保证C、A、P三者中的两个”。这个收窄带来两个关键差异:一是CAP讨论的分布式系统必须满足”节点互联且共享数据”这两个条件——不是所有分布式系统都符合,比如Memcache集群里各节点之间互不连接、也不共享数据,因此不属于CAP理论要讨论的对象;而MySQL集群的节点之间是互联并做数据复制的,才真正落在CAP的讨论范围内。二是CAP关注的只是”对数据的读写操作”,而不是分布式系统的全部功能——比如ZooKeeper的选举机制本身不涉及数据读写,就不是CAP理论要讨论的对象。第二版定义虽然更严谨,但相对第一版更难记,因此实践中大多数技术人员谈CAP时依然沿用第一版这句简单的表述,只是理解上要清楚它省略了这些精确的适用边界。
结构图:
flowchart TB
A["CAP理论两版定义对比"]
A --> B["第一版:任意分布式系统<br/>不可能同时满足C/A/P"]
A --> C["第二版:互联且共享数据的节点集合<br/>涉及读写操作时只能满足C/A/P中两个"]
C --> D["限定①节点必须互联+共享数据<br/>Memcache集群(节点不互联不共享)→不适用<br/>MySQL集群(互联+数据复制)→适用"]
C --> E["限定②只讨论读写操作本身<br/>非读写功能(如ZooKeeper选举机制)→不属于CAP讨论对象"]
B --> F["实践中大多数人仍沿用第一版表述<br/>因为简单好记,但理解上要知道其省略了精确边界"]
参考来源
- 位置:《从零开始学架构》第22讲《想成为架构师,你必须知道CAP理论》"CAP理论"(源文件:_epub-src/OEBPS/text00002.html,引用Robert Greiner两篇文章)
- 结论依据:原文对比第一版"Any distributed system cannot guaranty C, A, and P simultaneously"与第二版"In a distributed system (a collection of interconnected nodes that share data.), you can only have two out of the following three guarantees",并说明"分布式系统并不一定会互联和共享数据……Memcache 的集群……就不符合 CAP 理论探讨的对象""CAP 关注的是对数据的读写操作,而不是分布式系统的所有功能……ZooKeeper 的选举机制就不是 CAP 探讨的对象",直接支撑本卡片结论与结构图。
- 原始内容:第二版定义了什么才是 CAP 理论探讨的分布式系统,强调了两点:interconnected 和 share data……CAP 关注的是对数据的读写操作,而不是分布式系统的所有功能……相比来说,第二版的定义更加精确。