一致性哈希

一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。 [1] 在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题 [2]

简介

一致性哈希算法是1997年在论文Consistenthashingandrandomtrees中被提出 [3] ,在分布式系统中应用非常广泛。一致性哈希是一种哈希算法,简单地说在移除或者添加一个服务器时,此算法能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系,尽可能满足单调性的要求。在普通分布式集群中,服务请求与处理请求服务器之间可以一一对应,也就是说固定服务请求与处理服务器之间的映射关系,某个请求由固定的服务器去处理。这种方式无法对整个系统进行负载均衡,可能会造成某些服务器过于繁忙以至于无法处理新来的请求。而另一些服务器则过于空闲,整体系统的资源利用率低,并且当分布式集群中的某个服务器宕机,会直接导致某些服务请求无法处理 [4]

进一步的改进可以利用hash算法对服务请求与处理服务器之间的关系进行映射,以达到动态分配的目的。通过hash算法对服务请求进行转换,转换后的结果对服务器节点值进行取模运算,取模后的值就是服务请求对应的请求处理服务器。这种方法可以应对节点失效的情况,当某个分布式集群节点宕机,服务请求可以通过hash算法重新分配到其他可用的服务器上。避免了无法处理请求的状况出现 [4]

但这种方法的缺陷也很明显,如果服务器中保存有服务请求对应的数据,那么如果重新计算请求的hash值,会造成大量的请求被重定位到不同的服务器而造成请求所要使用的数据失效,这种情况在分布式系统中是非常糟糕的。一个设计良好的分布式系统应该具有良好的单调性,即服务器的添加与移除不会造成大量的哈希重定位,而一致性哈希恰好可以解决这个问题 [4]

一致性哈希算法将整个哈希值空间映射成一个虚拟的圆环,整个哈希空间的取值范围为0232-1。整个空间按顺时针方向组织。0232-1在零点中方向重合。接下来使用如下算法对服务请求进行映射,将服务请求使用哈希算法算出对应的hash值,然后根据hash值的位置沿圆环顺时针查找,第一台遇到的服务器就是所对应的处理请求服务器。当增加一台新的服务器,受影响的数据仅仅是新添加的服务器到其环空间中前一台的服务器(也就是顺着逆时针方向遇到的第一台服务器)之间的数据,其他都不会受到影响。综上所述,一致性哈希算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性 [4]

工作原理

一致性哈希算法是当前较主流的分布式哈希表协议之一,它对简单哈希算法进行了修正,解决了热点(hotPot)问题,它的原理分为两步 [5]

首先,对存储节点的哈希值进行计算,其将存储空间抽象为一个环,将存储节点配置到环上。环上所有的节点都有一个值。其次,对数据进行哈希计算,按顺时针方向将其映射到离其最近的节点上去。当有节点出现故障离线时,按照算法的映射方法,受影响的仅仅为环上故障节点开始逆时针方向至下一个节点之间区间的数据对象,而这些对象本身就是映射到故障节点之上的。当有节点增加时,比如,在节点A和B之间重新添加一个节点H,受影响的也仅仅是节点H逆时针遍历直到B之间的数据对象,将这些重新映射到H上即可,因此,当有节点出现变动时,不会使得整个存储空间上的数据都进行重新映射,解决了简单哈希算法增删节点,重新映射所有数据带来的效率低下的问题 [5]

一致性哈希算法作为分布式存储领域的一个重要算法,它基本解决了以P2P为代表的存储环境中一个关键的问题——如何在动态的网络拓扑中对数据进行分发和选择路由。在算法所构成的存储拓扑中,每个存储节点仅需维护少量相邻节点的信息,并且在节点加入/退出系统时,仅有相关的少量节点参与到拓扑的维护中,这使得一致性哈希算法成为一个具有实用意义的DHT(DistributedHashTable,分布式哈希表)算法。但是一致性哈希算法尚有不足之处。第一,在查询过程中,查询消息要经过O(n)步(n代表系统内的节点总数)才能到达被查询的节点。不难想象,当系统规模非常大时,节点数量可能超过百万,这样的查询效率显然难以满足使用的需要。第二,当应用一致性哈希算法的分布式存储系统中添加或者删除新的物理节点时,要将下一个节点与之相关的数据迁移过来,查询命中率和存储效率下降,影响系统的整体性能 [5]

与哈希算法的关系

一致性哈希算法是在哈希算法基础上提出的,在动态变化的分布式环境中,哈希算法应该满足的几个条件:平衡性、单调性和分散性 [4]

①平衡性是指hash的结果应该平均分配到各个节点,这样从算法上解决了负载均衡问题 [4]

②单调性是指在新增或者删减节点时,不影响系统正常运行 [4]

③分散性是指数据应该分散地存放在分布式集群中的各个节点(节点自己可以有备份),不必每个节点都存储所有的数据 [4]

优点

  • 可扩展性。一致性哈希算法保证了增加或减少服务器时,数据存储的改变最少,相比传统哈希算法大大节省了数据移动的开销 [2]

  • 更好地适应数据的快速增长。采用一致性哈希算法分布数据,当数据不断增长时,部分虚拟节点中可能包含很多数据、造成数据在虚拟节点上分布不均衡,此时可以将包含数据多的虚拟节点分裂,这种分裂仅仅是将原有的虚拟节点一分为二、不需要对全部的数据进行重新哈希和划分。虚拟节点分裂后,如果物理服务器的负载仍然不均衡,只需在服务器之间调整部分虚拟节点的存储分布。这样可以随数据的增长而动态的扩展物理服务器的数量,且代价远比传统哈希算法重新分布所有数据要小很多 [2]

应用

分布式存储系统HepyCloud是中科院高能所自主开发的一套海量数据存储系统,该系统采用key-value技术,实现海量数据的快速存储、定位和高可扩展性,支持EB级存储。系统提出统一布局的思想,对一致性哈希算法进行改进 [6]

HepyCloud系统采用改进的一致性哈希算法,实现数据的均匀分布和快速定位,在对哈希函数的选择时主要从以下两个方面考虑:(1)运行效率;(2)散列均匀。运行效率指所选择的哈希函数有较高的计算效率,实现数据的快速定位,达到很好的用户体验;散列均匀指所选的哈希函数具有很好的分布性,保证数据在存储设备上的均匀分布。Davies-Meyer算法是一种较好的选择。一方面高效的运行效率,保证了快速定位数据;另一方面均匀的散列分布性,确保了数据均匀分布。从实际使用看,将改进的一致性哈希和Davies-Meyer算法应用到HepyCloud系统中,实现数据在存储设备上的均匀分布。系统共有23个存储设备,存储容量186TB,14478054个文件,每个设备上的文件数约为629410(总文件数/设备数)。在数据定位方面,经测试和实际使用其表现与其他分布式文件系统相当,足以满足存储系统的性能要求 [6]

你可能感兴趣的:(一致性哈希)