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

 

背景

 

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状态下,如果读取不到数据也立即返回,无需再次到它下一个节点尝试读取。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值