一致性hash算法

场景:比如你有 N 个服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个服务器上呢,你很可能会采用类似下面的通用方法计算 object 的 hash 值,然后均匀的映射到到 N 个服务器 ;hash(object)%N(这里%是取余的意思)
一切都运行正常,然后我们再考虑如下的两种情况;
1、一个服务器(s), down 掉了(在实际应用中必须要考虑这种情况),这样所有映射到 s上的对象都会失效,怎么办,我们就需要把 s移除,这时候服务器的总数就变成了 N-1 台,映射公式变成了 hash(object)%(N-1) ;
2、由于访问加重,需要添加一个新的服务器 ,这时候服务器的总数就变成了 N+1 台,映射公式变成了 hash(object)%(N+1) ;
1 和 2 意味着什么?这意味着突然之间几乎所有的服务器都失效了。对于服务器而言,这是一场灾难,洪水般的访问都会直接冲向后台服务器;再来考虑第三个问题,由于硬件能力越来越强,你可能想让后面添加的节点多做点活,显然上面的 hash 算法也做不到
一致性hash算法通过一个叫作一致性hash环的数据结构实现。这个环的起点是0,终点是2^32 -1,并且起点与终点连接,环的中间的整数按逆时针分布,故这个环的整数分布范围是[0, 2^32-1],如下图所示:
在这里插入图片描述
解决方案:把服务器和对象全都映射到hash环中(),在hash环上顺时针查找距离这个对象的hash值最近的服务器,即是这个对象所属的服务器。例如:
我们想把有四个对像 object1—object4放到三个服务器上cacheA—cacheC,首先用hash函数计算出他们的hash值,在hash环中标记出来,如下图:
在这里插入图片描述
从图中我们可以很清楚的看出:object1属于cacheA;object2和object3属于cacheC;object4属于cacheB。
假设一台服务器比如说是cacheB,down掉了,那么新的从属关系如下图:
在这里插入图片描述
从中我们可以看出仅有object4的位置发生了改变。
假设新增一台服务器比如说是cacheD,那么新的从属关系如下图:
在这里插入图片描述
从中我们可以看出仅有object2的位置发生了改变。
上面的方法看起来很不错,但是新加入的机器其实并没有均匀的分担原来机器的负担。为了解决这个问题,虚拟节点就诞生了
在这里插入图片描述
我们假设每台机器都有三个虚拟节点(包括自身),那么新加入的缓存机器c4对应一组虚拟节点c41,c42,c43,加入到hash环后,影响的虚拟节点包括c31,c22,c11(顺时针查找到第一个节点),而这3个虚拟节点分别对应机器c3,c2,c1。即新加入的一台机器,同时影响到原有的3台机器。理想情况下,新加入的机器平等地分担了原有机器的负载,这正是虚拟节点带来的好处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值