3.分布式缓存架构
深圳网站建设分布式缓存指缓存部署在多个服务器组成的集群中,以集群方式提供缓存服务,其架构方式有两种,一种是以JBoss Cache为代表的需要更新同步的分布式缓存,一种是以Memcached为代表的不i相通信的分布式缓存。
JBoss Cache的分布式缓存在集群中所有服务器中保存相同的缓存数据,当某台服务器有缓存数据更新的时候,会通知集群中其他机器更新缓存数据或清除缓存数据,如图4.9所示。JBoss Cache通常将应用程序和缓存部署在同一台服务器上,应用程序可从本地快速获取缓存数据,但是这种方式带来的问题是缓存数据的数量受限于单一服务器的内存空间,而且当集群规模较大的时候,缓存更新信息需要同步到集群所有机器,其代价惊人。因而这种方案更多见于企业应用系统中,而很少在大型网站使用。
大型网站需要缓存的数据量一般都很庞大,可能会需要数TB的内存做缓存,这时候就需要另一种分布式缓存,如图4.10所示。Memcached采用一种集中式的缓存集群管理,也被称作互不通信的分布式架构方式。缓存与应用分离部署,缓存系统部署在一组专门的服务器上,应用程序通过一致性Hash等路由算法选择缓存服务器远程访问缓存数据,缓存服务器之间不通信,缓存集群的规模可以很容易地实现扩容,具有良好的可伸缩性。
Memcached的伸缩性设计参考本书第6章内容。
4. Memcached
Memcached曾一度是网站分布式缓存的代名词,被大量网站使用。其简单的设计、优异的性能、互不通信的服务器集群、海量数据可伸缩的架构令网站架构师们趋之若鹜。
简单的通信协议
远程通信设计需要考虑两方面的要素,一是通信协议,即选择TCP协议还是UDP协议,抑或HTTP协议;一是通信序列化协议,数据传输的两端,必须使用彼此可识别的数据序列化方式才能使通信得以完成,如XML、JSON等文本序列化协议,或者GoogleProtobuffer等二进制序列化协议。Memcached使用TCP协议(UDP也支持)通信,其序列化协议则是一套基于文本的自定义协议,非常简单,以一个命令关键字开头,后面是
一组命令操作数。例如读取一个数据的命令协议是get 。Memcached以后,许多NoSQL产品都借鉴了或直接支持这套协议。
丰富的客户端程序
Memcached通信协议非常简单,只要支持该协议的客户端都可以和Memcached服务器通信,因此Memcached发展出非常丰富的客户端程序,几乎支持所有主流的网站编程语言,Java、C/C++/C#、Perl、Python、PHP、Ruby等,因此在混合使用多种编程语言的网站,Memcached更是如鱼得水。
高性能的网络通信
Memcached服务端通信模块基于Libevem,一个支持事件触发的网络通信程序库。
互不通信的服务器集群架构
如上所述,正是这个特性使得Memcached从JBoss Cache、OSCache等众多分布式缓存产品中脱颖而出,满足网站对海量缓存数据的需求。而其客户端路由算法一致性Hash更成为数据存储伸缩性架构设计的经典范式(参考本书第6章)。事实上,正是集群内服务器互不通信使得集群可以做到几乎无限制的线性伸缩,这也正是目前流行的许多大数据技术的基本架构特点。
虽然近些年许多NoSQL产品层出不穷,在数据持久化、支持复杂数据结构、甚至性能方面有许多产品优于Memcached,但Memcached由于其简单、稳定、专注的特点,仍然在分布式缓存领域占据着重要地位。