<分布式寻址>hash余数算法

简介:

<分布式寻址>系列博客主要介绍分布式系统中寻址的几种实现方式,就以分布式缓存举例。

正文:


在以前的博客中有介绍过memcached和redis两大缓存组件,在redis推出cluster之前,memcached和redis都不属于严格意义上的分布式组件,分布式的实现还是在客户端去做的,也就是客户端需要去开发负载均衡等功能。

分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。

所以如果想搭建一个分布式的缓存系统,必然要设计一种负载均衡方案以达到请求能分发到不同的服务器上。

那么最原始的做法是什么呢?

hash算法

最简单、常用的Hash算法。

hash(i) = i mod n


<分布式寻址>hash余数算法_第1张图片


如上图

借用阿里云社区的一个例子:

用hash做缓存,假如有三台服务器,1,2,3,有三万张图片,我想将图片平均缓存到我三台服务器上,一个服务器大概一万张,怎么去实现这个办法呢,可以用hash来取余数进行操作,加入我们是以图片的名字作为key进行hash计算,hash (图片名称)%N 其中N为我们服务器的个数,我们将hash(图片名称)这一部分进行计算后得到的是一个正数,然后除以服务器的数目进行取余数,结果将会是0,1,2三个数

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


总结

缺点:伸缩性差,使用余数Hash的路由算法,在扩容的时候会造成大量的数据无法正确命中(其实不仅仅是无法命中,那些大量的无法命中的数据还在原缓存中在被移除前占据着内存)。

解决方案:

(1)在网站访问量低谷,通常是深夜,技术团队加班,扩容、重启服务器

(2)通过模拟请求的方式逐渐预热缓存,使缓存服务器中的数据重新分布

所以出现了一致性hash算法,下篇博客介绍。

你可能感兴趣的:(<分布式寻址>hash余数算法)