mysql分布式缓存与memcached
请尊重知识,请尊重原创 更多资料参考请见 http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
memcached 作为一个流行度不亚于MySQL的缓存工具,简单的协议,清晰的API接口,卓越的性能使其深受广大开发者的喜爱。
但是memcached通常仅仅被作为最简单的cache工具使用。在这里介绍如何把他做成更为高效理想的数据服务层。
首先先说明把memcached仅仅作为缓存工具的浪费与不好的地方。
memcached吧数据都存放在内存中,效率十分高效。如果把他和数据库系统距离拉得这么开的话简直是浪费。仅仅作为cache工具的话,从代码开发和维护的角度
来说会产生大量的编码工作和配置文件,对后期的维护开发不利。
我们可以将memcached与我们的数据库整合成一个整体,或者作为数据库的一个缓冲。
一般来说,我们有两种方式将memcached和mysql数据库整合成一个整体对外提供数据服务。一种是直接利用memcached的内存容量作为MySQL的二级缓存,
提升MySQL的缓存大小,另一种是通过mysql的UDF来和memcached进行通信,维护和更新memcached中的数据,应用直接通过memcached来读取数据。
对于第一种方式,主要用于业务要求非常特殊,实在难以进行数据切分,而且有很难通过对应用程序进行改造利用上数据库之外的Cache 的场景。
当然,在正常情况下是肯定无法做到这一点的,之少目前必须借助外界的力量,开源项目Waffle Grid 就是我们需要借助的外部力量。
Waffle Grid 这个开源项目,利用MySQL 和Memcached双双开源的特性,结合Memcached 通信协议简单的特点,将Memcached 成功实现成为MySQL 主机的外部
“二级缓存”,目前仅支持用于Innodb 的Buffer Pool。Waffle Grid 的实现原理其实并不复杂,他所做的事情就是当Innodb 在本地的
Buffer Pool(我们姑且称其为Local Buffer Pool 吧)的时候,在从磁盘数据文件读取数据之前,先通过Memcached 的通信API 接口尝试从Memcached
中读取相应的缓存数据(我们称之为Remote Buffer 吧),只有在Remote Buffer 中也不存在需要的数据的时候,Innodb 才会访问磁盘文件来读取数据。
而且,只有处于Innodb Buffer pool 中的LRUList 中的数据会被发送到Remote Buffer Pool 中,而这些数据一旦被修改,就会Innodb
就会将之移入FLUSH List ,Waffle Grid 同时会将进入FLUSH List 的数据从RemoteBuffer Pool 中清除掉。所以可以说,Remote Buffer Pool 中永远不会存在Dirty Pages,
这也保证了当Remote Buffer Pool 出现故障的时候不会产生数据丢失的问题。
下面我们再来介绍一下Memcached 和MySQL 的另外一种整合方式,也就是通过MySQL所提供的UDF 功能,自行编写相应的程序来实现MySQL 与Memcached 的数据通信更新操
作。这种方式和Waffle Grid 不一样的是Memcached 中的数据并不完全由MySQL 来控制维护,而是由应用程序和MySQL 一起来维护数据。每次应用程序从Memcached
读取数据的时候,如果发现找不到自己需要的数据,则再转为从数据库中读取数据,然后将读取到的数据写入Memcached 中。而MySQL 则控制Memcached 中数据的失效清理工作,每次数据库
中有数据被更新或者被删除的时候,MySQL 则通过用户自行编写的UDF 来调用Memcached的API 来通知Memcached 某些数据已经失效并删除该数据。
请尊重知识,请尊重原创 更多资料参考请见 http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1