一致性哈希算法原理

1.为什么出现一致性HASH算法

1.1 传统哈希方式:

在分布式缓存系统中吗,需要将数据均匀的分布到缓存服务器集群的不同机器上。

  • 需要对缓存的keyhash值计算,
  • hash值除以服务器节点的数量取模计算出数据需要落在哪台服务器节点上。

这种算法很简单,也可以实现数据的均匀分布。但是增加或者减少数据节点的时候会导致所有缓存数据失效。

举个栗子:
例如10条数据,3个节点,如果按照传统hash结构对3进行取模

  • node a:0,3,6,9
  • node b:1,4,7
  • node c:2,5,8

当增加一个节点的时候,数据分布变更为对4进行取模

  • 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 一致性哈希方式:

一致性Hash算法最关键的区别就是:对节点和数据,都做一次哈希运算,然后比较节点和数据的哈希值,数据存放在下一个的节点中,这样就会保证节点增加或者减少的时候,影响的数据最少。

还是刚才的例子(使用简单的字符串ascii码做哈希key
1. 求出数据的hash值:

  • 0:192
  • 1:196
  • 2:200
  • 3:204
  • 4:208
  • 5:212
  • 6:216
  • 7 :220
  • 8:224
  • 9:228

2. 求出节点的hash值:

  • node a:203
  • node g:209
  • node z:228

这时候,我们就可以将整个Hash值看做一个环,比较数据和节点的hash值,如果大于228,那么就归到前面的203上。

一致性hash算法

3. 求出节点的hash值:

  • node a:0,1,2
  • node g:3,4
  • node z:5,6,7,8,9

4. 加入了node:n节点之后

  • node n:216

5. 这个时候对应的数据就会做迁移

迁移后的一致性hash算法
  • node a: 0,1,2
  • node g:3,4,
  • node n:5,6
  • node z:7,8,9

于是我们可以看到:只有5,6节点需要迁移。

小胖:这个算法是厉害,但是若是服务节点过少的情况下,是不是会导致节点分配不均匀可能会导致数据倾斜的问题呀?

一致性hash算法分配不均

为了解决数据倾斜的问题,一致性哈希算法引入了虚拟节点机制:即对每一个服务节点计算多个哈希,每个计算得到的Hash位置都放置一个此服务节点,称虚拟节点。具体可以在服务器ip或主机名的后面增加编号来实现

2.一致性HASH性质:

考虑到分布式系统每个节点都有可能失效,并且新的节点都很可能动态的增加进来,如何保证当系统的节点数目发生改变时仍然对外能提供良好的服务?

尤其是在设计分布式缓存系统时,如果某台服务器失效,对于整个系统来说如果不采用合适的算法来保证一致性,那么缓存于系统中的所有数据都可能会失效(即:由于系统节点数目变少,客户端在请求某一对象时需要重新计算其hash值,由于hash值已经发生改变,所有很可能找不到保存该对象的服务器节点)

一致性hash算法应该满足一下几个方面:

* 平衡性(Balance)

平衡性是指哈希的结果能尽可能分布到所有的缓存中去,这样就可以使得所有的缓存空间都得到利用。

* 单调性(Monotonicity)

如果已经有一些内容通过hash分派到相应的缓存中,又有新的缓存区加入到系统中,那么哈希的结果应能够保证原有已分配的内容可以映射到新的缓冲区中,而不会映射到旧的缓存集合中的其他缓存区。
比如:最简单的线性哈希:x=(ax+b)mod(P)P表示全部缓存区的大小。不难看出,当缓冲大小发生变化时(从P1到P2)原先的哈希结果均会发生改变。原有的数据映射到了旧的缓存区。从而不满足单调性的要求。

__*分散性(Spread) __

在分布式环境中,终端有可能看不到所有的缓存,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时。由于不同终端所见的缓冲范围可能不同,从而导致哈希的结果不同,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况应该是避免的。
相同的内容被不同的终端映射到不同的缓冲区中,会降低系统的存储效率,分散性的定义就是上述情况发生的严重程度。好的哈希算法应该尽量避免不一致的情况发生。也就是尽量降低分散性。

* 负载(Load)

负载问题实际上是另外一个角度看待分散性的问题。既然不同的终端可能将相同的内容映射到不同的缓存区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同的内容。与分散性一样,这种情况也是应该避免的。因此好的哈希算法应能够尽量降低缓冲的负载。

* 平滑性(Smoothness)

平滑性是指:缓存服务器的数目平滑改变和缓冲对象的平滑改变是一致的。

本文参考:
一致性哈希算法原理
一致性HASH算法

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

推荐阅读更多精彩内容