一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。 在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题。

一、普通hash算法?
以分布式缓存为例,假设现在有3台缓存服务器(S0,S1,S2),要将一些图片尽可能平均地分配到不同的服务器上,hash算法的做法是:

(1) 以图片的名称作为key,然后对其做hash运算。

(2) 将hash值对服务器数量进行求余,得到服务器编号,最后存入即可。

举个例子:

csdn.jpg 需要存入, 我们就得到hash(csdn.jpg) = 5 -------> 5%3 = 2 得到数据存入S2

普通 hash 算法的缺陷
上述HASH算法时,会出现一些缺陷:如果服务器已经不能满足缓存需求,就需要增加服务器数量,假设我们增加了一台缓存服务器,此时如果仍然使用上述方法对同一张图片进行缓存,那么这张图片所在的服务器编号必定与原来3台服务器时所在的服务器编号不同,因为除数由3变为了4,最终导致所有缓存的位置都要发生改变,也就是说,当服务器数量发生改变时,所有缓存在一定时间内是失效的,当应用无法从缓存中获取数据时,则会向后端服务器请求数据;同理,假设突然有一台缓存服务器出现了故障,那么我们则需要将故障机器移除,那么缓存服务器数量从3台变为2台,同样会导致大量缓存在同一时间失效,造成了缓存的雪崩,后端服务器将会承受巨大的压力,整个系统很有可能被压垮。为了解决这种情况,就有了一致性哈希算法。

什么是一致性 hash 算法?
一致性哈希算法也是使用取模的方法,但是取模算法不是对服务器的数量进行取模,而是对 2^32 取模,具体步骤如下:

步骤一:一致性哈希算法将整个哈希值空间按照顺时针方向组织成一个虚拟的圆环,称为 Hash 环;
步骤二:接着将各个服务器使用 Hash 函数进行哈希,具体可以选择服务器的IP或主机名作为关键字进行哈希,从而确定每台机器在哈希环上的位置
步骤三:最后使用算法定位数据访问到相应服务器:将数据key使用相同的函数Hash计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针寻找,第一台遇到的服务器就是其应该定位到的服务器

下面我们使用具体案例说明一下一致性哈希算法的具体流程:

(1)步骤一:哈希环的组织:

我们将 2^32 想象成一个圆,像钟表一样,钟表的圆可以理解成由60个点组成的圆,而此处我们把这个圆想象成由2^32个点组成的圆。
圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、5、6……直到232-1,也就是说0点左侧的第一个点代表232-1,我们把这个由 2^32 个点组成的圆环称为hash环。
(2)步骤二:确定服务器在哈希环的位置:

哈希算法:hash(服务器的IP) % 2^32

    上述公式的计算结果一定是 0 到 2^32-1 之间的整数,那么上图中的 hash 环上必定有一个点与这个整数对应,所以我们可以使用这个整数代表服务器,也就是服务器就可以映射到这个环上

(3)步骤三:将数据映射到哈希环上:

    我们还是使用图片的名称作为 key,所以我们使用下面算法将图片映射在哈希环上:hash(图片名称) % 2^32

一致性 hash 算法的优点:
前面提到,如果简单对服务器数量进行取模,那么当服务器数量发生变化时,会产生缓存的雪崩,从而很有可能导致系统崩溃,而使用一致性哈希算法就可以很好的解决这个问题,因为一致性Hash算法对于节点的增减都只需重定位环空间中的一小部分数据,只有部分缓存会失效,不至于将所有压力都在同一时间集中到后端服务器上,具有较好的容错性和可扩展性。

hash 环的倾斜与虚拟节点:
一致性哈希算法在服务节点太少的情况下,容易因为节点分部不均匀而造成数据倾斜问题,也就是被缓存的对象大部分集中缓存在某一台服务器上,从而出现数据分布不均匀的情况,这种情况就称为 hash 环的倾斜。

hash 环的倾斜在极端情况下,仍然有可能引起系统的崩溃,为了解决这种数据倾斜问题,一致性哈希算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点,一个实际物理节点可以对应多个虚拟节点,虚拟节点越多,hash环上的节点就越多,缓存被均匀分布的概率就越大,hash环倾斜所带来的影响就越小,同时数据定位算法不变,只是多了一步虚拟节点到实际节点的映射。

一致性哈希算法是当前较主流的分布式哈希表协议之一,它对简单哈希算法进行了修正,解决了热点(hotPot)问题

一致性哈希算法作为分布式存储领域的一个重要算法,它基本解决了以P2P为代表的存储环境中一个关键的问题——如何在动态的网络拓扑中对数据进行分发和选择路由。在算法所构成的存储拓扑中,每个存储节点仅需维护少量相邻节点的信息,并且在节点加入/退出系统时,仅有相关的少量节点参与到拓扑的维护中,这使得一致性哈希算法成为一个具有实用意义的DHT(DistributedHashTable,分布式哈希表)算法。但是一致性哈希算法尚有不足之处。第一,在查询过程中,查询消息要经过O(n)步(n代表系统内的节点总数)才能到达被查询的节点。不难想象,当系统规模非常大时,节点数量可能超过百万,这样的查询效率显然难以满足使用的需要。第二,当应用一致性哈希算法的分布式存储系统中添加或者删除新的物理节点时,要将下一个节点与之相关的数据迁移过来,查询命中率和存储效率下降,影响系统的整体性能 。

