一致性hash算法的理解

用hash作缓存,假若有三台服务器,1,2,3,有三万张图片,我想将图片平均缓存到我三台服务器上,一个服务器大概一万张,怎么去实现这个办法呢,能够用hash来取余数进行操做,加入咱们是以图片的名字做为key进行hash计算,hash (图片名称)%N 其中N为咱们服务器的个数,咱们将hash(图片名称)这一部分进行计算后获得的是一个正数,而后除以服务器的数目进行取余数,结果将会是0,1,2三个数,对应咱们的服务器的编号,当咱们做为客户端去请求图片的时候,图片已经进行过hash运算了,直接找到对应服务器的编号进行图片的访问,这样解决了我须要遍历全部的服务器进行查找。算法

clipboard.png

那若是我缓存的服务器的数量减小或者增长,若是仍是按照原来的算法走,一定会形成缓存数据的丢失,会去向后端的服务器去请求,若是有一台缓存服务器发生了故障,那我原来缓存的位置一定会发生改变,原来本该运算后要进行缓存到某一台服务器的图片,如今找不到对应缓存服务器,确定会发生缓存的雪崩后端

因此出现了一致性hash算法缓存

至关于将服务器和图片分别hash到个人hash环上进行就近缓存,hash环就是对2^32次方进行取模,从0开始一直到2^32,均匀分布在一个圆环(一个比方),0的顺时针方向的第一位为1,逆时针方向第一位为2^32,大概以下图:服务器

clipboard.png

具体就是比方我有三个服务器A,B ,C对其进行 hash (服务器Aip)%2^32 得出来的必定是一个整数,并且必定是在0--2^32之间,那么这个数就会分布在hash环上对应的位置,相同的B,C都同样,假设咱们hash事后ABC的位置以下图:spa

clipboard.png

而后咱们将须要缓存图片的key进行hash,它的hash值也会分布在个人hash环上,3d

clipboard.png

如上图,我hash到了A和C之间,图片的存储规则是顺时针方向的存储,因此应该存储到A,若是有四张的话以下图:blog

clipboard.png

那若是咱们的hash算法将服务器和hash的图片存放位置比较相近,相似于;图片

clipboard.png

全部的缓存都集中存储到了A一台,只有5到了B,那么这样A的压力就不言而喻,没有均匀可言了,辛亏hash环能够添加缓存服务器的虚拟节点,相似于虚拟机,一台实机能够虚拟多台,相似于这样:ip

clipboard.png

这样的话就会尽量的把缓存都均衡放在各个服务器get

一致性hash算法的优点在哪:

一个是当我有一台缓存节点挂了以后,缓存的存储不会受太大的影响,

clipboard.png

咱们将b节点拿走,原本要在B节点存储的3,由于找不到B服务器,而遵循规则缓存到C,而4的缓存节点不会发生改变,这就是一致hash的优势,若是发生服务器的增长或者减小只有部分的缓存会失效,不形成全盘皆输的可能

一致hash到此结束。。。。。。。。

本文做者:提利

阅读原文

本文为云栖社区原创内容,未经容许不得转载。

相关文章
相关标签/搜索