CAP Theorem

  • C-onsistency

    每次对系统读取返回的是最新写入的资料,否则返回错误

  • A-valiability

    任何时候对系统发出请求时都能返回结果,不会返回错误,但系统不能保证结果是正确的

  • P-artition Tolerance

    主系统 scale out 多个子系统,当主系统发生故障时,整个系统依旧能返回正确结果

CAP: 分布式系统中最多满足上述三个性质中的两个,所以一共有 $C_3^2 = 3$ 种搭配

  1. Consistency + Availiability
    • 单机系统,只要电脑不发生故障,系统就能持续工作且结果保持一致,但缺少了 Scalability
  2. Consistency + Partition Tolerance
    • 有 Scalability,若系统内有一个元件还未更新到最新结果,由于缺少 Availability 和需保持 Consistency,系统返回错误
    • 应用: Distributed RDBMS 以 Consistency 为最高原则,不允许一个 Client A 在向 Server A 写入结果时,能从 Server B 读取其他数据
  3. Availability + Partition Tolerance
    • 任何时候都能返回正确结果,但是不保证返回结果的即时性
    • 应用: DNSNoSQL,两者皆保证系统能正常运作,但返回的结果不一定是最新的

ACID

Wiki:当我通过银行转帐,数据库第一步从我帐户扣除金额,第二步在对方帐户增加金额,这两步连续动作就是一个Transaction

  • A-tomicity

    一个 Transaction 里的动作要么全部执行成功要么全部失败

  • C-onsistency

    一个 Transaction 将数据库从一个合法状态转移到另一个合法状态,当 Transaction 结束后,资料符合数据库的完整性约束

  • I-solation

    多个 Transactions 并非同时执行,而是并发执行的

  • D-urability

    一个 Transaction 对数据的改动是永久保存的,即使系统失效重启

注意: ACID 与 CAP 表示的 Consistency 意义不同,ACID 表示数据库的数据在修改后是合法的,CAP 表示每个元件的副本数据都是一致的

BASE

  • B-asically A-vailable

    服务基本保持可用, Client的请求一定能返回结果,类似于 CAP 中的 A

  • S-oft State

    即使 Client 没有发送请求,元件中存储的资料也可能会随时间改变

  • E-ventually Consistency

    一定程度上的 Consistency+Availability。如目前元件断线,Client 也可以读取到旧数据,但当一段时间过后,所有元件都会更新成最新的资料,Client 再次读取时就能取得最新的资料

Summary

分布式系统中,Partition 是不可避免的,取舍 Consistency 和 Availability 主要看应用需求。

像 BASE 中的 Eventually Consistency 就做出了 Consistency 和 Availability 的平衡,因此我们不需要绝对地抛弃任何一个性质,而是看应用需求确定平衡的比例是多少。

Citation

  1. 数据库事务 WIki

  2. 分散式系统- 在分散的世界中保持一致系列第 2 篇