一致性哈希(hash)算法
分类:知识大全作者:互联网王者 发布时间:2019-02-19 11:55:55阅读:7万+ 属地:未知
众所周知,分布式系统中有着大量的集群架构,用来支撑大流量的服务请求。 当后台有服务器集群的时候,服务请求以某种方式直接固定连接某一个服务器去处理,也就是固定服务请求和服务器之间的映射,但是这种方式过于简单,可能会造成某些服务器过于繁忙以至于宕机而另一些服务器则过于空闲,也就是无法对整个系统进行负载均衡,从而导致整体分布式系统的资源利用率低,甚至一旦某个服务器宕机,会直接导致一部分服务请求无法处理。
对于分布式系统,不同服务器上存储不同数据,因此我们使用哈希算法建立从数据到服务器之间的映射关系,以达到动态分配服务请求的目的,从而实现负载均衡。比如根据某个请求参数对服务器节点值进行取模运算,取模后的值就是对应的处理服务器ID。这种方法可以应对部分服务器失效的情况,当某个分布式集群中某个服务器宕机,服务请求可以通过hash算法重新分配到其他可用的服务器上,避免了无法处理请求的状况出现 。
假设服务器数量为3,20个存储数据的哈希值分别为1,2,3,4,5,6,7,8.....19,20,根据取模结果,各个服务器上存储的数据分别为:服务器0 上保存的数据有:3,6,9,12,15,18;服务器1 上保存的数据有:1,4,7,10,13,16,19;服务器2 上保存的数据有:2,5,8,11,14,17,20;当增加一台服务器后, 服务器数量为4,各个服务器上存储的数据分别为:服务器0 上保存的数据有:4,8,12,16,20;服务器1 上保存的数据有:1,5,9,13,17;服务器2 上保存的数据有:2,6,10,14,18;服务器3 上保存的数据有:3,7,11,15,19。可见,以上哈希算法可以在一定意义上实现了分布式系统服务请求时候的服务器的负载均衡。
但这种方法也有致命的缺陷,如果服务器中保存有服务请求对应的数据,那么如果集群中服务器新增或者宕机,就得重新计算请求的hash值,会造成大量的请求会被重定位到与之前不同的服务器,造成服务器系统巨大的压力。当集群中数据量很大时,采用一般的哈希函数,在服务器数量动态变化的情况下会造成大量的数据迁移,导致网络通信压力的剧增,严重情况,还可能导致服务器宕机。一个设计良好的分布式系统应该具有良好的单调性,即服务器的添加与移除不会造成大量的哈希重定位,那么在移除或者添加一个服务器时,如何能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系?
答案是一致性哈希算法解决了这个问题。 一致性哈希算法在1997年由麻省理工学院Karger等人提出,是一种特殊的哈希算法,目的是解决分布式系统的问题。一致性哈希算法可以保证当服务器增加或者减少时,服务器之间的数据迁移只限于两个服务器之间,不会造成整个系统的数据迁移,这对分布式系统的稳定性是至关重要的。
一致性哈希算法将整个哈希值空间映射成一个虚拟的圆环,整个哈希空间的取值范围为0~2^32-1,整个空间按顺时针方向组织,想象成一个闭合的环形,在零点中方向重合。然后对访问请求使用哈希算法对服务请求进行映射,算出对应的hash值,然后根据hash值的位置沿圆环顺时针查找,第一台遇到的服务器就是所对应的处理请求服务器。当增加一台新的服务器,受影响的数据仅仅是新添加的服务器到其环空间中前一台的服务器(也就是顺着逆时针方向遇到的第一台服务器)之间的数据,其他都不会受到影响,减少一台服务器也是如此。
因此一致性哈希算法对于整个系统中服务器的增减都只需迁移一小部分数据,具有较好的容错性和可扩展性 。一致性哈希算法也有一些明显的弊端,比如如果服务器过少,则会导致数据集中存储在一部分服务器中,当然可以采取一些办法去避免,这里不再细谈,有兴趣的读者可以自行研究。总之,一致性哈希算法是负载均衡至关重要的算法。
声明:本文内容版权归原作者所有,未经授权,禁止转载!
声明:本站仅提供内容存储、展示服务,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的虚假信息,谨防诈骗。如发现有害或侵权内容,可联系本站删除!
- 上一篇:二十四节气都有哪些
- 下一篇:Linux之top命令