一文看懂《一致性哈希算法》

版权声明:guojawee https://blog.csdn.net/weixin_36750623/article/details/84993780

注解:本文绝大部分参考左程云《程序员代码面试指南:IT名企算法与数据结构题目最优解》。

前言

memcached服务器本身不提供分布式cache的移植性,而是由客户端来提供,即假设有60台memcached服务器,要想实现负载均衡,需要自己对数据进行分配。

因此,一个好的负载均衡的分布式算法是多么的重要。

1、分布式算法之取模算法

[1] 实现原理

工程师经常使用多台服务器集群来设计和实现数据缓存,以下是常见的策略:
1、无论添加、查询、删除数据,首先都将数据的ID通过哈希函数转换成一个哈希码,记为key
2、如果目前机器有N台,则计算key%N的值,该值就是该数据所属的机器编号,无论添加、查询、删除数据都在该机器上进行。

[2] 取模算法存在的致命缺陷

当增加或删除机器(N变化)时,代价会非常高,所有的数据都不得不根据ID重新计算一遍哈希值,并将哈希值对新的机器数N进行mod操作,之后还要进行大规模的数据迁移。

2、一致性哈希算法

一致性哈希算法,是一种很好的数据缓存设计方案。

[1] 算法实现原理

(1) 数据成环
假设数据的ID通过哈希函数转换成哈希码的范围是2^32,也就是[0~2^32],现在将这些数字首尾相连,想象成一个闭合的环形,那么一个数据ID在计算出哈希码之后必然对应环中的一个位置,如下图所示:
在这里插入图片描述
(2) 机器入环
假设有机器node1、node2、node3,每个机器也有机器id,使用机器id计算出哈希码,并将其映射到环中的相应位置
在这里插入图片描述
(3) 数据存放在哪台机器上?
因为数据和机器都在环中有相应的映射,因此使用下面策略将数据存放在机器中:按照顺时针旋转的方式,将数据存放到距离最近的机器上,换句话说,沿着顺时针方向,数据hash值向后找到第一个Node Hash值即认为该数据hash值对应的数据存放到该Node上
在这里插入图片描述

[2] 算法优势

接下来,就见识下一致性哈希算法对于增加、删除机器节点时是如何发挥优势的

  1. 删除机器时,只需要把要删除机器的数据全部复制到顺时针找到的下一台机器即可
    在这里插入图片描述
  2. 新增机器时,将node1和node4之间的数据转移到node4机器上
    在这里插入图片描述

综上,可以看到,对于删除和添加机器节点,数据的调整代价是比较小的,无需重新对数据进行mod运算。

[3] 负载不均衡

如果机器较少,很有可能造成机器在整个环上分布不均匀,从而导致机器之间的负载不均衡,如图,所示两台机器,m1可能比m2面临更大的负载。
在这里插入图片描述

[4] 虚拟节点机制

为了解决这种数据倾斜的问题,一致性哈希算法引入了虚拟节点机制。即对每一台机器通过不同的哈希函数计算出多个哈希值,对多个位置都放置一个服务节点,称为虚拟节点
在这里插入图片描述
看图可知,可以为每台机器node计算两个虚拟节点,如node1的虚拟节点M1和M1_,node2的虚拟节点M2和M2_。 由于形成了虚拟节点,并且虚拟节点是由哈希函数计算得到的(哈希函数均匀分布的特性),因此平衡性自然会变好。
此时数据定位算法不变,只是多了一步虚拟节点到实际节点的映射,比如下表

虚拟节点 对应的实际节点
M1 node1
M1_ node1
M2 node2
M2_ node2

当某条数据计算出归属虚拟节点M1_是,再根据上表的跳转,数据将最终归属于实际节点node1。

取模算法、一致性哈希算法对缓存命中率分析

从数学角度分析,当memcached节点由N ==> N-1时,取模算法的缓存命中率变为1/N,一致性哈希算法的缓存命中率变为(N-1)/N,当N比较大的时候,二者的差距是十分巨大的

猜你喜欢

转载自blog.csdn.net/weixin_36750623/article/details/84993780
今日推荐