《从 0 开始学架构》学习归整(九)CAP 定理

内容纲要

简介

CAP 定理又称 布鲁尔定理。对于设计分布式系统的架构师来说,是一个必须掌握的定理。

定义

在一个分布式系统(指相互连接并共享数据的节点的集合:不是所有分布式系统都互联和共享数据,CAP 理论只讨论互联和共享数据的分布式系统),当涉及读写操作时(CAP 关注数据的读写操作,对分布式系统中的其它功能不一定关注),只能保证一致性(C)可用性(A)分区容忍性(P)中的两个,另一个必须牺牲。

  • C(Consistency:一致性)
    • 节点角度(不够严谨):所有节点在同一时刻都能看到相同的数据(CAP 是忽略延迟的;实际上很难保证数据在同一时刻完全一致,因为网络必然存在延迟)
    • 客户端角度:对指定客户端来说,读操作能保证返回最新的写操作结果
  • A(Availability:可用性)
    • 非故障的节点在合理的时间内返回合理的响应(不是错误和超时响应;合理响应结果不一定是正确响应结果)
  • P(Partition Tolerance:分区容忍性)
    • 当出现网络分区后,能够继续履行职责

组合

  • CA
    • 保证一致性和可用性,牺牲分区容忍性
      • 当出现网络分区时(网络不可能 100% 可靠,分区必然出现),为了保证一致性,系统必须禁止写入,当有写入请求时,系统会返回错误,这将导致可用性不能被满足
        • 分布式系统理论上不能使用保证 CA 的架构
  • CP
    • 保证一致性和分区容忍性,牺牲可用性
  • AP
    • 保证可用性和分区容忍性,牺牲一致性

“牺牲”不代表什么都不做,需要为分区故障恢复后坐准备。

CAP 关注的粒度是数据,而不是整个系统;在实际设计过程中,每个系统不可能只有一种数据,有得数据必须选择 CP,有的数据必须选择 AP,我们做系统设计时,不能从整个系统的角度去选择 CP 或者 AP,不然怎么选都会有问题;我们需要根据不同的应用场景和要求进行分类,分别选择不同的策略。

应用

系统设计时,需要考虑分区情况。

  • 分区未发生
    • 正常运行状态下不存在 CP、AP 的选择,可以同时满足 CA
  • 分区发生
    • 保证 CP 或者 AP
    • 在分区故障解决后进行恢复,让系统恢复到 CA 的状态

架构选择 CP、AP 只是在出现网络分区的情形下需要的保证;当系统处于正常运行中(99.99%、99.999% 可用等),不管是 CP 还是 AP,都需要同时满足 CA。

其它理论

ACID

ACID 是数据库系统为了保证事务的正确性而提出来的一个理论。它包含了 4 个约束:

  • 原子性(Atomicity)
    • 一个事务中,要么全部完成,要么全部不完成
    • 事务在执行过程中发生错误,会回滚到执行前的状态
  • 一致性(Consistency)
    • 在事务开始之前和结束之后,数据库的完整性没有遭到破坏
  • 隔离性(Isolation)
    • 数据库允许多个事务同时对数据进行读写和修改(防止多个事务同时执行时由于交叉执行导致数据不一致)
    • 隔离分为不同级别
      • 未提交(read uncommitted)
      • 读提交(read committed)
      • 可重复读(repeatable read)
      • 串行化(Serializable)
  • 持久性(Durability)
    • 事务处理后,对数据的修改是永久的,即使数据库故障也不会丢失

BASE

BASE 理论是对 CAP 的一种延伸和补充(对 AP 方案的补充), 核心思想是即使无法达到强一致性(CAP 的一致性就是强一致性),但应用可以使用适当的方式来达到最终一致性。

  • 基本可用性(Basically Available)
    • 分布式系统在故障时,允许损失部分可用性,即保证核心可用
  • 软状态(Soft State)
    • 允许系统存在中间状态(CAP 理论中的数据不一致),而该中间状态不会影响系统整体可用性
  • 最终一致性(Eventual Consistency)
    • 系统中的所有数据副本在经过一段时间后,最终能达到一致的状态

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注