目录
1. 什么是 CAP 定理
CAP 定理(CAP theorem)又被称作「布鲁尔定理」,是加州大学伯克利分校的计算机科学家埃里克·布鲁尔(Eric Brewer)在 2000 年的 ACM PODC 上提出的一个猜想。2002 年,麻省理工学院的赛斯·吉尔伯特(Seth Gilbert)和南希·林奇(Nancy Lynch)发表了布鲁尔猜想的证明,使之成为分布式计算领域公认的一个定理。
该定理指出一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。
2. 一致性(Consistency)
A read is guaranteed to return the most recent write for a given client.
对某个指定的客户端来说,读操作保证能够返回「最新的写操作结果」。
3. 可用性(Availability)
A non-failing node will return a reasonable response within a reasonable amount of time (no error or timeout).
非故障的节点在合理的时间内返回「合理的响应不是错误和超时的响应」。
4. 分区容错性(Partition tolerance)
System continues to work despite message loss or partial failure.
当出现网络分区后,系统能够继续「履行职责」。
5. CAP 到底如何选
- 虽然 CAP 理论定义是三个要素中只能取两个,但放到分布式环境下来思考,我们会发现必须选择 P(分区容忍)要素,因为网络本身无法做到 100% 可靠,有可能出故障,所以分区是一个必然的现象。
- 如果我们选择了 CA 而放弃了 P,那么当发生分区现象时,为了保证 C,系统需要禁止写入,当有写入请求时,系统返回 error(例如,当前系统不允许写入),这又和 A 冲突了,因为 A 要求返回 no error 和 no timeout。因此,分布式系统理论上不可能选择 CA 架构,只能选择 CP 或者 AP 架构。
6. 数据库中的 CAP 定理
6.1 MongoDB 与 CAP
MongoDB 是一个流行的 NoSQL 数据库管理系统,它将数据存储为 BSON(binary JSON)文档。
相对于 CAP 定理,MongoDB是一个 CP 数据存储,它通过保持一致性来解决网络分区问题,同时降低可用性。
MongoDB 是一个单一的主系统,每个副本集只能有一个主节点来接收所有的写操作。同一副本集中的所有其他节点都是辅助节点,它们复制主节点的操作日志并将其应用于自己的数据集。默认情况下,客户机也从主节点读取数据,但他们也可以指定一个允许他们从辅助节点读取数据的读取首选项。
当主节点不可用时,具有最新操作日志的次节点将被选为新的主节点。一旦所有其他次要节点都赶上新的主节点,集群将再次可用。由于在此期间客户端无法发出任何写请求,因此数据在整个网络中保持一致。
6.2 Cassandra 与 CAP
Apache Cassandra 是由 Apache 软件基金会维护的开源 NoSQL 数据库。它是一个列式数据库,允许您在分布式网络上存储数据。然而,与 MongoDB 不同的是,Cassandra 拥有一个无主的架构。
相对于 CAP 定理,Cassandra 是一个 AP 数据库,它提供可用性和分区容忍度,但不能一直提供一致性。因为 Cassandra 没有主节点,所以所有节点必须连续可用。然而,Cassandra 允许客户机在任何时候向任何节点写入数据并尽快协调不一致,从而提供了最终的一致性。
7. 巨人的肩膀
- https://towardsdatascience.com/cap-theorem-and-distributed-database-management-systems-5c2be977950e
- https://mwhittaker.github.io/blog/an_illustrated_proof_of_the_cap_theorem/
- https://www.ibm.com/cloud/learn/cap-theorem
- https://www.educative.io/edpresso/what-is-the-cap-theorem