用韩信三技能,讲清楚一致性哈希
作者 | 悟空聊架构
来源 | 悟空聊架构
头图 | 下载于视觉中国
韩信点兵的成语来源淮安民间传说。常与多多益善搭配,寓意越多越好。我们来看下主公刘邦和韩信大将军的对话。
刘邦:“你觉得我可以带兵多少?”
韩信:“最多十万。”
刘邦不解的问:“那你呢?”
韩信自豪地说:“越多越好,多多益善嘛!
假如刘邦现在给了韩信一千个士兵,需要大致均匀分成三组。士兵的编号是六位数,从 1-100000 随机分配。比如第一个士兵的值是 245,第二个士兵的编号是 82593,其他士兵类似。那么如何对士兵进行分配呢?
刘邦:韩将军,你看这些士兵怎么分配好呢?
韩信:这还不简单,我的一技能就能搞定。
一技能:哈希算法
分组
韩信的一技能哈希算法
:将士兵的编号 num 值当做一个哈希值,再和总做小组数 N 做取余操作,得出的结果在 0 到 N - 1 之间,这个士兵就属于那个组。
如下图所示,每来一个士兵都有一个六位的 hash 值(也可以称作编号),然后被韩信用除以 3 取余数的方式分配到三个组。比如第一组中的编号为 123456 的士兵,除以 3 之后,整除,余数为 0,所以分配到第一组。
查找士兵
现在已经分好组了,假如想找到编号为 666666 的士兵该怎么找?首先将 666666 除以 3,得到余数 0,说明在第一个组,然后去第一个组里面找就可以了。
这里有小伙伴可能会问,为什么不是把所有士兵放到一个组?
因为一个组太大了,影响行军速度。映射到互联网架构中,就是通过增加节点从而减小单节点的负载压力。
哈希分组弊端
刘邦看了这个一技能后,大呼:
韩将军真是厉害。
哈希算法看起来很完美,那我再给你五百士兵,需要分成四个组怎么办?
这时,韩信的副将说话了:
这还不简单,再用 4 取余不就好了吗?
刘邦摸着下巴思索片刻后,对副将说:
这个方案可行,但很多士兵都被重新分组了,刚刚建立的团队友情就被分解了。
我们来看下刘邦为什么觉得方案不可行。
比如原来分配到一组的编号为 3 的士兵,当分成四组的时候,通过公式计算:3%4=3,所以会分配到到第四组。
依次类推,会发现很多士兵进行了重新分配,只有小部分不会变换分组,比如 1,2,12 不会被重新分组。
韩信对着刘邦点点头,对着主公说道:
主公,您说得没错,这就是我的一技能的
弱点
所在。不过我还有一个技能:
一致性哈希
。
二技能:一致性哈希
哈希环
一致性哈希算法也用了取模运算,但是它与哈希算法不同的地方:
哈希算法:对节点的数量进行取模运算。
一致性哈希算法:对 2^32 进行取模运算。
可以想象一下,一致性哈希算法,是将整个哈希值空间组成了一个虚拟的圆环,也就是哈希环
。
如下图,把 3 个组映射到固定大小为 2^32
的哈希环中。三个组一共将整个环分成了三个区域,C-A(第一组)、A-B(第二组)、B-C(第三组)。如下图所示:
第一组负责存储落在 C-A 区间内的数据。
第二组负责存储落在 A-B 区间内的数据。
第三组负责存储落在 B-C 区间内的数据。
士兵分配
假定编号为 9527 的士兵,进行哈希运算后,落到 C-A 区域。如下图所示:
第二步,让这个士兵顺时针往前走,遇到的第一个节点 A 就是他所在的组了。如下图所示:
增加分组
目前三个节点的时候,假定编号为 89757 的士兵经过哈希运算后,分配到了 B-C 区域(第三组),也就是属于 C 节点管控。如下图所示:
回到刘邦刚问的问题,如果分组变成四组,该怎么进行士兵分配。
如下图所示,增加一个节点 D,原来的区域 B-C 变成了区域 B-D(第三组) 和 D-C(第四组)。
那么这名士兵属于哪个节点管控呢?如下图所示,士兵顺时针往前走,先走到了 D 节点,所以属于 D 节点管控。虽然还是属于第三组,但是这名士兵的领导者已经变了:由 C 变成了 D。
从上面的变化来看,只有 B-C 区域中的部分数据会进行迁移:B-D 之间的数据会由 C 节点迁移
到 D 节点。
而其他数据不受影响,也不用进行迁移。而且节点越多,需要迁移的数据就越少。这就是多多益善了~
刘邦看了后,大赞韩信:
不愧是大将军,萧何当时月下追你,值了!
哈希环缺陷
萧何看了韩信画的哈希环后,觉得有些不对劲,思索片刻后,对韩信说:
将军,你这个哈希环上的节点分布
不太均匀
啊,你看第三组和第四组的的区域好小啊。
萧何说得没错,确实存在这个问题,放到互联网架构中,就存在如下问题:
节点分布不均匀,导致业务对节点的访问冷热不均。
韩信眼中充满着赞赏,知我者莫若萧何。然后胸有成竹地说道:
你说得没错,不过我还有一个技能,
虚拟节点映射
。
三技能:虚拟节点
一般虚拟节点比物理节点要多,并相对均匀地分布在哈希环上。如下图所示,12 个虚拟节点 N1~N12,相对均匀地分布在虚拟节点上。如果有士兵属于 N2/N3/N4 中的某一个,都会重新映射到 A 节点,依次类推,N5/N6/N7 属于 B 节点的虚拟节点映射。
我们来看下萧何的提出的问题,真实的 B-D 区域比较小,用虚拟节点后,N5/N6/N7 属于 B 节点,N8/N9/N10 属于 D 节点,他们分到的虚拟节点一样多,而且区域大致相等。所以士兵的分配也比较均匀。
萧何看了韩信的三技能后,直呼:妙哉妙哉!
总结
本篇通过韩信点兵的故事中衍生的出刘邦、韩信、萧何的对话,来讲解士兵的分组的问题。现在对故事中的知识点做一个总结:
哈希算法会带来增加或删除节点时,数据迁移量太大的问题。
一致性哈希算法降低了数据迁移量。
节点较少,哈希环上每个节点实际占据的区间大小不一,最终导致业务对节点的访问冷热不均。
引入虚拟节点映射解决了分布不均问题。
节点越多时,使用哈希算法时,需要迁移的数据就越多,而使用一致性哈希算法,迁移的数据就越少。
一致性哈希算法本质上是一种路由寻址算法,适合简单的路由寻址场景。
一致性哈希算法常用在负载均衡的架构设计中。
福 利
CSDN给大家发压岁钱啦!
2月4日到2月11日每天上午11点
价值198元的芒果TV年卡,价值99元的CSDN月卡!现金红包,CSDN电子书月卡等奖品大放送!百分百中奖!
电脑端点击链接参与:https://t.csdnimg.cn/gAkN
更多精彩推荐
☞英超引入 AI 球探,寻找下一个足球巨星☞三年投 1000 亿,达摩院何以仗剑走天涯?☞程序员硬核“年终大扫除”,清理了数据库 70GB 空间
☞2021年浅谈多任务学习
点分享点收藏点点赞点在看
相关文章:

