一致性哈希(散列函数深入理解)

分布式负载均衡问题

在分布式系统中,负载均衡是个经典问题了。
分布式系统的意思是,用好多台服务器来同时提供服务,那么他们之间工作量应该尽量平均,如果某台工作量特大,其余没事干,那和不用分布式有什么区别?因此,负载均衡就是让分布式中各个服务器之间的工作量均衡的意思。
在负载均衡的解决方法中,散列函数起到了关键作用。

原始散列函数解决负载均衡

散列函数的性质,就是均匀分布在原始散列区间。然后,通过取余操作,再均匀分布到分布式集群的区间内,这样,每台服务器就能实现负载均衡了。比如,有10台服务器,数据传过来时,先经过散列函数计算,计算结果再%10,就能平均映射到10太服务器上。
原始散列函数分流的问题
上面的分布式系统,有一个问题,那就是,扩充时太麻烦了,比如,服务高峰期,需要把服务器从10台扩充到100台,那么,此时扩容代价就很高了,相当于之前10台服务器中保存的数据,需要全部重新分配到100台。

一致性哈希解决负载均衡

从上面利用散列函数的例子中,可以看出,散列函数第一次计算后的结果区间,往往是非常大的,所以上面的例子以及一般的散列表,都是需要在原始散列区间的基础上,再利用取余操作,将结果区间再均匀映射到更小的区间。
那么,一致性哈希的思想就是,不进行第二次映射。我们就使用第一次映射的区间。
1.首先,将原始的散列函数映射区间,可以理解为一个环,首尾相接。
2.将服务器的某个属性,比如IP,或者MAC地址等等,用散列函数计算,映射到原始散列区间上某个位置。
3.然后,服务器映射的几个点,其实就把原始散列区间划分成几段,一致性哈希规定,区间内小于等于某个服务器结点的映射结果,就划分给大于等于它的那个服务器。
4.因此,当再次需要扩充服务器时,只需要将新的服务器,映射到区间内,然后,只需要将重叠部分的服务复制到新服务器上就搞定了,就不需要把所有数据重新分配了,只需要动局部就行。
一致性哈希的缺点
散列函数能够均匀分布在散列区间内的前提是,数据量足够大,如果数据量太小,是不能保证均匀分布的,这就导致的问题是:
1.服务器的数量往往没那么多,因此,不管是用服务器IP还是什么来计算散列函数,往往不能平均分。比如,三台服务器,计算后的位置,往往不是三分之一。
2.就算用某些手段,能够让服务器的位置平均分,那么,再添加服务器的时候呢?比如,原来三台服务器,每台三分之一,再来一台,无论映射到哪里,都不可能平分四份,因此,肯定负载不均衡了。
解决措施:虚拟节点技术
比如,真实服务器就三台,然后,利用虚拟节点技术,给每台服务器虚拟出1000个节点,总共虚拟出3000个节点,这3000不重复就行。然后,用一张路由表记录每台服务器对应的1000个虚拟节点。
然后,用虚拟节点经过散列函数后,映射到环上,然后,用虚拟节点的结果映射到真实的服务器上。相当于,查询数据时,第一步,查询出小于等于某个虚拟节点,第二步,查找路由表中该虚拟节点对应的服务器,然后由服务器解决。
总结一下,相当于,之前出现问题的原因就是服务器数量太少,导致散列后无法均匀分布,现在虚拟出足够数量的虚拟节点后,数据量就上来了,这些虚拟节点肯定能均匀分布了,然后再映射到真实服务器上就行了。
如果新添加一台服务器的话,仍然可以再给它配置1000个虚拟节点,然后通过散列函数将虚拟节点映射到环上。然后将之前重叠部分复制到新服务器就行了,仍然不需要全部重新分配,并且还能保证负载均衡。
因此,一致性哈希加上虚拟节点技术,就能完全解决这个问题。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值