构建一致性哈希ring Part1

本文介绍了构建一致性哈希ring的过程,探讨了普通哈希的缺点,如数据分区后的“抖动”问题。通过引入一致性哈希的思想,减少了哈希结果变动的影响,提出了虚节点的概念以实现更好的分布。文章详细阐述了不同阶段的实现,包括二分查找在定位节点中的作用,以及如何通过调整虚节点来减少映射变动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

******************转载请注明出处!**********

最后更新:2011年8月22日22:29:01


写在前面。

原打算只从代码角度做些swift ring的分析工作。但无意中看到了gholt的文章,收益良多,便动了翻译的念头。

“翻译向来是一件费力不讨好的事情。”这是郑烨在某本书序言中的如是说。自己曾零散的翻译过一些,深有同感,因此不打算只是原样翻译。

虽然本系列文章源自gholt,但不尽相同。

原文链接:http://tlohg.com/building-a-consistent-hashing-ring-part-1(这只是part 1,其余part请自行查找)

本系列文章的代码下载:http://code.google.com/p/swift-cn-doc/downloads/list


原文结构索引

part1:介绍普通hash的方法,引入“平衡”的度量标准

part2:线性hash存在的问题:增加一个bucket会导致hash结果剧烈变动;分区域以减少变动影响范围;进一步减少变动;去除冗余代码

part3:代码转型到swift中的类ring形式

part4:增加replica和zone的概念,并添加进类ring原型

part5:代码改进成module, 类ring原型增加weight概念

 

本系列文在gholt的基础上加上了自己的理解,以飨读者。

系列文章结构索引

part1:普通hash及其问题,对应原文part1&part2

part2:swift实际中的情况介绍和部分特性的引入,提出问题。相应问题的解决,并附“ring已废弃方案”。对应原文part3&part4。

part3:对应原文part5。引入weight属性,并封装成module。

part4:对swift中的几个文件(ringdata.py;ringbuilder.py的简单分析)



0 准备工作

为了便于之后python代码的说明,这里需要做一些准备工作。

0.1 /和%的关系

一个除法求商(/),一个除法求余(%),有什么区别?

其实没什么区别。只是映射的关系不一样。如图1.1所示

总结如下:

M%N:把max(M)个区映射到N个区,每个区至少有个元素

M/N:把max(M)个区映射到个区,每个区不会多于N个元素

以上的基本前提是:应保证M个区的样本数量是足够多的。

 

0.2数据分区和hash结果“抖动”的关系

这个小节名称很拗口。但确实找不到相对合适的名字...-_-!

普通hash函数会有剧烈抖动情况。如图1.2所示。

例如:hash函数为:x->x/N,N取2、3,x取值[1,10]

N由2变到3过程中,hash结果80%发生了变化(数字1、3除外)。这种抖动是需要避免的。

 

对数据分区之后,抖动情况依然存在。如图1.3所示。

例如:hash函数为:x->x/N,N取5、6、7,x取值为[1,7][11,17][21,27][31,37]

N由6->7过程中,红色和绿色标识的hash结果是不变的;

N由5->6过程中

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值