菜单

CAP 定理与一致性模式

相关源文件

本文全面解释了 CAP 定理和分布式系统中使用的各种一致性模式。理解这些概念对于设计可伸缩和可靠的分布式系统至关重要。有关补充这些一致性模型的具体可用性模式的信息,请参阅可用性模式

CAP 定理

CAP 定理由计算机科学家 Eric Brewer 于 2000 年提出,指出在分布式计算机系统中,不可能同时保证以下三个特性

  • 一致性(Consistency):每次读取都会收到最近的写入或一个错误
  • 可用性(Availability):每个请求都会收到响应,但不保证响应包含最新版本的信息
  • 分区容错性(Partition Tolerance):系统在网络分区(节点间的通信中断)发生时仍能继续运行

由于现实世界中的网络并非完全可靠,分区容错性实际上是分布式系统的基本要求。因此,系统设计者必须在一致性和可用性之间做出权衡。

CAP 定理可视化

来源: README.md:439-446

CP - 一致性与分区容错性

CP 系统优先考虑一致性和分区容错性,而非可用性。在这些系统中

  • 当发生分区时,系统可能对某些客户端不可用
  • 系统确保所有成功的读取都收到最新的写入
  • 等待分区节点的响应可能会导致超时错误
  • 适用于需要原子读写操作的系统

示例:PostgreSQL 等传统关系型数据库、HBase、MongoDB(在某些配置下)

AP - 可用性与分区容错性

AP 系统优先考虑可用性和分区容错性,而非一致性。在这些系统中

  • 即使在网络分区期间,系统也保持可用
  • 响应返回数据最易于获取的版本,该版本可能不是最新的
  • 当分区解决后,写入可能需要一些时间才能传播
  • 适用于可以容忍最终一致性或需要在外部错误发生时继续工作的系统

示例:Cassandra、Amazon DynamoDB、CouchDB

来源: README.md:447-465

何时选择 CP 与 AP

要求CP (一致性 + 分区容错性)AP (可用性 + 分区容错性)
业务需求原子读写分区期间的高可用性
数据要求所有客户端必须看到相同的数据临时不一致性可接受
示例银行交易、库存系统内容分发、社交媒体动态
故障响应某些请求可能因超时错误而失败所有请求均收到响应(可能是陈旧数据)

来源: README.md:456-465

一致性模式

一致性模式定义了在分布式系统中,数据副本的更改如何以及何时对客户端可见。一致性模式的选择会影响系统性能、可用性和正确性。

一致性模式的类型

来源: README.md:473-476

弱一致性

在弱一致性中

  • 写入后,读取可能看到也可能看不到
  • 采取尽力而为的方法,不提供任何保证
  • 用于 Memcached 等系统
  • 适用于实时性比完整性更重要的实时应用
  • 示例:VoIP、视频聊天和实时多人游戏

在实现弱一致性时,系统通常优先考虑速度和可用性而不是数据完整性。例如,在语音通话中,如果连接中断几秒钟,当连接重新建立时,您不会听到连接中断期间说的话。

来源: README.md:477-481

最终一致性

在最终一致性中

  • 写入后,读取最终会看到(通常在几毫秒内)
  • 数据在节点之间异步复制
  • 用于 DNS 和电子邮件等系统
  • 在临时不一致性可接受的高可用系统中运行良好
  • “BASE”(基本可用、软状态、最终一致性)语义的一个子集

最终一致性是弱一致性的一种特殊情况,其中存储系统保证,如果对给定数据项没有新的更新,最终所有对该项的访问都将返回最后更新的值。

这种方法常用于分布式系统,如 Amazon 的 DynamoDB 和 Cassandra,其中系统优先考虑可用性而非即时一致性。

来源: README.md:483-487

强一致性

在强一致性中

  • 写入后,读取会立即看到
  • 数据在节点之间同步复制
  • 用于传统 RDBMS(MySQL、PostgreSQL)等系统
  • 适用于需要具有 ACID 属性的事务的系统
  • 提供线性化保证,意味着操作存在一个总序

强一致性通常涉及分布式锁或共识协议(如 Paxos 或 Raft)以确保所有节点就操作顺序达成一致。这种方法确保了数据完整性,但在网络分区期间可能会降低可用性。

来源: README.md:489-493

一致性模式比较

方面弱一致性最终一致性强一致性
读取保证可能看到也可能看不到最新写入最终会看到最新写入始终看到最新写入
复制尽力而为异步同步
性能最高较低
用例实时应用(VoIP、游戏)DNS、电子邮件、社交媒体金融系统、库存管理
CAP 关注点AP(可用性与分区容错性)AP(可用性与分区容错性)CP(一致性与分区容错性)
示例系统MemcachedDynamoDB、Cassandra传统 RDBMS、HBase(在某些配置下)

来源: README.md:477-493

NoSQL 系统中的一致性

NoSQL 数据库通常实现自己的一致性模型,这与传统 RDBMS 系统不同。许多 NoSQL 系统遵循 BASE 原则

  • 基本可用(Basically Available):系统保证可用性
  • 软状态(Soft state):系统的状态可能会随时间变化,即使没有输入
  • 最终一致性(Eventual consistency):系统最终会变得一致,前提是在此期间没有输入

这种方法与传统关系型数据库中的 ACID 属性(原子性、一致性、隔离性、持久性)形成对比。

来源: README.md:993-999

实际示例和实现考虑

示例:具有一致性的写通缓存

一个保持强一致性的写通缓存

示例:具有最终一致性的分布式系统

实现权衡

在实际系统中实现一致性模型时,请考虑

  1. 读/写比:读多写少的系统可能受益于最终一致性及优化的读性能
  2. 延迟要求:强一致性通常会引入更高的延迟
  3. 容错性:AP 系统在网络分区期间仍能继续运行
  4. 数据关键性:金融或医疗数据可能需要强一致性
  5. 地理分布:全球分布式系统由于全球同步操作的高延迟,通常使用最终一致性

来源: README.md:1088-1178, README.md:1179-1273

结论

CAP 定理为理解分布式系统设计中的基本权衡提供了一个框架。在实践中,系统通常会根据具体要求为不同的组件实现不同的一致性模式

  • 强一致性:当数据准确性至关重要且需要原子操作时使用
  • 最终一致性:当可用性和性能优先于即时一致性时使用
  • 弱一致性:用于实时应用程序,其中可接受一些数据丢失

通过理解这些权衡,系统设计者可以就哪些保证对他们的特定用例最重要做出明智的决定。

来源: README.md:439-496