有计划地开放数据 促进大数据法规落地
5月1日起,《贵阳市政府数据共享开放条例》正式实施。 《条例》的出台,仅仅是我市大数据发展步入法治轨道的开始。如何更好地让《条例》实现落地,成为新的课题。 2017年1月18日,贵阳市政府数据开放平台正式上线。目前,平…

C#中Base64之编码,解码方法
编码 public string EncodeBase64(string code_type,string code) { string encode ""; byte[] bytes Encoding.GetEncoding(code_type).GetBytes(code); try { encode Convert.ToBase64String(bytes); } catch { encode code; } return encode; }…
自回归与非自回归模型如何兼得?预训练模型BANG或许可解
作者 | 齐炜祯、宫叶云、段楠来源 | 微软研究院AI头条头图 | 下载于视觉中国编者按:近两年,预训练技术的发展极大地提高了自然语言生成的效果,但随着数据量和模型大小的增加,模型在使用时的推断耗时也随之变大。为了降低自回归生成…

STL--自定义类型的排序
STL的排序太坑了,尤其是在VS2010上重载sort函数的第三个比较参数的时候。 invalid operator < 这个错在写多关键字排序的时候就没有停止过。 本来想查书解决,结果各种重载都试了还是不行,百度才知道是因为:strict weak orderin…

