author:魏静崎
2025年8月3日
一致性哈希学习
状态服务负载均衡
直接Hash
输入一致,输出也一致,数据和每个节点有明确的映射关系。
存在的问题
1、如果输入的数据不均衡,那么负载就不均衡。
2、对于有状态服务,每个服务存储着部分不同的当前数据。如果服务进行扩缩容,其总数改变,相同的输入不会再进入相同的端点中,会出现问题,需要进行数据迁移。
带权分治
基于每个节点可能性能不同,每个节点有不同的权重,此时的Hash值的sum使用的是权重值的累加。
数据迁移
使用前面的两个方法,因为会涉及到所有的存量节点,数据迁移过程中服务应该暂时停止,否则可能出现问题。
一致性哈希
哈希环
哈希环是一个首尾相接的环,起点位置的数值为0,终点为2^32,与0重合,环上每个刻度对应一个值。
节点入环
每个节点都需要在哈希环中找到属于自己的位置。入环的方式是,针对于节点的标识键index取hash值,然后对该值取模2^32,得到的结果就是对应的位置。
数据出环or入环
在读写数据时,核心是要找到所归属的index:
对数据的key取hash,然后取模找到环上对应的位置。
从当前位置开始顺时针找到第一个节点作为数据的归属节点。
数据迁移
新增节点场景
新节点C哈希到对应的位置indexC,找到新节点在环中后面的一个节点B,以及前一个节点A,检索B中的数据,将属于(A, C)的这部分数据迁移到C点即可。
删除节点场景
同理,删除节点C也是找到indexC和A、B的位置,将C中的数据迁移到B中,然后移除C即可。
存在的问题
节点的数量不够多时,节点离散的不够平均,负载难以均衡。
我们可以抽象出一些虚拟节点,其是真实节点进入哈希环时使用的一系列代理节点,每个真实节点对应多个虚拟节点,入环时使用对应的虚拟节点。
- 本文作者: 魏静崎
- 本文链接: https://slightwjq.github.io/2025/08/03/一致性哈希/
- 版权声明: 该文章来源及最终解释权归作者所有