Dynamo中的向量时钟通过 [ n o d e , c o u n t e r ] [node, counter] [node,counter]来表示,node表示操作节点;counter是其对应的计数器,初始值为 0 0 0节点每进行一次更新操作则计数器加 1 1 1
常用的解决冲突的方案有两种:
通过客户端由用户来解决;
体系自动选择时间戳近来的版本
由于集群内的各个节点并不能严酷保证时钟同步,所以不能完全保证最终版本的准确性。
向量时钟的数目是有限制的,当超过限制时将会根据时间戳删除最早的向量时钟
客户端请求写入一个新对象。节点 S x S_x Sx处置惩罚对 k e y key key的写:序列号递增,并创建数据的向量时钟,在该节点上生成对象D1和向量时钟 [ ( S x , 1 ) ] [(S_x, 1)] [(Sx,1)]。
客户端更新该对象。假设由同样的节点即 S x S_x Sx处置惩罚这个请求,由于该节点有 D 1 D_1 D1和向量时钟 [ ( S x , 1 ) ] [(S_x, 1)] [(Sx,1)],则更新该对象后在该节点上生成对象 D 2 D_2 D2和向量时钟 [ ( S x , 2 ) ] [(S_x, 2)] [(Sx,2)], D 2 D_2 D2继承自 D 1 D_1 D1,即 D 2 D_2 D2覆写 D 1 D_1 D1,计数器增 1 1 1,但其它节点此时可能是 D 1 D_1 D1,也可能是 D 2 D_2 D2(取决于网络和节点状态)
假设同一客户端更新该对象但被不同的服务器处置惩罚。节点 S y S_y Sy处置惩罚这个请求,则更新该对象后在该节点上生成对象 D 3 D_3 D3和向量时钟 [ ( S x , 2 ) , ( S y , 1 ) ] [(S_x, 2), (S_y, 1)] [(Sx,2),(Sy,1)]。
假设另一客户端读取到 D 2 D_2 D2并尝试更新它但被另一个不同的服务器处置惩罚。节点 S z S_z Sz处置惩罚了这个请求,则更新该对象后在该节点上生成对象 D 4 D_4 D4和向量时钟 [ ( S x , 2 ) , ( S z , 1 ) ] [(S_x, 2), (S_z, 1)] [(Sx,2),(Sz,1)]。
节点数据版本回收。如今有4个版本的数据存在并在各个节点之间传递了,当节点收到 D 3 D_3 D3或 D 4 D_4 D4时,会根据向量时钟将#D_1#和#D_2#回收掉,因为其是 D 3 D_3 D3和 D 4 D_4 D4的先人。但是收到 D 3 D_3 D3和 D 4 D_4 D4的节点,根据向量时钟发现它们之间是并行关系,则保留二者,并在客户端get时将二者都提交给客户端由其来协调并合并版本。
假设客户端读取数据,则会获取到 D 3 D_3 D3和 D 4 D_4 D4,根据两者的向量时钟,会合并为 D 5 D_5 D5和向量时钟 [ ( S x , 2 ) , ( S y , 1 ) , ( S z , 1 ) ] [(S_x, 2), (S_y, 1), (S_z, 1)] [(Sx,2),(Sy,1),(Sz,1)],节点 S x S_x Sx协调写操作,并更新对象和向量时钟。