Vector Clock

来源:互联网 发布:网络视频课程快进方法 编辑:程序博客网 时间:2024/06/07 12:30

  Vector clock是Dynamo用来解决数据一致性问题的一个算法,前提是遵循NRW理论,通过保证W+R>N保证强一致性,具体实现如下。

  在写文件时,Vector Clock算法记录所有的更新版本,当读操作发生的时候返回多个版本,由客户端的业务成来解决这个版本冲突并合并各个版本。

 

[上图来自于:http://upload.wikimedia.org/wikipedia/commons/5/55/Vector_Clock.svg]

上图的场景是N=3,W=2,R=2。

途中的具体实现如下:

1、数据在t1时,数据在C变更,记录版本信息[C:1],然后t2时刻传播到B中[B:1,C:1]

2、t3时,数据在B中被变更,关于B的版本信息被覆盖更新[B:2,C:1],t3时传播到A中[A:1,B:2,C:1]

3、t6时,B中数据更新[B:3,C:1],并于t8时传播到C中,并于C中的版本信息合并,留下最新的版本信息[B:3,C:2]

4、t5时,A中数据被更新为[A:2,B:2,C:1],并在t7时传播到B,与B中版本信息合并为[A:2,B:4,C:1]

5、在t9时,C中数据更新为[B:3,C:3],并在t12时传播到A,与A中版本信息合并为[A:3,B:3,C:3]

6、t10时,B中数据更新为[A:2,B:5,C:1],并在t11时传播到C中,与C中版本信息合并为[A:2,B:5,C:4]

7、t13时,C中数据更新为[A:2,B:5,C:5],并在t14时传播到A中,与A中版本信息合并为[A:2,B:5,C:5],

8、此时,A与C中的信息为最新的信息,通过R=2,能保证都能读取到最新版本的数据,并在客户端中得到并合并。

 

PS:需要特别注意的是

1、在一次写操作发生前,一定是会先存在一次读操作

2、数据更新的操作,只能顺序执行

3、冲突的解决方式一,可以看t5和t6时刻,读取到同一个值并修改。假设t5-t7先执行,执行成功,此时t6-t8需要执行更新,通过对比检查,客户端将发现B的值已经被更新,客户端需要根据这个检查出来的冲突,作出相对应的解决方案,例如重新读取B中的值并重新计算。

4、冲突的解决方式二,假设t5及t6时刻的更新都不进行检查,在t7及t8之后,一个读取操作读取B和C节点,获得[A:2,B:4,C:1]及[B:3,C:2]的版本信息,发现版本冲突,此时就需要客户端解决版本冲突,例如可以通过时间戳或其他方式解决。

 

参考引用:

http://horicky.blogspot.com/2009/11/nosql-patterns.html

http://en.wikipedia.org/wiki/Vector_clock

http://blog.ddup.us/?p=207

http://www.kongch.com/2011/08/vector-clock-understanding/

http://basho.com/blog/technical/2010/01/29/why-vector-clocks-are-easy/

http://basho.com/blog/technical/2010/04/05/why-vector-clocks-are-hard/

 

 

0 0
原创粉丝点击