《树莓派Python编程指南》——2.3 小结
本节书摘来自华章计算机《树莓派Python编程指南》一书中的第2章,第2.3节,作者:(美) Alex Bradbury Ben Everard更多章节内容可以访问云栖社区“华章计算机”公众号查看。 2.3 小结 我们的Python快速导览到此为止。希望这些程序能…
十年沉浮,用Python看创业公司消亡史
作者 | 叶庭云来源 | 修炼Python头图 | 下载于视觉中国前言IT桔子有一个新经济死亡公司数据库:https://www.itjuzi.com/deathCompany,统计了2000-2020年之间比较出名的公司 "死亡" 数据。"死亡公司数据库" 的公司关闭时间是依据公开…

.NET下正则表达式应用的四个示例
1.确认有效电子邮件格式 下面的代码示例使用静态 Regex.IsMatch 方法验证一个字符串是否为有效电子邮件格式。如果字符串包含一个有效的电子邮件地址,则 IsValidEmail 方法返回 true,否则返回 false,但不采取其他任何操作。您可以使用 IsVali…

static的本质
通过反编译发现,static的本质是abstract sealed。因此,无法继承System.Math类,因为它是static的。转载于:https://www.cnblogs.com/Benjamin/p/3319856.html

Sunrun2016年Q3财务业绩强劲 冲刺全年目标
美国第二大住宅太阳能光伏系统安装商Sunrun,第三季度业绩表现强劲,促使该公司提高其今年的部署前景。Sunrun也采用当下流行的零首付商业模式,从而获取长期收益。 Sunrun2016年Q3财务业绩强劲 冲刺全年目标责任编辑:editor006 作者…

tcpdump移植和使用
tcpdump移植和使用[摘要]:本文主要讲解了tcpdump相关概念和主要参数的使用,并通过事例来讲解tcpdump的用法,最后讲解如何将其移植到嵌入式开发环境,使其在嵌入式主控板中发挥其强大功能。一. tcpdump概念tcpdump就是dump the traf…

在ASP.NET中自动给URL地址加上超链接
作为一个程序员,在完成设计后还要根据程序的情况以及用户的反映不断对程序进行改进,这样才能不断地完善自己的作品。我在制作完软件商务网 http://www.bizsofts.com 的论坛后,发现人们总喜欢在帖子中加上各种有用的URL链接或Email地址。而我当…

释放联接新价值,华为提出“1+N”5G目标网,推动运营商构筑四大数字化转型的核心能力
近日,在MWCS 2021 媒体分析师预沟通会上,华为常务董事、运营商BG总裁丁耘发表了主题为《点亮未来,释放联接新价值》的主题演讲,提出华为将立足联接,通过持续的技术与商业创新,为客户创造价值,为…

光伏电价断崖式下跌 企业遭遇成长烦恼
在弃光限电严重、补贴欠发(三年缺口将达600亿元)、用地问题突显的情况之下,近日,2017年光伏上网电价将酝酿下调近三成,新“四座大山”将蚕食新能源企业的利润。 协合新能源 在香港上市的协合新能源却在不利情况下逆势扩张,营收从2…

asp.net2.0如何加密数据库联接字符串
asp.net2.0如何加密数据库联接字符串 在asp.net2.0中,发布网站时,加密web.config,这样可以有效保证数据库用户和密码安全,其步骤如下: 1.添加密钥 执行:C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_regiis -pc "hnlaw" -exp 其中"hnlaw"为密钥名…
机器学习 KNN算法实践
作者 | 叶庭云来源 | 修炼Python头图 | 下载于视觉中国KNN算法简介KNN(K-Nearest Neighbor)最邻近分类算法是数据挖掘分类(classification)技术中常用算法之一,其指导思想是"近朱者赤,近墨者黑"&…

【生活随想】实习结束以及开始校园招聘
我发现很多时候我处理事情的思维是局限的!就拿前几天辞职的事情来说吧,我原打算直接向公司辞职,但后来听同学说“还是先试着向公司请假比较好”,不用细想也是,如果公司同意我请假,我还能给自己留一条后路&a…

