对于redis、memcached这些分布式缓存系统,需要将数据均匀的分布到缓存服务器集群的不同机器上,就需要使用对缓存的数据的key做hash值计算, 然后在将hash值除以服务器节点的数量取模计算出数据需要落到那台服务器节点上。这种算法很简单,也可以实现数据的均匀分布, 但是,增加或者减少数据节点的时候会导致所有缓存数据失效。

例如,有三台Redis,对于每次的访问都可以通过计算hash来求得hash值。如公式 h=hash(key)%3,我们把Redis编号设置成0,1,2来保存对应hash计算出来的值,h的值等于Redis对应的编号。

例如10条数据,3个节点,如果按照取模的方式,那就是h=hash(key)%4

node a: 0,3,6,9

node b: 1,4,7

node c: 2,5,8

当增加一个节点的时候,数据分布就变更为

node a:0,4,8

node b:1,5,9

node c: 2,6

node d: 3,7

因而,数据3,4,5,6,7,8,9在增加节点的时候,都需要做搬迁,成本太高。

1、首先,我们把全量的缓存空间当做一个环形存储结构。环形空间总共分成2^32个缓存区,在Redis中则是把缓存key分配到16384个slot中。

2、每个缓存key都可以通过hash算法转化为一个32位的二进制数,也就是对应着环形空间的某一个缓存区。我们把所有的缓存key映射到环形空间的不同位置。

3、每一个Redis集群缓存节点(Shard)也遵循同样的hash算法,一般采用ip做hash,映射到环形空间中。

4、如何让key和节点对应起来呢?很简单,每一个key的顺时针方向最近节点,就是key所归属的存储节点。如图所示。

1.增加节点

当缓存集群的节点有所增加的时候,整个环形空间的映射仍然会保持一致性哈希的顺时针规则,所以有一小部分key的归属会受到影响。

有哪些key会受到影响呢?图中加入了新节点node4,处于node1和node2之间,按照顺时针规则,从node1到node4之间的缓存不再归属于node2,而是归属于新节点node4。因此受影响的key只有key2。

最终把key2的缓存数据从node2迁移到node4,就形成了新的符合一致性哈希规则的缓存结构。

2.删除节点

当缓存集群的节点需要删除的时候(比如节点挂掉),整个环形空间的映射同样会保持一致性哈希的顺时针规则,同样有一小部分key的归属会受到影响。

有哪些key会受到影响呢?图中删除了原节点node3,按照顺时针规则,原本node3所拥有的缓存数据就需要“托付”给node3的顺时针后继节点node1。因此受影响的key只有key4。

最终把key4的缓存数据从node3迁移到node1,就形成了新的符合一致性哈希规则的缓存结构。

例如,我们的的系统有两台Redis,分布的环位置如下图所示:

这会产生一种情况,Redis4的hash范围比Redis3的hash范围大,导致数据大部分都存储在Redis4中,数据存储不平衡。

为了解决这种数据存储不平衡的问题,一致性哈希算法引入了虚拟节点机制,即对每个节点计算多个哈希值,每个计算结果位置都放置在对应节点中,这些节点称为虚拟节点

具体做法可以在服务器IP或主机名的后面增加编号来实现,例如上面的情况,可以为每个服务节点增加三个虚拟节点,于是可以分为 RedisService1#1、 RedisService1#2、 RedisService1#3、 RedisService2#1、 RedisService2#2、 RedisService2#3,具体位置如下图所示:

对于数据定位的hash算法仍然不变,只是增加了虚拟节点到实际节点的映射。例如,数据C保存到虚拟节点Redis1#2,实际上数据保存到Redis1中。这样,就能解决服务节点少时数据不平均的问题。在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布

你学会了吗?给我点个赞吧

