本文全面解释了 CAP 定理和分布式系统中使用的各种一致性模式。理解这些概念对于设计可伸缩和可靠的分布式系统至关重要。有关补充这些一致性模型的具体可用性模式的信息,请参阅可用性模式。
CAP 定理由计算机科学家 Eric Brewer 于 2000 年提出,指出在分布式计算机系统中,不可能同时保证以下三个特性
由于现实世界中的网络并非完全可靠,分区容错性实际上是分布式系统的基本要求。因此,系统设计者必须在一致性和可用性之间做出权衡。
来源: README.md:439-446
CP 系统优先考虑一致性和分区容错性,而非可用性。在这些系统中
示例:PostgreSQL 等传统关系型数据库、HBase、MongoDB(在某些配置下)
AP 系统优先考虑可用性和分区容错性,而非一致性。在这些系统中
示例:Cassandra、Amazon DynamoDB、CouchDB
来源: README.md:447-465
| 要求 | CP (一致性 + 分区容错性) | AP (可用性 + 分区容错性) |
|---|---|---|
| 业务需求 | 原子读写 | 分区期间的高可用性 |
| 数据要求 | 所有客户端必须看到相同的数据 | 临时不一致性可接受 |
| 示例 | 银行交易、库存系统 | 内容分发、社交媒体动态 |
| 故障响应 | 某些请求可能因超时错误而失败 | 所有请求均收到响应(可能是陈旧数据) |
来源: README.md:456-465
一致性模式定义了在分布式系统中,数据副本的更改如何以及何时对客户端可见。一致性模式的选择会影响系统性能、可用性和正确性。
来源: README.md:473-476
在弱一致性中
在实现弱一致性时,系统通常优先考虑速度和可用性而不是数据完整性。例如,在语音通话中,如果连接中断几秒钟,当连接重新建立时,您不会听到连接中断期间说的话。
来源: README.md:477-481
在最终一致性中
最终一致性是弱一致性的一种特殊情况,其中存储系统保证,如果对给定数据项没有新的更新,最终所有对该项的访问都将返回最后更新的值。
这种方法常用于分布式系统,如 Amazon 的 DynamoDB 和 Cassandra,其中系统优先考虑可用性而非即时一致性。
来源: README.md:483-487
在强一致性中
强一致性通常涉及分布式锁或共识协议(如 Paxos 或 Raft)以确保所有节点就操作顺序达成一致。这种方法确保了数据完整性,但在网络分区期间可能会降低可用性。
来源: README.md:489-493
| 方面 | 弱一致性 | 最终一致性 | 强一致性 |
|---|---|---|---|
| 读取保证 | 可能看到也可能看不到最新写入 | 最终会看到最新写入 | 始终看到最新写入 |
| 复制 | 尽力而为 | 异步 | 同步 |
| 性能 | 最高 | 高 | 较低 |
| 用例 | 实时应用(VoIP、游戏) | DNS、电子邮件、社交媒体 | 金融系统、库存管理 |
| CAP 关注点 | AP(可用性与分区容错性) | AP(可用性与分区容错性) | CP(一致性与分区容错性) |
| 示例系统 | Memcached | DynamoDB、Cassandra | 传统 RDBMS、HBase(在某些配置下) |
来源: README.md:477-493
NoSQL 数据库通常实现自己的一致性模型,这与传统 RDBMS 系统不同。许多 NoSQL 系统遵循 BASE 原则
这种方法与传统关系型数据库中的 ACID 属性(原子性、一致性、隔离性、持久性)形成对比。
来源: README.md:993-999
一个保持强一致性的写通缓存
在实际系统中实现一致性模型时,请考虑
来源: README.md:1088-1178, README.md:1179-1273
CAP 定理为理解分布式系统设计中的基本权衡提供了一个框架。在实践中,系统通常会根据具体要求为不同的组件实现不同的一致性模式
通过理解这些权衡,系统设计者可以就哪些保证对他们的特定用例最重要做出明智的决定。
来源: README.md:439-496