Vector Clock

  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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值