一致性哈希算法的优化----关于如何保正在环中增加新节点时,命中率不受影响
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
背景
09年初,我们做了一个memcached的智能客户端库,业务只要将这个库链上,就能跟memcached服务器通信。并且实现了一致性哈希的分布式算法,后端memcached 服务器可以无限制扩展,而且客户端能对memcached做自动故障转移以及恢复。
我们知道,在没有对数据做冗余存储的情况下,无论是一致性哈希还是求余数分布式算法,在新增或删除memcached节点时,命中率都会不同程度的降低。本文旨在解决当新增memcached节点时,如何保证命中率不变。
基本原理
当新增一个memcached节点时,将该新节点的下一个节点的且属于该新节点的数据迁移过来。
上面的这个基本原理读起来可能会比较拗口,容我下面详细说明。
原理描述
如图1所示,假设当前哈希环上有n个memcached节点,记为M1~M n,存储到这些节点上的数据的有效期都是一致的,记为T e。因此从图1可以看出,从M1到M k区间的数据均从M k上存取。比如数据K1,K2,K n。
图1当新增节点M x时,如图2所示。
图2
此时数据K1,K2从新节点M x读取不到的,但节点M k存储了这些数据,我们需要做的就是将这些数据迁移到新节点M x。
具体做法是:将新加入的节点M x标记为N(New)状态,表示该节点是新增的。在N 状态下读取数据K1的步骤为:
1)从M x读取数据,如果读取得到,则返回,否则进行2);
2)从M k读取数据,如果读取不到,则返回,否则进行3);
3)将读取到的数据K1写入M x;
4)将K1从M k删除;
在N状态下,不断进行上面的4个步骤
因为数据的有效期是T e,所以在经过T e时间后,M k上的数据随之自动失效了,此时将M x标记为O(Old)状态,在O状态下,如果读取不到数据也立即返回,无需再次到它下一个节点尝试读取。