大型网站技术架构,6网站的伸缩性架构之分布式缓存集群的伸缩性设计

和全部服务器都部署相同应用的应用服务器集群不一样,分布式缓存服务器集群中不一样的服务器中缓存的数据各不相同,缓存访问请求不能够在缓存服务器集群中的任意一台处理,必须先找到缓存有须要数据的服务器,而后才能访问。算法

 

这个特色制约了分布式缓存集群的伸缩性设计,由于新上线的缓存服务器没有缓存任何数据,而已下线的缓存服务器还缓存这网站的许多热点数据。数据库

 

必须让新上线的缓存服务器对整个分布式缓存集群影响最小,也就是说新加入的缓存服务器应使整个缓存服务器集群中已经缓存的数据尽量还被访问到,这是分布式缓存集群伸缩性设计的最主要目标缓存

 

6.3.1 Memcached分布式缓存集群的访问模型

 以Memcached为表明的分布式缓存,访问模型以下图所示:服务器

 

 

 应用程序经过Memcached客户端访问Memcached服务器集群,网络

Memcached客户端由一组API、Memcached服务器集群路由算法、Memcached服务器集群列表及通讯模块构成。数据结构

 

其中路由算法负责根据应用程序输入的缓存KEY计算获得应该将数据写入到Memcache的哪台服务器(写缓存)或者应该从哪台服务器读数据(读缓存)。架构

 

缓存写入流程:负载均衡

 

缓存读取流程:分布式

 

6.3.2 Memcached分布式缓存集群的伸缩性挑战

余数Hash:用服务器数据除以缓存数据Key的Hash值,余数为服务器列表下标编号。网站

因为HashCode具备随机性,所以使用余数Hash路由算法能够保证缓存数据在整个Memcached服务器集群中比较均衡地分布。

 

若是不考虑缓存服务器集群伸缩性,能够知足绝大多数地缓存路由需求。

可是,当分布式缓存集群须要扩容的时候,事情就变得棘手了。

 

扩容的时候,集群规模越大,不能命中的几率越高。当100台服务器的集群中加入一台新服务器,不能命中的几率使99%(N/(N+1))。

 

而网站业务中的大部分读操做是经过缓存获取的,数据库的负载能力是以有缓存为前提而设计的。当大部分被缓存的数据不能正确读取时,会致使数据库压力猛增,甚至宕机(而这个状况宕机,还没法经过简单的重启数据库解决,网站须要较长时间才能逐渐恢复正常,详见第13章。)

 

6.3.3 分布式缓存的一致性Hash算法

一致性Hash算法经过一个叫做一致性Hash环的数据结构实现KEY到缓存服务器的Hash映射,以下图所示:

 

 

 具体算法过程:

先构造一个长度为2^32的整数Hash环,根据节点名称的Hash值(其分布范围一样为0~2^32-1)将缓存服务器节点放置在这个Hash环上。

而后根据须要缓存的数据的KEY的Hash值取余2^32,获得0~2^32-1这个范围之间的一个整数值,而后在Hash环上顺时针查找距离这个KEY的hash值最近的缓存服务器节点。

 

当缓存服务器集群须要扩容的时候,只须要将新加入的节点名称(NODE3)的Hash值放入一致性Hash环中,因为KEY是顺时针查找距离其最近的节点,所以新加入的节点只影响整个环中的一小段。

 

具体应用中,这个长度为2^32的一致性Hash环一般使用二叉查找树实现,Hash查找过程其实是在二叉查找树中查找不小于查找数的最小数值。固然这个二叉查找树的最右边叶子节点和最左边的叶子节点相链接,构成环。

 

hash倾斜

上面的一致性Hash算法存在hash倾斜的问题,即当服务器节点在环中不均匀的位置上时,位置是倾斜的,服务器节点集中的较近,环的大部分圆弧上没有被映射到服务器节点。

这种状况大部分的缓存对象会落到其中某台服务器上,致使缓存分布不均匀。因为缓存较多的服务器压力较大,易发生故障,一旦宕机,失效的缓存太多,大部分缓存请求又会落到其下一个节点,极端状况会致使系统崩溃。

 

计算机的任何问题均可以经过增长一个虚拟层来解决。计算机网络的7层协议,每层均可以看做是下一层的虚拟层;计算机操做系统能够看做是计算机硬件的虚拟层;Java虚拟机能够看做是操做系统的虚拟层;分层的计算机软件架构事实上也是利用虚拟层的概念。

 

解决一致性Hash算法带来的负载不均的问题,也可使用虚拟层的手段:

将每台物理缓存服务器虚拟为一组虚拟缓存服务器,将虚拟服务器的hash值放置在hash环上,key在环上先找到虚拟服务器节点,再获得物理服务器的信息。

 

新加入物理服务器节点时,是将一组虚拟节点加入环中,若是虚拟节点的数目足够多,这组虚拟节点将会影响一样多数目的已经在环上存在的虚拟节点,这些已经存在的虚拟节点又对应不一样的物理节点。最终的结果是:新加入一台缓存服务器,将会较均匀地影响原来集群中已经存在的全部服务器,也就是说分摊原有缓存服务器集群中全部服务器地一小部分负载。

 

 

 每一个物理节点对应的虚拟节点越多,各个物理节点之间的负载越均衡,新加入服务器对原有的物理服务器的影响越保持一致。

实践中,一台物理服务器能够虚拟为150个虚拟服务器节点,固然根据集群规模和负载均衡的精度需求,这个值应该根据具体状况具体对待。

 

 总结

本节主要讲解了分布式缓存伸缩性设计利器:一致性Hash算法。必须对这个算法理解和掌握。

相关文章
相关标签/搜索