******************转载请注明出处!**********
最后更新: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过程中