分类: 服务器与存储
2010-06-10 11:27:46
为什么会存在数据多版本,其实这个在高并发分布式处理中经常会遇到,同时也是容错性和高可用性的一种 解决方式。两方面来看,首先在高并发分布式处理过程中,对于单个资源的操作要么采用阻塞方式要么采用多版本方式,前者效率相对较低但是处理简单,后者效率 高但是处理复杂。对于容错性和高可用性要求高的情况下,多版本也是一种解决手段,就好比Amazon的购物车就要求任何时候都要支持修改,如果某一些处理节点当前不可用,那么就需要支持多个节点的处 理以及数据多点的存储,这样就出现了不同节点数据的不同版本问题。
Vector clock根据操作者的不同为一个对象创建了多个版本计数器,并且通过多个版本计数器来判断这些版本是否属于 并行分支还是串行分支,由此来确定是否需要解决冲突。
解决冲突分成两种方式,一种是客户端选择如何解决冲突,一种是服务端解决冲突。前者适用于较为复杂的 冲突解决,后者适用于简单的版本冲突解决。不过不论哪一种方式,在Dynamo的处理中,客户端和服务端之间对于对象的操作交互过程都会带有版本历史信息。
上图是描述一个对象D的Vector clock历史状况。首先D被Sx节点处理,那么处理以后产生了第 一个版本D1([Sx,1]),然后又被Sx处理了,产生了第二个版本D1([Sx,2]),因此需要判断是否需要版本冲突解决。判断版本冲突主要是检查Vector clock中的多个版本与上一个历史Vector clock的关系,如果历史的和当前的Vector clock中所有的节点版本都是大于等于的关系,那么就认为两个版本不冲突,可以忽略前一个版本。就拿D2和D1来看,里面只有一个Sx的版本记录,对比2大于1,因此就认为可以忽略前一个版本。D3和D4分别是基于D2版本,两个不同节点处理后的结 果,根据上面的冲突检测可以认为D3和D4版本无法忽略任何一个版本,因此 此时对于D对象来说存在两个版本D3和D4,当Sx从服务端获取到数据以后做处理, 此时就产生了三个版本。至于这三个版本由客户端Sx来解决还是服务端后期自动通过后台完成这个就需要根据应用来决定了。