一致性hash算法的核心思想是在解决分布式环境下hash表可能存在的动态扩容和缩容的问题。
为什么出现一致性hash算法
一般情况下,我们使用hash表的方式,以key-value的方式实现数据存储。然而当数据量比较大的情况下,我们会把数据存储到多个节点上,通过hash取模的方式来决定把当前的key存储到哪一个节点。这种方式有一个明显的问题就是,当存储的节点增加或者减少的时候,原本的映射关系就会发生变化,也就是需要对所有数据按照新的节点的数量来重新映射一遍,这导致了大量数据迁移和重新映射问题(代价大)。
一致性hash工作原理
一致性hash算法用来优化动态变化场景的一种算法,它的具体工作原理比较简单。首先一致性hash通过hash环的数据结构来实现的(起点是0终点是2的32次方-1),然后我们把数据存储节点的ip地址作为key进行hash之后,回落到hash环上的某一个位置,接下来把存储的目标key使用hash算法计算以后得到hash值同样会落到hash环的某个位置,这个目标key会按照顺时针的方向找到离自己最近的点进行存储
为什么一致性hash比普通hash算法好
假设现在需要新增一个节点node(或者删除一个节点),数据映射影响范围小,只有少部分的数据需要重新进行映射或者迁移。所以一致性hash算法的优点是扩展性强,在增加或者减少服务器时,数据迁移范围比较小,影响范围有限。此外,我们可以使用虚拟节点来防止hash倾斜导致数据分配不均匀。