《21世纪机器人》一一第1章 他用自己的思想打造机器人
第1章 他用自己的思想打造机器人 我在前面说过,这本书的结尾是吉米站在后台,准备闪亮登场,这是他的首次亮相。当我把吉米的这张照片发给我太太时,她很快回复:“这真的是用你的思想打造出的机器人!ÿ…
牛年快乐~新一年从甜蜜的烘焙里学AI
作者 | 神经小兮来源 | HyperAI超神经头图 | 下载于视觉中国经过数千年的积累,人类已经开发出了各色美味,但我们的味蕾却永远不知满足。谷歌一位 AI 开发者,为了探索新的可能,用 AI 来开发新的甜点食谱。AI 在菜谱开发这一领域&am…

Datalist控件,Repeater控件如何分页?
Asp.net提供了三个功能强大的列表控件:DataGrid、DataList和Repeater控件,但其中只有DataGrid控件提供分页功能。相对DataGrid,DataList和Repeater控件具有更高的样式自定义性,所以很多时候我们喜欢使用DataList或Repeater控件来显…

java List集合中contains方法总是返回false
ArrayList的contains方法 java 今天在用ArrayList类的caontains方法是遇到了问题,我写了一个存放User类的ArrayList 但在调用list.contains(user)时总是返回false。 去看了下ArrayList的源码,源码如下: Java代码 public boolean contains…

营销自动化的4大预测分析错误
预测分析是数字营销的新领域。许多专家已经讨论了将预测分析与营销自动化工具(如HubSpot和Marketo)合并的好处。 将预测分析整合到用户的营销自动化策略中可能非常有益,但也很难执行。以下是可能会阻止其实施的一些常见的错误: 1.…

Prolog学习:数独和八皇后问题
上一篇简单介绍了下Prolog的一些基本概念,今天我们来利用这些基本概念解决两个问题:数独和八皇后问题。 数独 数独是一个很经典的游戏: 玩家需要根据nn盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列…
每年节省170万美元的文档预览费用,借助机器学习的DropBox有多强?
【CSDN 编者按】Dropbox 借助机器学习的预测功能,每年能为公司节省了一百多七十多万美元的基础架构成本。非常了不起的成就。本文,一起来看一看 Dropbox 采用机器学习的经过,以及分析一下其中的利弊。译者 | 弯月 责编 | 张文出品 | CSDN&a…

asp.net 对xml文件的读写,添加,修改,删除操作
asp.net 对xml文件的读写,添加,修改,删除操作 下面有代码调试正确 using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using…

阿里重金投数梦工场 布局PaaS动了谁的奶酪
就目前云计算市场来看,巨头的争夺表面上还在IaaS激战,但实际上他们对PaaS也在默默布局。6月8日,PaaS相关服务商数梦工场宣布完成光大实业资本、阿里巴巴等公司共同投资的7.5亿元A轮融资。值得注意的是,阿里巴巴是几位投资方中唯一…

ASP.net中太长的数据缩略显示
问题:用<%# DataBinder.Eval(Container.DataItem,"NewsID")%>显示数据的,如果标题太长了怎么规定字数,多余的用"..."代替解决方法: 1.使用后台代码解决: cs文件代码:…
再见 for 循环!pandas 提速 315 倍~
for是所有编程语言的基础语法,初学者为了快速实现功能,依懒性较强。但如果从运算时间性能上考虑可能不是特别好的选择。本次东哥介绍几个常见的提速方法,一个比一个快,了解pandas本质,才能知道如何提速。下面是一个例子…

UVa 374 - Big Mod
题目大意:计算R BP mod M,根据模运算的性质计算。 正常计算会超时,可以用分治的思想降低时间复杂度。不过如果遇到00,结果...话说00的结果是1吗?忘了都... 1 #include <cstdio>2 3 int powMod(int base, int ex…

微软在慕尼黑设立欧洲首个物联网实验室
北京时间3月30日晚间消息,微软今日在慕尼黑设立了其在欧洲的首个物联网实验室。在此之前,微软已经在雷德蒙(Redmond)总部和中国深圳设立了物联网实验室。 慕尼黑是德国许多知名大企业的故乡,如宝马和西门子等。在此之前,思科和IBM…

linux的strace命令
linux的strace命令 strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用。 strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。 下面记录几个常用 option . …