学习思路
- 什么是hash环
- 对象怎么映射到hash环
- 服务器节点怎么映射到hash环
- 对象怎么映射到服务器节点
- 服务器节点新增、失效影响点分析
- 虚拟节点
一、什么是hash环
hash算法:通常的hash算法是将一个value映射到一个32位的数字,也就是对应0至2的32次方-1
hash环:就是从0到2的32次方-1首位相连,成为一个环状如下图
二、对象怎么映射到hash环
假设我们这里有4个value通过一定的hash算法得到具体的数字后,对应到hash环上
hash(object)=key,如下图
三、服务器节点怎么映射到hash环上
假设我们有3台机器通过和第二部一样的hash算法得到具体的数字后,对应的hash环上
hash(cache)=key;通常情况下技术key的cache一般是服务器的ip或者主机名(确保唯一)
四、对象怎么映射到服务器节点
我们第三步映射到hash环上的key怎么对应到第四步的key呢,即我们知道一个用户id怎么知道它在那个数据库上呢
我们参考第三部的图:
object按顺时针方向找到第一个cache,说明这个object就在这个cache上;(object和cache的hash算法是一样的)
那么根据上面的方法,对象 object1 将被存储到 cache A 上; object2 和 object3 对应到 cache C ; object4 对应到 cache B
五、服务器节点新增、失效影响点分析
1、服务器节点失效(服务宕机)
假设cacheB宕机,object4沿顺时针方向查找cache,会找到CacheC,影响的只有CacheB到CacheA之间的数据object4而已 ,其它数据均正常
2、服务节点新增(横向扩展服务)
假设我们新增CacheD服务器,object2沿顺时针方向查找cache时会找到cacheD而不是原来的cacheC,影响的只有CacheB到CacheD之间的数据object2而已,其它一切正常(如果是数据库,我们只需要将CacheC上的数据(CacheB到CacheD之间的数据)按照hash算法迁移到CacheD即可)
六、虚节点
如果服务器节点相对较少且在hash环上分布不均匀,加入上图只有CacheA和CacheC两个服务器节点,那么只有object1在CacheA上其它全部映射到了CacheC上,从而产生了数据分布不平衡,这并不是我们想看到的,从而产生了虚节点
我们还是假设只有AC两个服务器节点
现在分别衍生出两个虚节点,这样是不是就相对平衡了
这样访问服务器节点就相当于访问虚拟节点了(插入数据的时候先找到虚拟节点,在映射到真实的节点,数据入库相对平衡了)
公众号主要记录各种源码、面试题、微服务技术栈,帮忙关注一波,非常感谢