CAP 中的一致性 —— 数据的强一致性
BASE 中的一致性 —— 数据的最终一致性
Quorum NWR 中当 W+R>N 时,具有客户端读一致性

数据一致性模型:强一致性、最终一致性、线性一致性、因果一致性等

  • 四个经典且常见的一致性模型:线性一致性、顺序一致性、因果一致性和最终一致性。
  • 线性一致性
    • 在分布性锁、Leader 选举、唯一性约束等很多场景都可以看到它的身影。
    • 从读写操作的维度来判断
      • 对于写操作来说,任意两个写操作 x1 和 x2:
        • 1️⃣ 如果写 x1 操作和写 x2 操作有重叠,那么可能 x1 覆盖 x2,也可能 x2 覆盖 x1;
        • 2️⃣ 如果写 x1 操作在写 x2 开始前完成,那么 x2 一定覆盖 x1。
      • 对于读操作来说:
        • 1️⃣ 写操作完成后,所有的客户端都能立即观察到;
        • 2️⃣ 对于多个客户端来说,必须读取到一样的顺序。
    • 所有的读取都可以读到最新写入的值,即一旦新的值被写入或读取,所有后续的读都会看到写入的值,直到它被再次覆盖。在线性一致性模型中不论是数据的覆盖顺序还是读取顺序,都是按时间线从旧值向新值移动,而不会出现旧值反转的情况。
  • 顺序一致性
    • 相对于线性一致性来说,顺序一致性在一致性方面有两点放松
      • 对于写操作,对没有因果关系的非并发写入操作,不要求严格按时间排序。
        • 写 2️⃣ 上,无因果,可互相覆盖;有因果,后覆盖前。
      • 对于读操作,只要求所有的客户端观察到的顺序一致性,不要求写入后,所有的客户端都必须读取新值。
        • 读 1️⃣ 上,如果写操作 x2 覆盖 x1 完成,那么如果一个客户端到 x2 后,它就无法读取到 x1 了,但是这个时候,其他的客户端还可以观察到 x1。
  • 因果一致性
    • 相对于顺序一致性来说,因果一致性在一致性方面有两点放松
      • 对于写操作,对没有因果关系的非并发写入操作,不仅不要求按时间排序,还不再要求节点之间的写入顺序一致了;
      • 对于读操作,由于对非并发写入顺序不再要求一致性,所以自然也无法要求多个客户端必须观察到一样的顺序。
  • 最终一致性
    • 写操作:如果写 x1 操作在写 x2 开始前完成,那么所有节点在最终某时间点后,都会用 x2 覆盖 x1。
    • 读操作:在数据达到最终一致性的过程中,客户端的多次观察可以看到的结果是 x1 和 x2 中的任意值;在数据达到最终一致性的过程后,所有客户端都将只能观察到 x2。

还有一个弱一致性,参考:Transactions Across Datacenters (and other weekend projects)

  • After a write, reads may or may not see it
  • Best effort only
  • “Message in a bottle”
  • App Engine: memcache
  • VoIP, live online video
  • Realtime multiplayer games

参考链接

26|一致性与共识(一):数据一致性都有哪些级别?-深入浅出分布式技术原理-极客时间