5.1 Memcached基础知识
Memcached是开源的高性能分布式内存对象缓存系统
减轻数据库压力,避免大量的访问穿透到数据库时Memcached的主要用武之地。
提高了Web应用的速度,提高了扩展性。
著名文章 Scaling Memcached at Facebook 披露了在Facebook公司Memcached的规模、优化创新方案,非常值得一读。Facebook在Memcached上的内容已经超过28TB,总服务器台数超过800台。(Facebook在朋友关系更新、热点数据、缓存与MySQL一致性、多机房数据一致性等方面存在挑战)
5.1 Memcached基础知识
1. 安装过程
2.启动参数设置
3.Memcached的常用命令
比如:set qiang 0 0 4 good。 qiang代表设置的key;第一个0,代表flag,这里描述为不做序列化转换;第二个0,代表过期时间不失效;4代表value的长度;good,代表设置到Memcached的value。
5.1.2 Memcached 使用场景
主要用于减少数据库压力的场景。
如图5-1,第一次访问,缓存未命中,则层数据库获取数据并存储到Memcached,第二次直接从缓存获取数据。
如图5-2,应用服务器对key进行更新,先更新DB在更新缓存。
5.1.3 Memcached特征
最主要特征
- 协议简单
- 基于libevent的事件处理
- 内置内存存储方式
- 客户端分布式
协议简单:
Memcached和客户端通信并不使用复杂的XML等格式,而是使用简单的基于文本协议或者二进制协议(具体是怎样的呢?loading...)
基于libevent的事件处理:
由于epoll,kqueue,/dev/poll每个接口都有自己的特点,程序移植非常困难,libevent这个程序库就应运而生了。他将Linux的epoll、BSD类操作系统的kequeue等事件处理功能封装成统一的接口。Memcached使用libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。限于篇幅,只是简单介绍了事件处理,更多内容参考Dan Kegel的The C10K Problem。(loading...)
内置内存存储方式:
为了提升性能,Memcached中保存的数据都存储在Memcached内置的内存存储空间。数据仅存在内存,因此重启Memcached或者重启操作系统会导致全部数据消失。另外,内存容量到达指定的值后,Memcached会自动删除不使用的内存。缓存时间回收采用LRU算法(5.2详细介绍内存存储 5.3.1探讨具体的LRU策略)
Memcached客户端分布式:
Memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。每个Memcached实例不会相互通信共享信息。它的分布式主要通过客户端实现,如下图
service表示某分布式服务,该服务在需要Memcached做缓存服务时,会利用Memcached客户端来连接Memcached缓存服务器。Memcached客户端会通过一些路由算法选择具体到那台Memcached缓存服务器。也就是说分布式能力在客户端代码实现。
5.1.4 Memcached的一些问题
Memcached是简单的key-value的内存系统,设计和使用非常简单。在使用过程中也存在一些问题:
- 无法备份,重启无恢复
- 无法查询
- 没有内置的安全机制
- 单点故障
无法备份,重启无法回复:只能通过持久化解决。兼容Memcached的协议,持久化的解决方案有MemcachedDB,以及Tokyo Cabinet和Tokyo Tyrant配合使用。Tokyo Cabinet 是一个DBM数据库,而Tokyo Tyrant是兼容Memcached协议的网络协议。
无法查询:前面谈过Memcached的存储机制,不能按各种条件的key查询,比如范围查询。
没有提供内置的安全机制:可以自己找一些解决方案。链接
单点故障failover:Memcached不支持任何fail-over/high-availability机制,因为它是作为cache使用的,不是原始数据源,这也是其一大特点。面对单点故障,可以通过主从模式解决问题,如图:
应用服务器A通过客户端hash,进行双写操作,同时更新MC1(Master)、MC1'(slave)数据。而读数据的时候,先获取Master数据,当Master返回空,或者无法取到数据的时候,访问slave。
在这种模式下,涉及Master、Slave的2份数据一致性问题,则统一以Master为准。即如果有更新数据操作,需要从Master中获取数据,在对Master进行CAS更新。更新成功后,才更新Slave。如果CAS多次失败,则对Master、Slave进行Delete操作,后续请求穿透,从数据库获取数据,在写回缓存。
Memcached的高可用方案,除了上面提及的主从模式,亦有server端的proxy模式及Mcrouter路由模式,参见6.3节的内容介绍。