一致性哈希核心概要
解决扩容重置/数据迁移的问题
2的32次幂的环,是能处理的最大槽位, 如果只是正数那么最大槽位可能只有2的31次幂.
环的大小可以自己根据情况设置(因为如果你的值都比较小,可能没办法撑满所有的槽位),你要求的n槽位,可以均匀的分布到这个环上
对缓存,服务器的负载均衡都可以但是无法解决分库分表这种数据物理存储的问题,即数据/状态迁移不可避免,但是可以避免全量的重新映射
最小化重新映射
如果你的总槽位是K,你增加或删除一个槽位影响的1/K个数据的重新映射
当然如果你数据全部重新映射,一致性哈希也解决不了
实现:
首先hash函数可以把值映射到区间0-2的32次幂,即最多槽位是这个数
用户给定槽位数n
给定数据k
基于以上条件产生一个槽位z,如果匹配则返回,否则返回最近的槽位
核心点就在于如果找不到匹配的话会选择最近的:
实现方式:槽位环上的哈希值组成有序表,二分查找,O(n)
为了更均匀或者偏向某节点的方案
槽位加权重(多个虚拟节点映射到某个节点,也可以理解为权重大;权重调整会带来数据迁移工作)
增加虚拟节点(更均匀,负载差异更小;增加内存消耗和查找时间)
已知的实现方案:
ketama
热扩容方案:
数据备份,写多个节点
请求中继(代理), 数据没同步完成时,可以请求别的节点帮助处理
不均匀原因:
服务不均匀(手动/自动算法调整调整槽位点,虚拟节点)
数据不均匀(虚拟节点)
心得:
槽位节点计算和数据hash值计算可以不同,这样可以避免服务节点不均匀问题