文档介绍:分布式缓存
分布式缓存架构
分布式缓存指缓存部署在多个服务器组成的集群中,以集群方式提供缓存服务,其架构方式有两种,一种是以jboss cache为代表的需要更新同步的分布式缓存,一种是以Memcached为代表的不互相通信的分布式缓存。
Jboss cache
Memcached
Memcached曾经一度是网站分布式缓存的代名词。其简单的设计、优异的性能、互不通信的服务器集群、海量数据可伸缩的架构令网站架构师们趋之若鹜、兴奋不已。
简单的通信协议:远程通信设计需要考虑两方面的要素,一是通信协议,即选择tcp协议还是udp协议,抑或http协议;一是通信序列化协议,数据传输的两端,必须使用彼此可识别的数据序列化方式才能使通信得以完成,如xml、json等文本序列化协议,或者google protobuffer等二进制序列化协议。Memcached使用TCP协议(UDP也支持)通信,其序列化协议则是一套基于文本的自定义的协议,非常简单,以一个命令关键字开头,后面是一组命令操作数。如读取一个数据的命令协议是:get <key>。Memcached以后,许多NoSQL产品都借鉴了或直接支持这套协议,新浪的Memcachedb、阿里巴巴的分布式KV引擎Doris等。
丰富的客户端程序:Memcached通信协议简单,只要支持该协议的客户端都可以和Memcached服务器通信,因此Memcached发展出非常丰富的客户端程序,几乎支持所有主流的网站编程语言,Java、C/C++/C#、Perl、Python、PHP、Ruby等,因此在混合使用多种编程语言的网站,Memcached更是如鱼得水。
高性能的网络通信:Memcached服务端通信模块基于libevent,一个支持事件触发的网络通信程序库。Libevent的设计和实现有许多值得改善的地方,但是它在稳定的长连接方面的表现却正式Memcached需要的。
高效的内存管理:内存管理一个令人头痛的问题就是内存碎片管理。操作系统、虚拟机垃圾回收在这方面想了许多办法:压缩、拷贝等。Memcached使用了一个非常简单的办法——固定空间分配:Memcached将内存空间分为一组slab,每个slab里又包含一组chunk,同一个slab里的每个chunk的大小是固定的,拥有相同大小chunk的slab被组织在一起,叫做slab_class,如图。存储数据的时候根据数据的size大小,寻找一个最小满足需求的chunk将数据写入。这种内存管理方式避免了内存碎片管理的问题,内存的分配和释放都是以chunk为单位的。