对一致性hash算法的理解

来源:互联网 发布:知错改错不认错的人 编辑:程序博客网 时间:2024/05/21 09:54

首先说明其用途,目前主要用在分布式缓存中。

为什么使用一致性hash:

假设有N个缓存服务器,普通的缓存策略是hash(obj)%N,当其中一个服务器挂掉,或者服务器不够而需要添加服务器时,缓存策略需要改变成hash(onj)%(N-1)或(N+1),这也就意味着所有的缓存全部失效,那所有的访问都会到后台服务器,是不是想到了鹿晗和关晓彤,恐怖!程序员结婚还得中途暂停,去修复服务器。


所以就有了一致性hash,那一致性hash怎么就解决了上述的问题了呢?我们希望的是,当删除或者添加服务器节点时,尽量少的影响已经缓存的内容。如下图所示,想象出一个环,通过相同的hash算法,将服务器和缓存内容hash到环上的某一个位置,然后缓存内容只需顺时针找到离它最近的服务器进行缓存即可。这就是一致性hash。




那这么做有什么优点呢?刚才说一致性hash算法当删除或添加服务器时能够减少缓存失效的数量,还是如上图,当图中红色缓存内容对应的服务器挂掉后,只有它自己缓存失效,其他对象均没有影响。同理,增加服务器也只会影响到部分内容。


当然,这样做存在一定问题,就是在极端情况下,如下图所示,服务器“扎堆了”,所有缓存或者说很大一部分内容都被缓存到了同一台服务器上,这样的一致性hash跟普通hash还有什么区别!



然后就有了虚拟节点的概念,首先看下图,其中每种颜色对应两个服务器(当然,也可以有多个),其实他们都是某个真实的服务器虚拟出来的,我的理解是给某个服务器起了多个名字,这样它就能存在多个地方(当然不是真的存在,可以把虚拟节点想象成一个类似代理的东西,多个代理,最后缓存当然还是放在真实的服务器上),这样就比较均衡了。




以上。个人理解,有错误和不当之处,还请多多批评。围笑。

阅读全文
0 0
原创粉丝点击