CAP理论中提到一致性(Consistent),可用性(Available),分区容忍性(Partition Tolerance)三者在一个系统中只能同时满足两个,在分布式系统中分区是一定要存在的,系统的设计一般是在一致性和可用性之间做tradeoff。

一致性可以从客户端和服务器端分两种角度来进行描述。从客户端来就是做为观察者如何发现数据的更新,从服务端则是服务器如何来进行整个数据的更新来确保数据一致性。

客户端一致性:

假设系统中有A,B,C三个独立的process/thread做为client,A更新了系统中的某个数据。

  • 强一致性: 在数据更新完成后,任何随后的读都能返回A更新后的数据。
  • 弱一致性: 系统不保证后续的访问会访问到更新后的数据,但如果系统保证在A更新之后再没其他任何对于该数据的更新操作及失败,经过一段时间后,“不一致窗口”,后需的访问都可以访问到A更新后的数据,则是最终一致性,即最终一致性是弱一致性的一种特例。“不一致性窗口”的大小一般依赖于交互延迟、系统负载、复制的replica的个数等因素。

最终一致性又存在如下变体:

因果一致性(Causal consistency): 如果A通知了B它已经更新了数据,那么B的后需操作则读取到A写入的最新值,而与A没有因果关系的C遵守最终一致性语义,并不保证能立即读取到更新。

读自己写一致性(Read-your-writes consistency): 这个名字真难翻译,意思也很好理解,A更新了,A当然总能看到最新的值,这也是因果一致性的特例。

会话一致性(Session consistency): 此是上面那个一致性的实例,访问系统的进程存储在会话中,只要会话存在就能保证read-your-writes一致性,当由于某些失败会话终止后,新建立的会话则不再延续保证。

单调读一致性(Monotonic read consistency): 如果进程已经看到某个数据的值,则后续的读取不会再读到该数据之前的版本。

单调写一致性(Monotonic write consistency): 在此种情况下,系统保证同一个进程的写操作是串行化的。系统如果不保证此一致性就很难编程了。

上述的不同方式在实现中可以进行组合,在最终一致性的实践中,单调读一致性和read-your-write这两种属性经常组合实现。

服务端一致性:

对于服务端而言是如何尽快的将更新分布到系统,以提高用户的体验,有如下三个参数的说明

  • N   数据的备份数
  • W  更新完成时需要确认已经被成功的备份节点个数
  • R   读取数据时需要读取的备份节点个数

当 W + R > N,读和写的备份节点总是有重叠的,可以保证强一致性。当 W + R <= N时数据一致性就无法保证,即弱一致性/最终一致性。

在实际中可根据系统的需要进行W,R,N的配置,R=1,W=N对于读频繁的任务很优化;W=1,R=N对于写操作频繁则比较优化。但当W < (N+1)/2 时,则有可能会导致两个并发的写操作冲突,即他们的写节点不存在重叠。

Amazon Dynamo就设置了R + W > N的quorum-like的备份一致性更新策略,同时也采用了hint handoff的方式实现。即如果一个有N=3个备份的数据分别备份在A,B,C三个节点上,当写到A时,如果A临时的失效,则会把数据写到一个跟此Key无关的节点D上的专用local db,并提示D该数据应该在A上,D会周期的扫描这些数据并试图,当A节点恢复后,D会将该数据发送至A并删除local data.

Hinted Handoff的策略在多个非关系型数据库中都会被采用,包括Cassandra,人人网的Nuclear等。

Cassandra中还提供了多个一致性的Level可供客户端进行选择,包括

  • ZERO: 即一种完全异步的方式实现写,不关心返回
  • ONE:  当有一个节点更新了数据并提交了log,写操作即可返回
  • QUORUM:   N/2 + 1个备份被更新
  • ANY: 在QUORUM上添加了hinted handoff,而其他的一致性模型都要求更新在之前对备份负责的节点上。
  • ALL:  即写操作需要更新成功所有的备份节点。

参考:

Werner Vogels,   Eventually Consistency

Dietrich Featherston,  Cassandra: Principles and Application

    转载请注明来源:Leoncom-《分布式存储与最终一致性》
    Trackback

    only 1 comment untill now

    1. nileader @ 2012-03-13 17:23

      你好。现在在分布式数据一致性上,除了zookeeper是否还有其它实现呢?

    Add your comment now