来源:
https://blog.csdn.net/weixin_39094034/article/details/128264838
一致性哈希算法(consistent hashing) - 知乎 (zhihu.com)
背景:对于分布式存储,不同的机器上存储不同的数据,使用哈希函数建立数据到服务器之间的映射关系。
使用简单的哈希函数
Machine = hash(object) mod n,n为机器的数量
当增加或减少机器数量时,需要有大量的数据在机器间迁移,导致网络通信压力的剧增,严重情况,还可能导致数据库宕机。
一致性哈希
一致性哈希就是为了解决上述问题,它可以保证当机器的数量增加或减少时,节点之间的数据迁移只限于两个节点之间,不涉及其他节点,这样就不会造成全局的网络问题。
环形Hash空间
按照常用的hash算法将key哈希到[0,2^{32}-1]的数字空间中,将这些数字头尾相连,构成一个闭合的环形。
将数据通过hash映射到环上
例如将object1、object2、object3、object4通过特定的hash函数计算出对应的key值,散列到hash环上,
Hash(object1) = key1; Hash(object2) = key2; Hash(object3) = key3; Hash(object4) = key4;
同样地,将机器映射到环上
将数据存储到机器上
通过上图可以看出对象与机器处于同一哈希空间中,可以按照顺时针转动数据对象,将数据存储到对应的机器上
机器的添加与删除
-
添加新机器
向集群中添加新的机器c4,c4经过hash函数映射到c2、c3之间,根据顺时针存储规则,只需要属于本台机器的数据从另一台机器中迁移过来即可,其他的机器不会收到影响。
2. 删除一台机器
原理与添加机器基本一致
一致性哈希存在的问题
当集群中的节点数量较少时,可能会出现节点在哈希空间分布不平衡的问题,造成hash环的倾斜。极端情况下,某存储了大量数据的节点宕机,大量数据迁移导致下一个节点崩溃,逐步迁移导致整个集群宕机,称为雪崩效应。
解决办法:虚拟节点
思路就是,让集群中的节点尽可能的多,从而让节点尽量均匀地分布在哈希空间中。通过将现有的物理节点通过虚拟的方法复制多个出来,从而使哈希空间平衡