一致性哈希算法的优化----关于如何保正在环中增加新节点时,命中率不受影响

 

背景

 

09年初,我们做了一个memcached的智能客户端库,业务只要将这个库链上,就能跟memcached服务器通信。并且实现了一致性哈希的分布式算法,后端memcached服务器可以无限制扩展,而且客户端能对memcached做自动故障转移以及恢复。

我们知道,在没有对数据做冗余存储的情况下,无论是一致性哈希还是求余数分布式算法,在新增或删除memcached节点时,命中率都会不同程度的降低。本文旨在解决当新增memcached节点时,如何保证命中率不变。

 

 

基本原理

 

新增一个memcached节点时,将该新节点的下一个节点的且属于该新节点的数据迁移过来。

 

上面的这个基本原理读起来可能会比较拗口,容我下面详细说明。

 

 

原理描述

 

如图1所示,假设当前哈希环上有nmemcached节点,记为M1~Mn,存储到这些节点上的数据的有效期都是一致的,记为Te。因此从图1可以看出,从M1Mk区间的数据均从Mk上存取。比如数据K1K2Kn

         
                  
    

                                                                            图1

当新增节点Mx时,如图2所示。

                  
                     
                   

                                                                              图2

此时数据K1K2从新节点Mx读取不到的,但节点Mk存储了这些数据,我们需要做的就是将这些数据迁移到新节点Mx

 

具体做法是:将新加入的节点Mx标记为NNew)状态,表示该节点是新增的。在N状态下读取数据K1的步骤为:

1)Mx读取数据,如果读取得到,则返回,否则进行2);

2)Mk读取数据,如果读取不到,则返回,否则进行3);

3)将读取到的数据K1写入Mx

4)K1Mk删除;

 

N状态下,不断进行上面的4个步骤

 

因为数据的有效期是Te,所以在经过Te时间后,Mk上的数据随之自动失效了,此时将Mx标记为OOld)状态,在O状态下,如果读取不到数据也立即返回,无需再次到它下一个节点尝试读取。

猜你喜欢

转载自scottina.iteye.com/blog/650380
今日推荐