您的位置:首页 > 其它

一致性哈希算法

2017-11-11 19:26 155 查看
首次听到一致性Hash算法,不明白是一个什么样的算法,通过多方查找资料,总算是有了一个基础的了解。特在此处留作笔记,以便后续的学习!

学习一个技术,先想是什么场景下会用到这个技术,它解决了什么问题!

1--引入

一致性hash作为一个负载均衡算法,可以用在分布式缓存、数据库的分库分表等场景中,还可以应用在负载均衡器中作为作为负载均衡算法。在有多台服务器时,对于某个请求资源通过hash算法,映射到某一个台服务器,当增加或减少一台服务器时,可能会改变这些资源对应的hash值,这样可能导致一部分缓存或数据失效了。一致性hash就是尽可能在将同一个资源请求路由到同一台服务器中。

2--典型的应用场景

有N台服务器提供缓存服务,需要对服务器进行负载均衡,将请求平均分发到每台服务器上,每台机器负责1/N的服务。

常用的算法是取余法(对hash结果取余数) :对机器编号从0到N-1,按照自定义的
hash()算法,对每个请求的hash()值按N取模,得到余数i,然后将请求分发到编号为i的机器。

但这样的算法方法存在致命问题,如果某一台机器宕机,那么应该落在该机器的请求就无法得到正确的处理,这时需要将宕掉的服务器从算法中去除,此时会有(N-1)/N的服务器的缓存数据需要重新进行计算;如果新增一台机器,会有N
/(N+1)
的服务器的缓存数据需要进行重新计算。对于系统而言,这通常是不可接受的颠簸(因为这意味着大量缓存的失效或者数据需要转移)。

那么,如何设计一个负载均衡策略,使得受到影响的请求尽可能的少呢?在Memcached、Key-Value Store 、Bittorrent DHT、LVS中都采用了一致性hash算法,可以说一致性hash是分布式系统负载均衡的首选算法


3--一致性hash原理

为了解决以上取模运算的缺点,我们引入一致性hash算法。
3-1
一致性hash算法的原理如下:

首先我们把2的32次方想象成一个环,比如:



假如我们有四台服务器分布这个环上,其中Node1,Node2,Node3,Node4就表示这四台服务器在环上的位置,一致性hash算法就是,在缓存的Key的值计算后得到的hash值,映射到这个环上的点,然后这些点按照顺时针方向找,找到离自己最近的一个物理节点就是自己要存储的节点。

3-2

当我们增加了一个节点如下:



我们增加了Node5放在Node3和Node4之间,这时我们可以看到增加了一个节点只会影响Node3至Node5之间的数据,其他节点的数据不会受到影响。同时我们还可以看到,Node4和Node5的压力要小于其他节点,大约是其他节点的一半。这样就带来了压力分布不均匀的情况假定Node4和Node5的机器配置和其它的节点机器配置相同,那么Node4和Node5的机器资源就浪费了一半,那么怎么解决这个问题呢?

3-3
我们引入虚拟节点,简单来说,虚拟节点就是不存在的点,这些虚拟节点尽量的分布在环上,需要做的就是把这些虚拟节点需要映射到物理节点。



在引入虚拟节点后,我们把虚拟节点上均匀的分布到环上,然后把虚拟节点映射到物理节点,当增加了新的机器后,我们只需要把虚拟节点映射到新的机器即可,这样就解决了机器压力分布不均匀的情况

总结

在什么场景下会用到这个技术?

答:在分布式缓存,负载均衡策略中会用到。
解决了什么问题?

答:最大限度地抑制了hash键的重新分布,最大限度地减小服务器增减时的缓存重新分布,提高了用户请求命中缓存(服务器)的命中率,加快了用户的访问速度,减轻了服务器的压力;

资料来源:http://blog.csdn.net/world6/article/details/77514086?locationNum=1&fps=1

总结完毕!!!






内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: