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的内存系统,设计和使用非常简单。在使用过程中也存在一些问题:

  1. 无法备份,重启无恢复
  2. 无法查询
  3. 没有内置的安全机制
  4. 单点故障

无法备份,重启无法回复:只能通过持久化解决。兼容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节的内容介绍。

 

posted @ 2020-04-18 19:56  vvf  阅读(162)  评论(0编辑  收藏  举报