一致性哈希

概念

维基:在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对 K/n个关键字重新映射,其中K是关键字的数量, n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位的几乎需要对所有关键字进行重新映射。

在解决分布式系统中负载均衡问题时可以使用哈希算法让固定的一部分请求落到同一台服务器上,每台服务器处理固定数量的请求(并维护请求)从而达到负载均衡的作用。

但是普通的余数hash(hash(比如用户id)%服务器机器数)算法伸缩性很差,当新增或者下线服务器机器时候,用户id与服务器的映射关系会大量失效。一致性hash则利用hash环对其进行了改进。

算法

具体算法过程为:先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将缓存服务器节点放置在这个Hash环上,然后根据需要缓存的数据的Key值计算得到其Hash值(其分布也为[0, 232-1]),然后在Hash环上顺时针查找距离这个Key值的Hash值最近的服务器节点,完成Key到服务器的映射查找。

HSF中一致性哈希的实现

选用红黑树实现的好处有3点:1、红黑树主要的作用是用于存储有序的数据,2、JDK里面提供了红黑树的代码实现TreeMap和TreeSet。3、TreeMap本身提供了一个tailMap(K fromKey)方法,支持从红黑树中查找比fromKey大的值的集合,但并不需要遍历整个数据结构。

使用红黑树,可以把查询复杂度保持在O(logN)。

存在问题

数据倾斜和雪崩

解决

增加虚拟节点

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