问题 | 采取的相关技术 |
---|---|
数据均衡 | 分布改进的一致性哈希算法 |
数据备份 | 参数可调的弱quorum机制 |
数据冲突 | 处理向量时钟 (Vector Clock) |
成员资格及错误检测 | 基于Gossip协议的成员资格和错误检测 |
临时故障处理 | Hintedhandoff(数据回传机制) |
永久故障处理 | Merkle哈希树 |
Dynamo采用分布式的数据存储架构,均衡的数据分布可以保证负载平衡和系统良好的扩展性。 所以,如何在各个节点上数据的均衡性是影响Dynamo性能的关键问题。
Dynamo中使用改进后的一致性哈希算法,并在此基础上进行数据备份,以提高系统的可用性。
- 一致性哈希算法在设备节点数量较少的情况下,有可能造成环上节点分布的不均匀;并且没有考虑哈希环上不同设备节点的性能差异。
常用的解决冲突的方案有两种:
客户端请求写入一个新对象。节点 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是preference list里的最后一个节点。
- 节点失效超过设定时间仍不能重用,认定为永久性故障。此时,Dynamo需要从其他数据副本进行数据同步