1.一致性hash算法的工作原理
首先我们有一个hash函数H,可以通过数据的key值计算出一个数字型的hash值。然后我们将整个hash环的范围定义为[1,L]这个区间,我们将刚才算出的hash值对L进行取余,就能算出一个key值在这个环上的位置。而每一台真实服务器结点就会负责[1-L]之间的某个区间的数据。如上图,就是一个五个结点的hash环。
上面hash环的L值为1000,然后我们对ABCDE 5个点分别进行hash运算,H(A) mod L = 7, H(B) mod L = 234, H(C)mod L = 447, H(D) mod L = 660, and H(E) mod L = 875 ,这样,hash值在7-233之间的所有数据,我们都让它保存在A节点上。在实际动作中,我们对数据进行hash,算出其应该在哪个节点存储即可,例:H(‘employee30‘) mod L = 899 那么它应该在E节点上,H(‘employee31‘) mod L = 234 那么这个数据应该在B节点上。
2.优化的数据分配策略
虽然hash算法能够产生相对均匀的hash值。而且通常是节点数量越多,hash算法会越平均的分配key值。然而通常在项目初期不会有太多的数据,当然也不需要那么多的机器节点,这时候就会造成数据分配不平均的问题。比如上面的5个节点,其中A节点需要负责的hash区间范围大小为227,而E节点负责的区间范围为132。同时在这种情况下,出故障后数据请求转移到相邻节点的策略也可能不好实施了。为了解决由于节点比较少导致数据分配不均的问题,很多DHT系统都实现了一种叫做虚拟节点的技术。例如4个虚拟节点的系统中,A节点可能被虚拟化成A_1,A_2,A_3,A_4这四个虚拟节点,然后对这四个虚拟节点再进行hash运算,A节点负责的key值区间就比较分散了。Voldemort 使用了与上面类似的策略,它允许对虚拟节点数进行配置,通常这个节点数会大于真实节点数,这样每个真实节点实际上是负责了N个虚拟节点上的数据。
时间: 2024-10-24 15:39:02