0%

一致性模型

一致性(Consistency)是指多副本(Replications)问题中的数据一致性。


前言

学习 HBase 的 MVCC 时有提到一致性的概念。抱着知识全面性的想法来学习。

一致性模型

强一致性

当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值。
这种是对用户最友好的,就是用户上一次写什么,下一次就保证能读到什么。但是这种实现对性能影响较大。

弱一致性

系统并不保证续进程或者线程的访问都会返回最新的更新过的值。系统在数据写入成功之后,不承诺立即可以读到最新写入的值,也不会具体的承诺多久之后可以读到。但会尽可能保证在某个时间级别(比如秒级别)之后,可以让数据达到一致性状态。

最终一致性

弱一致性的特定形式。不保证在任意时刻任意节点上的同一份数据都是相同的,但是随着时间的迁移,不同节点上的同一份数据总是在向趋同的方向变化。
系统保证在没有后续更新的前提下,系统最终返回上一次更新操作的值。

简单说,就是在一段时间后,节点间的数据会最终达到一致状态。

在没有故障发生的前提下,不一致窗口的时间主要受通信延迟,系统负载和复制副本的个数影响。

最终一致性根据更新数据后各进程访问到数据的时间和方式的不同,又可以区分为:

  • 因果一致性:如果进程A通知进程B它已更新了一个数据项,那么进程B的后续访问将返回更新后的值,且一次写入将保证取代前一次写入。与进程A无因果关系的进程C的访问,遵守一般的最终一致性规则。
  • 读己所写一致性:因果一致性的特定形式。当进程A自己更新一个数据项之后,它总是访问到更新过的值,绝不会看到旧值。
  • 会话一致性:读己所写一致性的特定形式。它把访问存储系统的进程放到会话的上下文中。只要会话还存在,系统就保证“读己之所写”一致性。如果由于某些失败情形令会话终止,就要建立新的会话,而且系统的保证不会延续到新的会话。
  • 单调读一致性:如果进程已经看到过数据对象的某个值,那么任何后续访问都不会返回在那个值之前的值。
  • 单调写一致性:系统保证来自同一个进程的写操作顺序执行。即同一个进程的写操作串行化。

上述最终一致性的不同方式可以进行组合,例如单调读一致性和读己之所写一致性就可以组合实现。
并且从实践的角度来看,这两者的组合,读取自己更新的数据,和一旦读取到最新的版本不会再读取旧版本,
对于此架构上的程序开发来说,会少很多额外的烦恼。


参考链接