一致性哈希算法的优化----关于如何保正在环中增

系统 1970 0

 

背景

 

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

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

 

 

基本原理

 

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

 

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

 

 

原理描述

 

如图 1 所示,假设当前哈希环上有 n memcached 节点,记为 M 1 ~M n ,存储到这些节点上的数据的有效期都是一致的,记为 T e 。因此从图 1 可以看出,从 M 1 M k 区间的数据均从 M k 上存取。比如数据 K 1 K 2 K n

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

                                                                            图1

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

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

                                                                              图2

此时数据 K 1 K 2 从新节点 M x 读取不到的,但节点 M k 存储了这些数据,我们需要做的就是将这些数据迁移到新节点 M x

 

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

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

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

3) 将读取到的数据 K 1 写入 M x

4) K 1 M k 删除;

 

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

 

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

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论