图片摘自:算法
天天进步一点点——五分钟理解一致性哈希算法(consistent hashing)缓存
一:背景服务器
- 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的。分布式
- 设计目标是为了解决因特网中的热点(Hot spot)问题。函数
- 一致性哈希修正了使用的简单哈希算法带来的问题。性能
二:简单哈希算法带来的问题?spa
- 在简单哈希算法中.net
- 咱们会根据hash算法得出的数值和机器数取模计算,计算发到哪台机器上。设计
- Hash(资源)% 机器数 = 落到哪台机器上xml
- 这样的话就不会遍历全部的服务器,大大提高了性能!
- 可是,在服务器数量变更的时候,全部缓存的位置都要发生改变!
- 假设4台缓存中忽然有一台缓存服务器出现了故障,没法进行缓存。
- 那么咱们则须要将故障机器移除,可是若是移除了一台缓存服务器,那么缓存服务器数量从4台变为3。
- 若是想要访问资源,资源的缓存位置一定会发生改变,之前资源缓存也会失去缓存的做用与意义。
- 同时因为大量缓存在同一时间失效,形成了缓存的雪崩,服务端也会承受巨大压力。
三:一致性哈希(hash)解决的问题
- 解决增减服务器致使的大量数据震荡问题。
四:一致性哈希(hash)
- 原理
- 创造环形哈希(hash)空间,不一样节点映射到环上的不一样位置,经过和机器节点的匹配,完成hash一致。
- 作法
- 按照经常使用的hash算法来将对应的key哈希到一个具备2^32次方个桶的空间中,即0~(2^32)-1的数字空间中。 能够将这些数字头尾相连,想象成一个闭合的环形。
-
- 如今咱们将object一、object二、object三、object4四个对象经过特定的Hash函数计算出对应的key值,而后散列到Hash环上。
-
- 在采用一致性哈希算法的分布式集群中将新的机器加入。
- 其原理是经过使用与对象存储同样的Hash算法将机器也映射到环中,而后以顺时针的方向计算,将全部对象存储到离本身最近的机器中。
-
- 经过上图能够看出对象与机器处于同一哈希空间中,这样按顺时针转动object1存储到了节点1中
- object3存储到了节点2中
- object二、object4存储到了节点3中。
- 在这样的部署环境中,hash环是不会变动的,所以,经过算出对象的hash值就能快速的定位到对应的机器中,这样就能找到对象真正的存储位置了。
五:问题解答
- 如何解决单个节点压力过大的问题?
- 在 一致哈希算法中,提出了虚拟节点的概念,既一个机器能够经过 哈希 算法,映射至多个节点。以解决单个节点的压力问题