韩信大招:一致性哈希

![封面,图片来源王者荣耀](https://img-blog.csdnimg.cn/img_convert/e5950a8e0eefebcc4632a728c520d256.png)

这是悟空的第 78 篇原创文章。

> 本文已收录 Github:https://github.com/Jackson0714/PassJava-Learning

韩信点兵的成语来源淮安民间传说。常与多多益善搭配。寓意越多越好。我们来看下主公刘邦和韩信大将军的对话。

> **刘邦**:“你觉得我可以带兵多少?”

>

> **韩信**:“最多十万。”

>

> **刘邦**不解的问:“那你呢?”

>

> **韩信**自豪地说:“越多越好,多多益善嘛!

假如刘邦现在给了韩信 1000 个士兵,需要大致均匀分成三组。士兵的编号是 6 位数,从 1-100000 随机分配。比如第一个士兵的值是 245,第二个士兵的编号是82593,其他士兵类似。那么如何对士兵进行分配呢?

> **刘邦**:韩将军,你看这些士兵怎么分配好呢?

>

> **韩信**:这还不简单,我的一技能就能搞定。

## 一技能:哈希算法

### 分组

韩信的一技能`哈希算法`:将士兵的编号 num 值当做一个 hash 值,再和总做组数 N 做取余操作,得出的结果在 0 到 N - 1 之间,这个士兵就属于那个组。

如下图所示,每来一个士兵都有一个六位的 hash 值(也可以称作编号),然后被韩信用除以 3 取余数的方式分配到三个组。比如第一组中的编号为 123456 的士兵,除以 3 之后,整除,余数为 0,所以分配到第一组。

![哈希算法](https://img-blog.csdnimg.cn/img_convert/88714212f700a8f460b9bf0934d5684b.png)

### 查找士兵

现在已经分好组了,假如想找到编号为 666666 的士兵该怎么找?首先将 666666 除以 3,得到余数 0,说明在第一个组,然后去第一个组里面找就可以了。

这里有小伙伴可能会问,为什么不是把所有士兵放到一个组?

**因为一个组太大了,影响行军速度**。映射到互联网架构中,就是通过增加节点从而减小单节点的负载压力。

### 哈希分组弊端

刘邦看了这个一技能后,大呼:

> 韩将军真是厉害。

>

> 哈希算法看起来很完美,那我再给你五百士兵,需要分成四个组怎么办?

这时,韩信的副将说话了:

> 这还不简单,再用 4 取余不就好了吗?

刘邦摸着下巴思索片刻后,对副将说:

> 这个方案可行,但很多士兵都被重新分组了,刚刚建立的团队友情就被分解了。

我们来看下刘邦为什么觉得方案不可行。

比如原来分配到一组的编号为 3 的士兵,当分成四组的时候,通过公式计算:3%4=3,所以会分配到到第四组。

依次类推,会发现很多士兵进行了重新分配,只有小部分不会变换分组,比如 1,2,12 等等。

韩信对着刘邦点点头,对着主公说道:

> 主公,您说得没错,这就是我的一技能的`弱点`所在。

>

> 不过我还有一个技能:`一致性哈希`。

## 二技能:一致性哈希

### 哈希环

一致性哈希算法也用了取模运算,但是它与哈希算法不同的地方:

- **哈希算法**:对节点的数量进行取模运算。

- **一致性哈希算法**:对 2^32 进行取模运算。

可以想象一下,一致性哈希算法,是将整个哈希值空间组成了一个虚拟的圆环,也就是`哈希环`。

如下图,把 3 个组映射到固定大小为 `2^32` 的哈希环中。三个组一共将整个环分成了三个区域,C-A(第一组)、A-B(第二组)、B-C(第三组)。如下图所示:

![分成三组](https://img-blog.csdnimg.cn/img_convert/b5af90ff770100dc3c5a40a2ee08200c.png)

- 第一组负责存储落在 C-A 区间内的数据。

- 第二组负责存储落在 A-B 区间内的数据。

- 第三组负责存储落在 B-C 区间内的数据。

### 士兵分配

假定编号为 9527 的士兵,进行哈希运算后,落到 C-A 区域。如下图所示:

![士兵所站位置](https://img-blog.csdnimg.cn/img_convert/24b2246fc44b046cb90b57063e7ada84.png)

第二步,让这个士兵顺时针往前走,遇到的第一个节点 A 就是他所在的组了。如下图所示:

![顺时针遇到第一个节点](https://img-blog.csdnimg.cn/img_convert/72ca9af997e6acfae4ba91eab692465f.png)

### 增加分组

目前三个节点的时候,假定编号为 89757 的士兵经过哈希运算后,分配到了 B-C 区域(第三组),也就是属于 C 节点管控。如下图所示:

![属于 C 节点](https://img-blog.csdnimg.cn/img_convert/de05478518eef0be2e593741dbd2303e.png)

回到刘邦刚问的问题,如果分组变成四组,该怎么进行士兵分配。

如下图所示,增加一个节点 D,原来的区域 B-C 变成了区域 B-D(第三组) 和 D-C(第四组)。

![增加 D 节点](https://img-blog.csdnimg.cn/img_convert/62bda4c54d966ce54edadbe7cf9507a8.png)

那么这名士兵属于哪个节点管控呢?如下图所示,士兵顺时针往前走,先走到了 D 节点,所以属于 D 节点管控。虽然还是属于第三组,**但是这名士兵的领导者已经变了:由 C 变成了 D**。

![领导者变了](https://img-blog.csdnimg.cn/img_convert/3918a114dc6a9a4a59ea5f05bf952c9c.png)

从上面的变化来看,只有 B-C 区域中的部分数据会进行迁移:B-D 之间的数据会由 C 节点`迁移`到 D 节点。

而**其他数据不受影响,也不用进行迁移**。而且节点越多,需要迁移的数据就越少。这就是多多益善了~

刘邦看了后,大赞韩信:

> 不亏是大将军,萧何当时月下追你,值了!

### 哈希环缺陷

萧何看了韩信画的哈希环后,觉得有些不对劲,思索片刻后,对韩信说:

> 将军,你这个哈希环上的节点分布`不太均匀`啊,你看第三组和第四组的的区域好小啊。

萧何说得没错,确实存在这个问题,放到互联网架构中,就存在如下问题:

**节点分布不均匀,导致业务对节点的访问冷热不均**。

韩信眼中充满着赞赏,知我者莫若萧何。然后胸有成竹地说道:

> 你说得没错,不过我还有一个技能,`虚拟节点映射`。

## 三技能:虚拟节点

一般虚拟节点比物理节点要多,并相对均匀地分布在哈希环上。如下图所示,12 个虚拟节点 N1~N12,相对均匀地分布在虚拟节点上。如果有士兵属于 N2/N3/N4 中的某一个,都会重新映射到 A 节点,依次类推,N5/N6/N7 属于 B 节点的虚拟节点映射。

![虚拟节点](https://img-blog.csdnimg.cn/img_convert/d9ad72a8a2104b37cbf0ba01bf634caf.png)

我们来看下萧何的提出的问题,真实的 B-D 区域比较小,用虚拟节点后,N5/N6/N7 属于 B 节点,N8/N9/N10 属于 D 节点,他们分到的虚拟节点一样多,而且区域大致相等。所以士兵的分配也比较均匀。

> 萧何看了韩信的三技能后,直呼:妙哉妙哉!

## 总结

本篇通过韩信点兵的故事,然后从故事中衍生出刘邦、韩信、萧何的对话,来讲解士兵的分组的问题。现在对故事中的知识点做一个总结:

- 哈希算法会带来增加或删除节点时,**数据迁移**量太大的问题。

- 一致性哈希算法**降低**了数据迁移量。

- 节点较少,哈希环上每个节点实际占据的区间大小不一,最终导致业务对节点的访问**冷热不均**。

- 引入**虚拟节点映射**解决了分布不均问题。

- 节点**越多**时,使用哈希算法时,需要迁移的数据就**越多**,而使用一致性哈希算法,迁移的数据就**越少**。

- 一致性哈希算法本质上是一种**路由寻址**算法,适合简单的路由寻址场景。

- 一致性哈希算法常用在负载均衡的架构设计中。

封面图片来源王者荣耀。

往期推荐:

[四:用动图讲解分布式 Raft](http://mp.weixin.qq.com/s?__biz=MzAwMjI0ODk0NA==&mid=2451950743&idx=1&sn=df1c600f636c8d9b119f534750c007eb&chksm=8d1c3508ba6bbc1e6e4def2ea4c25d9c5e69013d463af31f6bc78cacbc3735ccea455842303d&scene=21#wechat_redirect)

[三:诸葛亮 VS 庞统,拿下分布式 Paxos](http://mp.weixin.qq.com/s?__biz=MzAwMjI0ODk0NA==&mid=2451950571&idx=1&sn=04359a2a8db23a64da29cd03dafe0f9c&chksm=8d1c3274ba6bbb62b03a452f5598d355d0dc91ea955d810e5a8128c466b3b0d04f2e6469c49b&scene=21#wechat_redirect)

[二:用太极拳讲分布式理论,真舒服!](http://mp.weixin.qq.com/s?__biz=MzAwMjI0ODk0NA==&mid=2451950422&idx=1&sn=7f86457acedbd0853cbcb7dc4377dd54&chksm=8d1c32c9ba6bbbdfd3d8c698addfb13a02589409bdf6a03a777e9afc95249018293d9a9e0a3f&scene=21#wechat_redirect)

[一:用三国杀讲分布式算法,舒适了吧?](http://mp.weixin.qq.com/s?__biz=MzAwMjI0ODk0NA==&mid=2451949807&idx=1&sn=d8fb211bc87275e004a8001e095ef402&chksm=8d1c3170ba6bb866ca19548e3922d64d194a0c798622aa954e0236b85cb0869c88ff40f3deed&scene=21#wechat_redirect)

> `作者简介`:8 年互联网经验,擅长架构设计、分布式、微服务。手写了一套 SpringCloud 实战教程,自主开发了 PMP 刷题小程序和 Java 刷题小程序。回复 pdf 领取。

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

推荐阅读更多精彩内容

  • 一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,...
    pgz_lq阅读 612评论 0 1
  • 1. 传统哈希(硬哈希) 分布式系统中,假设有 n 个节点,传统方案使用mod(key, n)映射数据和节点。 当...
    fire_man阅读 240评论 0 0
  • 一致性Hash性质 考虑到分布式系统每个节点都有可能失效,并且新的节点很可能动态的增加进来,如何保证当系统的节点数...
    IT界刘德华阅读 183评论 0 0
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,518评论 16 22
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,561评论 0 11