浅谈一致性哈希算法 consistent hashing

        接触过分布式的小伙伴一定对一致性哈希算法这个词语不陌生,那么到底什么是一致性哈希算法呢?

        了解一致性哈希算法之前我们先了解下哈希取模

        假设我们有三台服务器,缓存3万张图片。当然我们可以均匀的分配到每个服务器,即每个服务器1万张图片。但是如果这样操作,当我们访问缓存项时我们就要遍历三台服务器,这样也就失去了缓存的意义。那么我们该怎么解决这个问题呢?我们假设每张图片的名称不一致,将图片的名称当作这个图片的key,对缓存项的key进行哈希,将hash后的结果对缓存服务器的数量进行取模操作,通过取模后的结果,决定缓存项将会缓存在哪一台服务器上,由于我们只有3台服务器,所以我们对3取模余数分别是0,1,2,正好代表了我们的服务器的编号。如下图:

         

         但是通过上述方法存在一定的缺陷,假如有一台服务器宕机或者我们加入一台新的服务器后,取模的余数将发生变化,原来为3现在变成了2或者4,此时,如果仍然使用上述方法对同一张图片进行缓存,那么这张图片所在的服务器编号必定与原来3台服务器时所在的服务器编号不同,因为除数由3变为了4,被除数不变的情况下,余数肯定不同,这种情况带来的结果就是当服务器数量变动时,所有缓存的位置都要发生改变,换句话说,当服务器数量发生改变时,所有缓存在一定时间内是失效的。为了解决上述方法,一致性哈希算法诞生了。

        一致性哈希算法也是使用取模的方法,但是上述描述的取模法是对服务器的数量进行取模,而一致性哈希算法是对2^32取模。然后我们把2^32次方分别均匀分布在一个圆环上,12点位置为0,顺时针排布,0的右侧为1,0的左侧为2^32-1,

        

         我们对服务器的IP进行取模,那么结果就是0到2^32-1之间,所以我们对A,B,D服务器进行取模后,三台服务器将位于圆环上的对应位置。例如:

        

         然后对需要缓存的图片进行hash(图片名称)% 2^32,假设图片1,2,3,4

         然后沿顺时针方向遇到的第一个服务器,就是当前对象将要缓存于的服务器

        如果图片将被保存到B服务器,图片2将被保存到 D服务器,图片3和图片4将被缓存到A服务器。

        如上图假设我们的服务器B宕机,图片1将顺延到服务器D上,此时服务器B宕机对其他服务器并没有影响。

        但是我们假设如下情况:

        

        服务器ABD在hash环上分布比较集中,就会出现大量缓存数据分布在A上而B和D分布较少的情况产生。

        为了解决上述问题一致性哈希算法将创建多个虚拟节点分布在hash环上。

        

        这样数据就会相对均匀的分布到各个服务器上。 当然虚拟节点越多,分配也就越均匀。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值