Skip to content

CAP 与 BASE

CAP 定理和 BASE 理论是分布式系统的核心理论,指导我们在一致性、可用性、分区容错性之间做出权衡。

CAP 定理

CAP 定理由 Eric Brewer 在 2000 年提出,指出分布式系统无法同时满足以下三个目标,最多只能同时满足两个。

  • 一致性:所有节点在同一时间看到相同的数据。写操作完成后,任何后续的读操作都能读到最新的值。
  • 可用性:每个请求都能得到响应,成功或失败。系统持续提供服务,不会因为部分节点故障而整体不可用。
  • 分区容错性:系统在网络分区(节点间无法通信)时仍能继续运行。网络分区是不可避免的,分布式系统必须容忍网络分区。

Tradeoff

在实际使用时,我们往往弱化其中的一个特性,采取 tradeoff 策略以追求最大获益。

  • CA 系统:放弃分区容错性,适用于单机系统或网络绝对可靠的环境。单机数据库(如单机 MySQL)是 CA 系统。CA 系统无法容忍网络分区,一旦发生网络分区,系统无法继续运行。
  • CP 系统:放弃可用性,当网络分区发生时选择暂停服务以保证数据一致。ZooKeeper、HBase、MongoDB(默认配置)是 CP 系统。CP 系统在网络分区时会拒绝请求,等待分区恢复。
  • AP 系统:放弃强一致性,接受数据可能不一致,但保证服务始终可用。Cassandra、Dynamo、CouchDB 是 AP 系统。AP 系统在网络分区时继续提供服务,但数据可能短暂不一致。

大多数分布式系统选择 AP,因为网络分区不可避免,暂停服务是不可接受的。AP 系统通过最终一致性保证数据最终一致。

真正的 CA 系统在分布式环境中不存在,因为分布式系统必然涉及网络通信,网络分区是不可避免的。单机系统可以称为 CA 系统,但它不是分布式系统。

CAP 并不是说只能在三者中选其二。在实际系统中,C、A、P 都有不同程度的选择。一致性可以从强一致到最终一致,可用性可以从高可用到低可用,分区容错性可以从完全容忍到部分容忍。

CAP 也不是说系统只能切换状态。系统可以在不同场景下做出不同的选择。例如,在正常情况下是 CA,在分区发生时切换到 CP 或 AP。

BASE 理论

BASE 理论是对 CAP 中 AP 系统的补充和指导,由 eBay 的 Dan Pritchett 提出。BASE 是 Basically Available(基本可用)、Soft state(软状态)、Eventual consistency(最终一致性)的缩写。

  • Basically Available(基本可用):系统即使出现局部故障,依然能响应请求。系统可能降级服务,但不会完全不可用。例如,在系统负载过高时,延迟可能增加,部分功能可能不可用。
  • Soft state(软状态):数据状态允许有一段时间的滞后。数据在不同节点间同步需要时间,这段时间内数据可能不一致。
  • Eventual consistency(最终一致性):数据在更新后,可能在几秒钟内不同节点看到的数值不一致,但经过一段时间(通常在秒级),所有节点最终会达到相同状态。

最终一致性的模型

因果一致性:有因果关系的操作,所有节点看到的顺序一致。如果 A 操作在 B 操作之前执行,所有节点都会先看到 A,再看到 B。

读后一致性:客户端读取自己写入的数据,保证能看到最新的写。实现方式:客户端固定访问某个节点,或客户端携带版本信息。

会话一致性:会话内的读后一致性。同一个会话内的读操作保证能看到之前的写操作。

单调读:客户端读取的数据版本不会回退。如果客户端读取了版本 5 的数据,后续读取不会读到版本 4 的数据。

单调写:客户端的写操作按顺序完成。如果客户端执行了写 A 和写 B,所有节点都会先看到 A,再看到 B。

ACID vs BASE

ACID(Atomicity、Consistency、Isolation、Durability)是传统数据库的事务特性,强调强一致性。BASE 是分布式系统的设计理念,强调高可用和最终一致性。

ACID 适合单机事务,BASE 适合分布式系统。在实际系统中,可以根据业务需求选择 ACID 或 BASE。例如,金融交易需要 ACID,社交动态可以接受 BASE。

一致性级别

强一致性:线性一致性,所有操作看起来像原子地执行,所有操作有一个全局顺序。实现代价高,性能差。

弱一致性:系统不保证任何一致性,数据可能永远不一致。

最终一致性:系统保证数据最终一致,但允许短暂不一致。

因果一致性:保证有因果关系的操作顺序一致。

会话一致性:保证会话内的读后一致性。

单调读:保证读操作不会回退。

单调写:保证写操作按顺序执行。

实践中的选择

选择一致性级别需要考虑业务需求。金融、库存需要强一致性。社交网络、内容分发可以接受最终一致性。

选择可用性级别需要考虑用户体验。电商、搜索需要高可用。后台任务可以容忍短暂不可用。

选择分区容错策略需要考虑网络环境。数据中心内部网络可靠,可以选择 CP。跨数据中心网络不可靠,必须选择 AP。

CAP 和 BASE 不是教条,而是指导。在实际系统中,需要根据业务需求、网络环境、性能要求,做出合适的权衡。