什么是一致性哈希算法?一致性哈希算法原理刨析相关推荐

  1. “分布式哈希”和“一致性哈希”的概念与算法实现

    分布式哈希和一致性哈希是分布式存储和p2p网络中说的比较多的两个概念了.介绍的论文很多,这里做一个入门性质的介绍. 分布式哈希(DHT) 两个key point:每个节点只维护一部分路由:每个节点只存 ...

  2. 一文读懂哈希和一致性哈希算法

    哈希 Hash 算法介绍 哈希算法也叫散列算法, 不过英文单词都是 Hash, 简单一句话概括, 就是可以把任意长度的输入信息通过算法变换成固定长度的输出信息, 输出信息也就是哈希值, 通常哈希值的格 ...

  3. 哈希和一致性哈希算法

    哈希 Hash 算法介绍 哈希算法也叫散列算法, 不过英文单词都是 Hash, 简单一句话概括, 就是可以把任意长度的输入信息通过算法变换成固定长度的输出信息, 输出信息也就是哈希值, 通常哈希值的格 ...

  4. 【hash】哈希算法、哈希碰撞、一致性哈希

    一.hash算法 Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长 ...

  5. 一致性hash算法虚拟节点_Hash算法和一致性Hash算法

    Hash算法 Hash 算法在路由算法应用中,为了保证数据均匀的分布,例如有 3 个桶,分别是 0 号桶, 1 号桶和 2 号桶:现在有 12 个球,怎么样才能让 12 个球平均分布到 3 个桶中呢? ...

  6. 单个节点的缓存容量达到上限 Hash算法一致性

    场景 单个节点的缓存容量达到上限,无法继续单点增加内存,如何解决? 单个节点支撑的QPS达到上限,如何解决? 初步方案 增加N个缓存节点,为了保证缓存数据的均匀,一般情况会采用对key值hash,然后 ...

  7. 数据分布方式:哈希与一致性哈希

    数据分布方式:哈希与一致性哈希 前言 数据分布设计原则 数据均匀: 数据稳定: 节点异构性: 隔离故障域: 性能稳定性: 数据分布方法 哈希 一致性哈希 带有限负载的一致性哈希 带虚拟节点的一致性哈希 ...

  8. 一致性hash算法_分布式寻址算法

    一.分布式寻址算法简介 分布式寻址算法是很重要的内容,不了解这些算法,也就不能透彻的了解各种分布式中间件的原理.简单说一下这些高大上的寻址到底是个啥意思,比如在elasticsearch中,采用的是多 ...

  9. 分布式一致性算法——Paxos 和 Raft 算法

    写在前面 本文隶属于专栏<100个问题搞定大数据理论体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见100个问题搞定大数据理 ...

最新文章

  1. TLS回调函数(2)
  2. 利用IDA6.6进行apk dex代码动态调试
  3. 理解spark中的job、stage、task
  4. php另一个php的变量,php - PHP:如何更改依赖于另一个变量的变量? (新手资料) - SO中文参考 - www.soinside.com...
  5. POJ1226 Substrings(二分+后缀数组)
  6. Antd Vue 组件库之Table表单
  7. iPhone 13临近发布,富士康需要在9月底前再招聘20万名工人
  8. 开始启用51CTO的博客
  9. shell 查看空行与删除空行
  10. jQuery 滚动条插件nicescroll 使用方法、常见配置和事件回调使用说明
  11. 笔记本电脑连接WIFI速度很慢-解决办法 亲测有效【5MB/S直达10MB/S】
  12. 甲骨文裁员,华大人员瘦身优化,亚马逊鼓励离职?
  13. python新疆自驾旅游推荐系统毕业设计源码111042
  14. Docker 导出/导入镜像
  15. Linux 下 TC 命令原理及详解
  16. 为你推荐10款开发常用的代码编辑器
  17. C语言鼠标操作方法及源码
  18. 平安金融云为互联网金融行业注入发展新动能
  19. 人脸识别5.1.2- insightface人脸检测模型RetinaFace-Paddle
  20. 前端配色网站(转载)

热门文章

  1. java实现微信支付宝等多个支付平台合一的二维码支付(maven+spring springmvc mybatis框架)
  2. MySql中游标的定义与使用方式
  3. 麦咭早教机器人_麦咭机器人什么价位(麦咭智能早教机器人测评)
  4. C#将百分制转换为五分制(if_else if 语句实现)
  5. 用计算机画小鸡,flash动画设计教程:5.17——如何演示绘制小鸡的动画效果.doc...
  6. VMware Workstation 12 Pro安装过程(详细安装)
  7. Proxy error: Could not proxy request /***/***/*** from localhost:8080 to http://000.000.000/. 的解决办法
  8. IIS下配置php运行环境。
  9. MySql数据库的下载安装及使用教程
  10. 英语在线单词、语法检查工具