分布式系统中的各种一致性

线性一致性

  • Linearizability states that: Each operation should appear to take effect instantaneously at some moment between its start and completion.

  • 常用的最强一致性模型之一

  • 也称为原子一致性、强一致性、立即一致性或外部一致性

  • 基本的想法是让一个系统看起来好像只有一个数据副本,而且所有的操作都是原子性的(线性一致寄存器的行为就好像只有单个数据副本一样,且每个操作似乎都是在某个时间点以原子性的方式生效的)

  • 一旦新的值被写入或读取, 所有后续的读都会看到写入的值, 直到它被再次覆盖。尤其要注意,如果B的读取严格发生于A的读取之后(他们读取的值正在被C写入), 那么只要A已经读取到C写入的新值,B就必须返回C写入的新值,即使C的写入仍在进行中

  • 实现方法
    • 读取在单主复制的主库。风险在于:“一个节点很可能会认为它是领导者, 而事实上并非如此——如果具有错觉的领导者继续为请求提供服务, 可能违反线性一致性”
    • 使用共识算法
  • 线性一致的系统惊人的少。例如,现代多核CPU上的内存甚至都不是线性一致的: 如果一个CPU核上运行的线程写入某个内存地址,而另一个CPU核上运行的线程不久之后读取相同的地址,并没有保证一定能一定读到第一个线程写入的值(除非使用了内存屏障(memorybarrier)或围栏(fence)(可以参考这篇文章

  • 在线性一致的数据存储中是不存在并发操作的:必须有且仅有一条时间线,所有的操作都在这条时间线上,构成一个全序关系。可能有几个请求在等待处理,但是数据存储确保了每个请求都是在唯一时间线上的某个时间点自动处理的,不存在任何并发。对比之下,因果关系只是偏序关系。如果两个操作都没有在彼此之前发生,那么这两个操作是并发的,如果两个事件是因果相关的(一个发生在另一个事件之前),则它们之间是有序的,但如果它们是并发的,则它们之间的顺序是无法比较的。这意味着因果关系定义了一个偏序, 而不是一个全序: 一些操作相互之间是有顺序的, 但有些则是无法比较的

read-after-write consistency(读写一致性)

  • 这是一个保证,比如,如果用户重新加载页面,他们总会看到他们自己提交的任何更新。它不会对其他用户的写入做出承诺: 其他用户的更新可能稍等才会看到
  • 通过读主库、时间限制的读从库、保证时间下界的读从库来实现
  • 如果要跨设备,那么需要有元数据中心来存时间戳

单调读

  • 避免时光倒流现象
  • 可以通过确保用户总是从同一个副本读取来实现(比如每个用户通过hash其id将其分配到某个机器/集群)

一致前缀读

  • 如果一些系列写入按照某个顺序发生,那么任何人读取这些写入时,也会看见它们以同样的顺序出现
  • 解决方法是,确保任何因果相关的写入都写入到相同的分区(例如数据库的某个分片),这需要高效的追踪因果依赖关系的算法

顺序一致性

  • 参考:Distributed Systems, 3rd Edition(Maarten van Steen / Andrew S. Tanenbaum)
  • Sequential consistency is an important data-centric consistency model, which was first defined by Lamport [1979] in the context of shared memory for multiprocessor systems.

  • A data store is said to be sequentially consistent when it satisfies the following condition: The result of any execution is the same as if the (read and write) operations by all processes on the data store were executed in some sequential order and the operations of each individual process appear in this sequence in the order specified by its program.

  • 任何读写操作的有效交叉都是可接受的,但是所有进程都要看到相同的操作交叉,在这里,时间不起作用,即没有所谓“最近一次”
  • 进程可以看到所有进程的写操作,但是只能看到自己的读操作

因果一致性

  • 参考:Distributed Systems, 3rd Edition(Maarten van Steen / Andrew S. Tanenbaum)
  • 一种弱化的顺序一致性模型,因为它将具有潜在因果关系的事件和没有因果关系的事件区分开来

  • If event b is caused or influenced by an earlier event a, causality requires that everyone else first see a, then see b.

  • 所有进程必须以相同的顺序看到具有潜在因果关系的写操作,不同机器上可以以不同的顺序看到并发的写操作(即没有因果关系的写操作)

最终一致性

  • 这种一致性几乎不提供任何承诺
  • 不能保证因果顺序