资讯专栏INFORMATION COLUMN

一致性Hash

spacewander / 3380人阅读

摘要:当时十分兴奋,立即去找了关于一致性协议的文章来看。到了今天再去回想,发现对一致性协议的概念已经模糊不清了。一致性算法一致性哈希算法在年由麻省理工学院的等人在解决分布式中提出的,设计目标是为了解决因特网中的热点问题,初衷和十分类似。

第一次知道一致性Hash协议是在方腾飞的技术文章实战解析-论三年内快速成长为一名技术专家里看到的。

问:对于三十岁的程度员,如果还想再深入做技术,有什么建议?

答:技术人员一定要有危机感,无论多大年纪仍然要持续的学习,我也已经三十多了,每周会花点时间学习点技术。
但是年纪大了,其实时间不会那么多,所以要提高学习的效率,掌握一些学习方法和方法论,并且要静下心来持续的学习。
学技术什么时间都不晚,因为总有新技术冒出来,但是一些永远不变的技术可以优先学习,比如各种协议(TCP,HTTP,一致性hash协议),实现原理,算法等。

当时十分兴奋,立即去找了关于一致性hash协议的文章来看。到了今天再去回想,发现对一致性hash协议的概念已经模糊不清了。虽然关于一致性hash协议的文章数不胜数,但是还是需要用自己的语言来表达一遍,才能真正的理解这些技术概念,成为自己的东西。这也是写这篇文章的理由。

什么是一致性Hash协议?

一致性Hash协议是指满足了以下4个条件的Hash算法:

均衡性(Balance)

单调性(Monotonicity)

分散性(Spread)

负载(Load)

均衡性

均衡性是指Hash的结果应该尽可能的平均分配给所有的节点,实现负载均衡的效果,这也是最基本的特性。

单调性

单调性是指在节点增加或减少的情况下,已Hash的结果与节点的映射关系尽量不发生变化。单调性低的Hash算法在节点增加或减少的时候会出现Hash的结果与节点的映射关系大量失效的情况,造成严重的性能问题或系统故障。

分散性

分散性是指相同内容在不同客户端Hash的结果是否一致。因为在分布式的环境下,不同客户端可以看到的节点数可能是不同的,分散性高的Hash算法会导致相同的内容却映射了多个节点。

负载

负载是从节点角度出发,不同内容的Hash结果却映射了同一个节点位置。

普通余数Hash算法

Hash结果 % 节点数,非常的简单和好用。虽然这种算法满足了均衡性,但是单调性却非常的差劲,一旦节点数有变动就会造成大量的Hash的结果与节点的映射关系失效
。只适用于节点数固定的场景。

一致性Hash算法

一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT可以在P2P环境中真正得到应用。

首先构造一个长度为2^32的整数环,然后将节点Hash的结果均匀映射到整数环上。

这时将内容映射到整数环上。

如图所示,Hash的结果与节点的映射关系是根据Hash的结果按顺时针遇到的第一个节点来判定的。这样做是为了有良好的单调性,假如现在节点C故障了那么新的映射关系如下图所示:

我们可以看到原本属于节点C的映射现在都重新映射到了节点D上,这样至少保证了大部分的映射可以正常工作。

保证良好的均衡性

一致性Hash算法的均衡性取决于节点的位置是否分布均匀,如果是按上图所示分布节点,那么很明显节点D的压力远远高于其他节点。不过即使节点已经分布均匀了,如果节点数量太少的话也很容易造成数据倾斜问题。

虚拟节点

虚拟节点是用来解决节点数量过少造成的数据倾斜问题。顾名思义,通过虚拟出一些节点来增加总节点数,这样就有良好的均衡性了。

后记

原理虽然简单实现起来却挺麻烦,大家如果有兴趣可以自己去实现一个版本。我虽然写了个demo但感觉并不好,就不放上来献丑了。计划是一周写一篇文章的,现在已经写了5篇了,动力开始不足了。原因可能很多,比如不知道写什么,肚子里墨水不多等。希望能坚持下去,为了更好的明天。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71723.html

相关文章

  • 致性hash算法原理及golang实现

    摘要:一致性算法与其他算法对比对于集群中缓存类数据的节点分配问题,有这几种解决方法,简单的取模,槽映射,一致性。这显然是不可接受的。一致性一致性如上文所言,其新增一个节点的失效率仅为,通过一致性最大程度的降低了实效率。 概述 这里存在一种场景, 当一个服务由多个服务器组共同提供时, key应该路由到哪一个服务.这里假如采用最通用的方式key%N(N为服务器数目), 这里乍一看没什么问题, 但...

    MarvinZhang 评论0 收藏0
  • 什么是致性Hash算法?

    摘要:五一致性算法的容错性和可扩展性现假设不幸宕机,可以看到此时对象不会受到影响,只有对象被重定位到。综上所述,一致性算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。 最近有小伙伴跑过来问什么是Hash一致性算法,说面试的时候被问到了,因为不了解,所以就没有回答上,问我有没有相应的学习资料推荐,当时上班,没时间回复,晚上回去了就忘了这件事,今天突然看到这个,...

    feng409 评论0 收藏0
  • 致性hash实现java版本及强致性hash原理

    摘要:好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。一致性哈希算法的基本实现原理是将机器节点和值都按照一样的算法映射到一个的圆环上。 一致性 hash 分布式过程中我们将服务分散到若干的节点上,以此通过集体的力量提升服务的目的。然而,对于一个客户端来说,该由哪个节点服务呢?或者说对某个节点来说他分配到哪些任务呢? 强哈希 考虑到单服务器不能承载,因此使用了分布式架构,最初...

    hzc 评论0 收藏0
  • 通过PHP实现致性哈希算法

    摘要:通过虚拟节点优化一致性算法为了提高一致性算法的平衡性,我们首先能够想到的是,增加节点数,但是机器毕竟是需要经费啊,不是说增就能随意增,那就增加虚拟节点,这样就没毛病了。 一、案例分析(1)问题概述 假设我们的图片数据均匀的分配在三台服务(分别标注为服务器A,服务器B、服务器C)上面,现在我们要从里面取图片,服务端在拿到这个请求后,怎么会指定,这张图片是存在服务器A、服务器B,还是服务器...

    tulayang 评论0 收藏0
  • session致性架构设计实践

    摘要:最常见的,会把用户的登录信息用户信息存储在中,以保持登录状态。什么是一致性问题只要用户不重启浏览器,每次短连接请求,理论上服务端都能定位到,保持会话。在高可用时,如何保证路由的一致性,是今天将要讨论的问题。 一、缘起 什么是session?服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文。 Web开发中,web-server可以自动为同一个浏览器的访...

    freewolf 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<