Consistent Hash 算法

来源:互联网 发布:显示系统隐藏文件 mac 编辑:程序博客网 时间:2024/05/22 14:44
Consistent Hashing 是一种 hash 算法,简单地说,在移除/添加一个服务器时,它能够
尽可能小地改变已存在的 key 映射关系,尽可能地满足单调性的要求。下面就按照 5 个
步骤简单讲讲 Consistent Hashing 算法的基本原理。
步骤一:环形hash 空间。
考虑通常的 hash 算法都是将 value 映射到一个 32 位的 key 值,即0~232-1 的数值
空间。我们可以将这个空间想象成一个首( 0 )尾(232-1)相接的圆环,如图 2.2 所示。
步骤二:把对象映射到hash 空间。
接下来考虑4 个对象object1~object4,通过hash 函数计算出的hash 值key 在环上的分
布如图 2.2 所示。
hash(object1) = key1;

hash(object4) = key4;

   

步骤三:把服务器映射到hash 空间。
Consistent Hashing 的基本思想就是将对象和服务器都映射到同一个 hash 数值空间,
并且使用相同的 hash 算法。
假设当前有 A、B 和C 共3 台服务器,那么其映射结果将如图2.3 所示,它们在 hash 空

间中,以对应的 hash 值排列。
hash(服务器 A) = key A;

hash(服务器 C) = key C;

步骤四:把对象映射到服务器。
现在 cache 和对象都已经通过同一个 hash 算法映射到 hash 数值空间中了,接下来
要考虑的就是如何将对象映射到 cache 上面。
在这个环形空间中,如果沿着顺时针方向从对象的 key 值出发,直到遇见一个服务器,
那么就将该对象存储在这个服务器上,因为对象和服务器的 hash 值是固定的,因此这个服
务器必然是唯一和确定的。这样不就找到了对象和服务器的映射方法了吗?
依然继续上面的例子(见图2.4),那么根据上面的方法,对象 object1 将被存储到服务
器A 上,object2 和 object3 对应到服务器C,object4 对应到服务器B。

步骤五:考察服务器的变动。
前面讲过,通过 hash 算法然后求余的方法带来的最大问题就在于不能满足单调性,当
服务器有所变动时,服务器会失效,进而对后台服务器造成巨大的冲击,现在就来分析
Consistent Hashing 算法。
(1) 移除服务器。
考虑假设服务器B 挂掉了,根据上面讲到的映射方法,这时受影响的将只是那些沿
cache B 逆时针遍历直到下一个服务器(服务器C )之间的对象,也即是本来映射到服务器B
上的那些对象。
因此这里仅需要变动对象object4,将其重新映射到服务器C 上即可,如图2.5 所示。
(2) 添加服务器。
再考虑添加一台新的服务器D 的情况,假设在这个环形 hash 空间中,服务器D 被映
射在对象 object2 和 object3 之间。这时受影响的仅是那些沿 cache D 逆时针遍历直到下
一个服务器(服务器B )之间的对象,将这些对象重新映射到服务器D 上即可。 因此这里仅
需要变动对象 object2,将其重新映射到服务器D 上,如图2.6 所示。




原创粉丝点击