算法【Hash算法总结】
一、简介
一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系 。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题。
二、应用场景
我们在项目的负载均衡上要求资源被均匀的分配到所有的服务器节点上,同时,还需要对资源的请求能迅速的路由到具体的节点,例如:
- 做RPC服务的时候,会经常部署多台服务器,然而有时有需求,希望将同一类型的请求路由到同一台机器上,这个时候就可以用一致性hash算法来实现 。
- MemCache集群,要求存储数据均匀的放到集群中的各个节点上,访问这些数据时能快速的路由到集群中对应存放该数据的节点上;并且要求增删节点对整个集群的影响很小,不至于有大的动荡造成整体负载的不稳定,这个时候也是可以用一致性hash算法。
三、原理
核心思想:维护出一个2的32次方整数环【0,2^32-1】,然后将每个节点的计算hash值放到环上。
现有三个节点分别是Node0、Node1、Node3,要将多个资源尽可能均匀的分配到这三个节点中,如何做。
3.1、为何使用环存储节点,还是顺时针查找。
我们要向分配节点第一想到的办法就是取余算法。即现在有3个节点,资源key=7,7%3=1,则选择Node1,key=5,5%3= 2,则选择Node2,key=3,3%3=0,则选择Node0。虽然简单,但有个缺点,如果节点数增加或减少,就会有大量的key不命中,导致大量缓存雪崩,造成请求压力转移,可能对系统整体有很大的影响,甚至发生宕机危险。
而一致性哈希算法增加或减少节点,只会引起很少部分的key不会命中,如下图,增加一个Node4节点,则只会将部分的key值从Node1移到Node4,对集群影响很小,不会导致雪崩。
3.2、一致性Hash的问题
虽然引用了hash环,但是由于机器数太少,可能导致大量数据被存储在一台机器上,资源没有得到充分有效的利用。这就是Hash倾斜。
3.3、如何解决Hash倾斜
引用虚拟节点。Hash环上面的节点数越多,分布越均匀,出现Hash倾斜的概率越小。
查询资源的顺序可以是:-》虚拟节点-》真实节点-》获取资源。
四、总结