一致性hash(Consistent Hashing)在添加节点和删除节点对整个hash环的影响是局部的,hash环广泛用于分布式存储和负载均衡,基本上的分布式存储和负载均衡都是使用的一致性hash。比如(Redis/Memcached/Ceph)。
一、一致性hash的基本原理
Hash环
把hash值的空间映射成一个环,环大小是2的32次方减1,是一个首尾相连的圆环
核心作用:节点和数据用同一套规则定位,节点增加或者减少时,尽量的少迁移数据
顺时针查找规则:从key的位置开始,延着顺时针方向,遇到的第一个节点,就是负责该key的节点
二、添加删除节点对Hash环的影响
添加节点
新节点被hash到环上的一个位置
新节点的数据是他与前一个环后一个环的数据之间的一小段区域的数据
添加节点影响范围
只有在这段区间的数据会迁移到新的节点
假如原先有N个节点,新增一个节点,那么有1/(n+1)的数据需要重新映射,这部分对应需要回源
删除节点
删除节点的那一段的hash会消失
这个节点对应的所有数据会重新顺时针迁移到下一个节点
删除节点的影响范围
只影响当前这个节点的所有数据
假如有n个节点,删除一个节点,那么有1/n的数据需要迁移
三、如何解决数据分布不均匀
解决数据分布不均匀,主要是引入虚拟节点,平衡负载
每个物理节点映射多个虚拟节点
添加和删除节点时,实际需要迁移的数据是多个虚拟节点负载的数据,数据迁移更均匀,单点波动更小
虚拟节点不会改变迁移比例,只会让迁移更平滑,负载更均衡