负载均衡策略之一致性哈希

前言

本文简单介绍一下一致性哈希相关知识。

一致性哈希

所谓的一致性哈希策略指的是根据后端节点的某个固定属性计算 hash 值,然后把所有节点计算出来的 hash 值组成一个 hash 圆环。 请求过来的时候根据请求的特征(比如,来源 ip 、cookie、用户名等特定信息)计算该特征的 hash 值(使用跟计算后端节点 hash 值相同的 hash 函数进行计算), 然后顺时针查找 hash 环上的 hash 值,第一个比请求特征的 hash 值大的 hash 值所对应的节点即为被选中的节点。

image

(图片来源出处: memcached全面剖析--4. memcached的分布式算法

改进

上面的 hash 圆环有一个问题就是节点的 hash 值不一定是均匀的分布在 hash 环上的,这样就会导致部分节点上承受太多的请求。

解决的办法也比较简单,然后就是引入虚拟节点:每个节点重复 n 次,把这些虚拟节点的 hash 值(跟实际节点的 hash 值不一样,也就是说需要在节点属性中加点东西保证每个虚拟节点跟实际节点的 hash 值不一样,互相之间也要不一样)也加入到 hash 环中以此来保证分布更均匀。

注意点

这里有一个需要注意的点那就是临界值的处理问题:可能会有部分请求处在 hash 环上最后一个点的后面,即 hash 环上找不到一个比请求特征的 hash 值更大的一个 hash。

对于这种无法在 hash 环上找到对应的下一个节点的情况,一般是把 hash 环上的第一个 hash 值作为被选中的点,即进行第二圈的顺时针查找。

总结

本文简单介绍了一下一致性哈希相关知识,更详细的信息请阅读参考资料。


Comments