好程序员带你五分钟了解一致性hash算法

好程序员带你五分钟了解一致性hash算法,一致性哈希算法的设计目标是为了解决因特网中的热点问题,如今也被普遍应用在分布式系统中。
好比针对负载均衡问题,对hash值取模的算法扩展性差,当增长或者减小服务器时,映射关系可能会出现问题,采用一致性hash算法,就能较好的解决该问题。
 

Hash值取模算法存在的问题程序员

好比,咱们有海量的图片存储在服务器上,假如,如今有4台服务器,咱们能够根据图片名称,采用hash算法,决定图片存储在哪台服务器
若是如今须要增长服务器,那么存取图片的服务器的算法就会发生改变,好比增长一台服务器后,算法变为hash(a.jpg)/5,这时候计算结果不必定仍是2,那么图片的位置就要发生改变。同理,减小服务器的话,也会存在相同问题。并且,全部的服务器都会受到影响。
 

一致性Hash算法算法

一致性Hash算法将哈希值映射的空间表示成一个虚拟圆环,通常能够设置映射值的范围是0----232-1,也就是说,咱们获得的hash值要对232取模。该hash环可表示以下:
假如咱们有四台服务器,咱们能够选择服务器的ip或主机名做为关键字进行哈希,而后取模,每台机器就能在hash环上肯定固定位置。以下图所示:
例若有Object A、Object B、Object C、Object D四个数据,通过哈希运算及取模后,在环空间上的位置以下图所示:
今后位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器。也就是说Object A定位到Node A,Object B定位到Node B,Object C定位到Node C,Object D定位到Node D。
若是Node C这台服务器出现问题宕机,那么Objcet C定位到Node D这台服务器,因此当某台服务器出问题时,只会对顺时针方向的前一台机器产生影响,本例中,只会对Node D有影响。
同理,若是增长一台服务器Node X,计算后,定位到以下图所示位置:
那么Object C就会定位到Node X,这种状况,只会对顺时针方向的Node C产生影响,不会影响其余服务器。

一致性Hash的缺点服务器

当服务器节点比较少的时候会出现一致性hash算法倾斜的问题(大部分数据存在一台服务器上)。在不改变服务器节点个数的前提下,通常解决方案是增长虚拟节点(即对每个服务器根据一致性hash算法计算多个值,每一个计算结果在环上定位一个服务节点),在定位数据时,就能够根据虚拟节点,定位到实际服务器。

总结负载均衡

一致性哈希算法对于节点的增减都只需重定位环空间中的一小部分数据,具备较好的容错性和可扩展性。
相关文章
相关标签/搜索