一致性哈希算法
2017-02-17 本文已影响154人
数齐
一致性哈希算法是分布式系统中常用的算法。比如,一个分布式的存储系统,要将数据存储到具体的节点上,如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是数据的key,N是机器节点数,如果有一个机器加入或退出这个集群,则所有的数据映射都无效了,这显然不是一个最优的算法。一致性哈希算法可以将这种影响降到最小。算法设计:
- 按照常用的hash算法来将对应的key哈希到一个具有232次方个桶的空间中,即0~(232)-1的数字空间中。现在我们可以将这些数字头尾相连,想象成一个闭合的环形。
- 利用hash函数将key算出hash值,对应到换上的某个位置,然后顺时针找到第一个机器节点,就是将数据存储到这个节点上。
- 如果B点宕机了,K1,K2数据会存储到机器节点C上,影响了一台节点C的数据,不会影响A,D,通过这种算法可以将增加删除节点的影响降低到最小。
- 但是这也有一个风险:比如说B点宕机了,原来存储在B点的数据都会请求到C点,造成C节点负载变高,C节点也容易宕机,这样依次下去,这样造成整个集群都挂了,造成雪崩。
- 为了解决这个问题,我们引入了虚拟节点,即把想象在这个环上有很多“虚拟节点”,数据的存储是沿着环的顺时针方向找一个虚拟节点,每个虚拟节点都会关联到一个真实节点,通过虚拟节点的引入,对象的分布就比较均衡了,因此不会造成“雪崩”现象。
首先利用数据的hash值定位到虚拟节点,再找到物理节点进行存储。
参考文章: