什么是一致性Hash算法

文章前记


程序员工作久了便可能整日忙碌于“增删改查”中,迷失方向,毫无进步。

该公众号致力于分享软件开发相关的原创干货,助你完成从程序员到架构师的进阶之路!

努力!做一个NB的Coder!


1  Hash算法


要说一致性Hash算法,我们先从基本的Hash算法说起。

Hash算法,我们都是熟悉的,它是一种摘要算法,即根据原有的内容产生一个简短的摘要结果。

摘要结果跟原内容是相关的,原内容的改变(极大概率)会导致摘要内容的改变。

这里说的极大概率会改变是因为这取决于该Hash算法的输出空间的大小:输出空间小了,则可能出现改变后的Hash结果与原Hash结果恰好相等的情况;而输出空间越大,上述情况发生的概率则越小。

假设输入输出都是一个数字,那么我们可以定义一个简单的Hash算法:

当一个值value输入时,该算法会输出0到6之间的自然数。



2  Hash算法的使用与问题

Hash算法的使用非常广泛,例如:对一段信息生成Hash值后,可以作为校验信息是否发生变更的依据;通过Hash算法,将请求均匀地分配到应用服务器上;使用Hash算法,确保同样的用户总是访问同一个服务器等。

但是,Hash算法也存在一定的局限性。例如,我们有0-6共7台服务器,通过我们上一节的Hash算法将用户id(自然数)作为输入,得到一个服务器编号。然后将用户的信息近似均匀地分配到这7台服务器上,从而实现负载均衡。

假如这时5号服务器出现故障,我们要将其下线,于是:

这时我们发现,用户id输入后,该Hash算法输出的结果与原来相差极大,使得大量用户无法访问到原来的服务器,这并不是我们想见到的。

例如,28号用户,原来28%7=0,映射到0号服务器,现在则映射到了28%6=4,映射到了4号服务器。而原来的0号服务器是存在的,该28号用户应依旧分配到0号服务器才对。

当然,随着用户增多,我们增加一台服务器时,也会引发相同的问题。此时一般需要进行重新Hash操作,对各个服务器上的数据进行重新分配,此操作几乎涉及所有服务器上的所有数据,工作量极大。



3  一致性Hash算法

在分布式系统中,扩容缩容操作极为常见,如果频繁进行重Hash操作显然是不可取的,一是消耗太大,而是可能引发服务的中断。此时,就要采用一致性Hash算法。

一致性Hash算法(Consistent Hashing)是一种hash算法,它能够在Hash输出空间发生变化时,引起最小的变动。以我们的例子来讲,增加或者移除一台服务器时,对原有的服务器和用户之间的映射关系产生的影响最小。

好的一致性Hash算法应该能够满足以下要求:

平衡性:这是Hash算法的基本要求,是指哈希的结果均匀地分配在整个输出空间中。

单调性:当发生数据节点变动时,对于相同的数据始终映射到相同的缓冲节点中或者新增加的缓冲节点中,避免无法找到原来的数据。

稳定性:当出现节点坏掉或热点访问而需要动态扩容时,尽量减少数据的移动。显然一般的Hash方法不满足这一点。

4  原理

一致性哈希算法最早在论文《Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web》中提出。具体思路就是一致性哈希将整个哈希输出空间设置为一个环形区域。

例如,该环形区域用数字0-2^32-1表示,沿顺时针方向值不断增大,0与2^32重合。整个哈希空间环如下:

接下来,我们将服务器进行Hash。可以使用服务器的编号或者ip等作为输入,得到一个输出值,映射在输出空间的环形区域上。假设它们的位置如下:

对于用户数据,同样进行Hash操作,映射在环形区域上。然后,让该值沿着顺时针方向移动,遇到的第一个服务器就是它分配的服务器。

例如有A、B、C、D四个数据对象,经过一致性哈希计算后,在环空间上的位置如下:

则根据刚才的规则,数据A会被分配到Node A上,B被分配到Node B上,C被分配到Node C上,D被分配到Node D上。



5  总结

通过将整个哈希输出空间设置为一个环形区域,减小了输出空间的变化对哈希结果的影响。

正因为以上特性,一致性哈希算法在分布式系统的缩容和扩容中能将对系统的影响降到最小,因此有着广泛的应用。

那在进行缩容和扩容中,一致性哈希算法具体如何发挥作用,我们在后面的文章中介绍。



—END—

微信公众号:程序员进阶架构师

分享让你从程序员进阶架构师的原创干货!

欢迎关注我们,不错过每期的原创干货!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容