一致性哈希原理
1、出现的原因
首先,一致性哈希的出现是为了解决当服务器扩容或者收缩造成的数据大量迁移的问题。
我们需要知道,哈希算法是一种解决存储映射的方法,在分布式存储中,由于服务器上需要存储海量的数据资源,因而服务器不止一个,这个时候就需要在客户端登录后,借助哈希算法,找到当前客户端对应的服务器资源。
普通的哈希算法的映射方式借助如下的公式:
i
=
m
m
o
d
n
i = m \mod n
i=mmodn
其中,
i
i
i表示服务器编号,
m
m
m指的是存储对象,
n
n
n通常指的是服务器的数量。
通过上述的公式可以实现简单的对象映射。
但是当服务器的数量n发生改变的时候,同一个对象的映射位置会发生大规模的变化,也就是说,服务器扩容或者收缩,就需要对大量的服务器资源进行迁移变更以保证可以找到正确的映射存储。为了避免大量的数据迁移,出现了一致性哈希算法。
2、原理
相比于普通的哈希映射,一致性哈希的区别在于不再是对服务器的数量n取模,而是对一个固定值232取模(为什么是这个固定值,暂时还不清楚)
为了便于理解,通常从逻辑上想象为一个环形空间,无论是服务器还是待取模的对象,都对固定值取模,映射的方法不再是确定的值,而是按照顺时针排序,找到的第一个服务器就是对应的服务器,这样的方式保证当出现服务器扩容或者收缩的时候,只会有部分数据出现迁移,从而降低成本。
下面图片说明:
3、数据倾斜问题
显然,当服务器数量太少的时候,节点的映射会出现分布不均匀的问题,这对于应用场景中的分布式初衷背道而驰,因而采取虚拟节点的方式解决这一问题,简单来说,通过为物理节点(真实的服务器)设置虚拟节点(逻辑上的服务器)实现更为均匀的映射,如下图:
总结:通过结构的变化,使得原来固定位置的哈希映射转变为区域段对应的方式,从而减少服务器数量变化带来的大规模数据迁移问题。