漫画:一致性hash算法相关推荐

  1. 一致性 Hash 算法的实际应用

    前言 记得一年前分享过一篇<一致性 Hash 算法分析>,当时只是分析了这个算法的实现原理.解决了什么问题等. 但没有实际实现一个这样的算法,毕竟要加深印象还得自己撸一遍,于是本次就当前的 ...

  2. 不会一致性hash算法,劝你简历别写搞过负载均衡

    这两天看到技术群里,有小伙伴在讨论一致性hash算法的问题,正愁没啥写的题目就来了,那就简单介绍下它的原理.下边我们以分布式缓存中经典场景举例,面试中也是经常提及的一些话题,看看什么是一致性hash算 ...

  3. 什么是一致性 Hash 算法

    数据分片 先让我们看一个例子吧 我们经常会用 Redis 做缓存,把一些数据放在上面,以减少数据的压力. 当数据量少,访问压力不大的时候,通常一台Redis就能搞定,为了高可用,弄个主从也就足够了: ...

  4. hash算法_一致性hash算法简介

    一致性hash算法有什么用?我们为什么需要一致性hash算法?这两个问题的答案可以看这篇文章 分布式系统路由算法简介. 了解了一致性hash算法出现的背景,我们来看看什么是一致性hash算法.一致性h ...

  5. 一致性Hash算法(KetamaHash)的c#实现

    Consistent Hashing最大限度地抑制了hash键的重新分布.另外要取得比较好的负载均衡的效果,往往在服务器数量比较少的时候需要增加虚拟节点来保证服务器能均匀的分布在圆环上.因为使用一般的 ...

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

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

  7. Java算法之 一致性hash算法原理及实现

    为什么80%的码农都做不了架构师?>>>    一致性hash算法原理及实现 转载于:https://my.oschina.net/90888/blog/1645131

  8. php 实现一致性hash 算法 memcache

    散列表的应用 涉及到数据查找比对,首先考虑到使用HashSet.HashSet最大的好处就是实现查找时间复杂度为O(1).使用HashSet需要解决一个重要问题:冲突问题.对比研究了网上一些字符串哈希 ...

  9. 算法:五分钟了解一致性hash算法

    五分钟了解一致性hash算法 前言 一致性哈希算法的设计目标是为了解决因特网中的热点问题,现在也被广泛应用在分布式系统中. 比如针对负载均衡问题,对hash值取模的算法扩展性差,当增加或者减少服务器时 ...

  10. 一致性hash算法简介

    一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希 ...

最新文章

  1. [模板][持续更新]欧拉回路与欧拉路径浅析
  2. Python培训教程:pycharm常用的快捷键合集
  3. 【自考】信息系统开发与管理(二)——章节详读
  4. ​网页图表Highcharts实践教程之图表代码构成
  5. 套接字选项SO_KEEPALIVE
  6. 中国SaaS死或生之四:卧榻之侧,是谁在捅刀 SaaS?
  7. 冯诺依曼架构的 IO 鸿沟,谁能来填补?
  8. word图片撑满,word怎么让图片占满整个页面?
  9. Win 10 Edge不能上网,微软商店打不开的问题
  10. H-Chat: socket.io实现私聊,群聊,添加好友
  11. 太原用计算机单位的工资,太原个税计算器_太原税后月薪|工资计算器_太原个人所得税查询 - Tax518...
  12. [已解决]The server cannot or will not process the request due to something that is perceived to be
  13. win7计算机内存占用高,win7降低电脑内存占用过高的方法
  14. App原型图设计工具使用对比
  15. 【 Kotlin 脚本编程Kotlin Scripting 】Linux Shell 脚本与Kotlin Scripting
  16. CTF-网络信息安全攻防学习平台(注入关)
  17. 声音频率分类(二十一)
  18. 迅捷CAD编辑器能够清晰的将CAD转换为PDF
  19. 手机界面的计算机为何不见在哪里找,Win10电脑的移动便签敬业签界面不见了在哪里找?如何快速打开桌面便签...
  20. Hadoop_MapReduce_Shuffle工作原理

热门文章

  1. f15纸飞机折法_折纸飞机战斗机的折法之F15老鹰折纸战斗机的手工折纸视频
  2. MATLAB代码:储能参与调峰调频联合优化模型
  3. WinXP下网上邻居不能访问的解决方法大全
  4. 17个学术论文搜索引擎
  5. js、jq实现答题上一题下一题
  6. 油气开采上百年,技术依旧原始,硬伤在这儿
  7. 《剑与电——角色扮演游戏设计艺术》读书笔记(二)
  8. 惠普电脑收购货源Autonomy此起彼伏前质疑声
  9. C语言见缝插针游戏,见缝插针游戏,见缝插针游戏图片
  10. 判断两个向量是否平行