Chinaunix首页 | 论坛 | 博客
  • 博客访问: 631066
  • 博文数量: 149
  • 博客积分: 3901
  • 博客等级: 中校
  • 技术积分: 1558
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-16 14:33
文章分类

全部博文(149)

文章存档

2014年(2)

2013年(10)

2012年(32)

2011年(21)

2010年(84)

分类: 服务器与存储

2010-06-10 11:27:46


参考 : http://blog.chinaunix.net/u3/93118/showart.php?id=2243053
 为了便于理解 :拿  voldemort  做下 dynamo 的试验 , 大家可以先把 voldemort 看成dynamo 的简单实现

 测试环境 参考上面地址 : nwr = 322
 > put "t1" "47"
 > get "t1"
    version(2:1): "47"
 > put "t1" "47_2"
 > get "t1"      
    version(2:2): "47_2"
 
 强断 2 服务器 :
 > put "t1" "t?"
 > get "t1"
    version(0:1, 2:2): "t?"
 从新开启 2 服务器 :
 > put "t1" "t?_2"
 > get "t1"      
    version(0:1, 2:3): "t?_2"
 # 存储此key 优先级别在服务器 2 上 (voldemort )



数据冲突 问题 解决 (Vector clock ):
转: http://cenwenchu.javaeye.com/blog/316675
   Vector clock管理数据多版本

为什么会存在数据多版本,其实这个在高并发分布式处理中经常会遇到,同时也是容错性和高可用性的一种 解决方式。两方面来看,首先在高并发分布式处理过程中,对于单个资源的操作要么采用阻塞方式要么采用多版本方式,前者效率相对较低但是处理简单,后者效率 高但是处理复杂。对于容错性和高可用性要求高的情况下,多版本也是一种解决手段,就好比Amazon的购物车就要求任何时候都要支持修改,如果某一些处理节点当前不可用,那么就需要支持多个节点的处 理以及数据多点的存储,这样就出现了不同节点数据的不同版本问题。

Vector clock根据操作者的不同为一个对象创建了多个版本计数器,并且通过多个版本计数器来判断这些版本是否属于 并行分支还是串行分支,由此来确定是否需要解决冲突。

解决冲突分成两种方式,一种是客户端选择如何解决冲突,一种是服务端解决冲突。前者适用于较为复杂的 冲突解决,后者适用于简单的版本冲突解决。不过不论哪一种方式,在Dynamo的处理中,客户端和服务端之间对于对象的操作交互过程都会带有版本历史信息。

 

 

http://blog.chinaunix.net/photo/93118_100610111856.png

         上图是描述一个对象DVector clock历史状况。首先DSx节点处理,那么处理以后产生了第 一个版本D1([Sx,1]),然后又被Sx处理了,产生了第二个版本D1([Sx,2]),因此需要判断是否需要版本冲突解决。判断版本冲突主要是检查Vector clock中的多个版本与上一个历史Vector clock的关系,如果历史的和当前的Vector clock中所有的节点版本都是大于等于的关系,那么就认为两个版本不冲突,可以忽略前一个版本。就拿D2D1来看,里面只有一个Sx的版本记录,对比2大于1,因此就认为可以忽略前一个版本。D3D4分别是基于D2版本,两个不同节点处理后的结 果,根据上面的冲突检测可以认为D3D4版本无法忽略任何一个版本,因此 此时对于D对象来说存在两个版本D3D4,当Sx从服务端获取到数据以后做处理, 此时就产生了三个版本。至于这三个版本由客户端Sx来解决还是服务端后期自动通过后台完成这个就需要根据应用来决定了。




阅读(1143) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~