由于Memcached服务器与服务器之间没有任何通讯,并且不进行任何数据复制备份,所以当任何服务器节点出现故障时,会出现单点故障,如果需要实现高可用性,则需要通过另外的方式来解决,这就涉及到故障转移技术。所谓的故障转移,实在Memcached多节点—集群—工作环境中,面对单点故障时(比如单个节点上的数据库服务器宕机),如何进行将损失降到最低,保证缓存的正常工作?
目前比较常用的单点故障解决方案有2种:本地备份缓存和采用缓存代理服务器。本地备份缓存,是在本地放一份缓存,同时也在分布式Memcached上放一份缓存,如果当其中一台节点宕机了,客户端程序直接读取本地的缓存,本地客户端维护一个HashMap即可,这样的方案虽然很简陋,但是可以满足一部分场景的需要,当很急需的时候可以作为临时方案暂时替代一下。
采用缓存代理服务器(比如Magent,可以做多主或多从)以及Repcached来进行故障失效转移,这一节先介绍采用Magent缓存代理防止单点现象。缓存代理也可以做备份,通过客户端连接到缓存代理服务器,缓存代理服务器连接缓存服务器,缓存代理服务器可以连接多台Memcached机器可以将每台Memcached机器进行数据同步。这样的架构比较完善了,如果其中一台缓存代理服务器DOWN机,系统依然可以继续工作,如果其中一台Memcached机器DOWN掉,数据不会丢失并且可以保证数据的完整性。
在客户端还是配置多台服务器,但是让其中任意的一台服务器做备份,去读取并append另外几台服务器的数据,这样依赖,该台备份服务器上就始终存储了一份完整的数据。当发生意外情况的时候,直接读取备份服务器上的数据。等服务器故障恢复后,再从客户端,将数据合理的分发出去。
下面就Magent工具进行单点故障的失效转移进行测试。
1.Magent下载
Magent是一款开源的Memcached代理服务器软件,其项目网址为:http://code.google.com/p/memagent/,也可以使用以下方式下载:
[root@zengxiangtao~]# cd/home [root@zengxiangtao home]# mkdir magent [root@zengxiangtao home]# cd magent [root@zengxiangtao home]# wget http://memagent.googlecode.com/files/magent-0.6.tar.gz
2.Magent解压配置
[root@zengxiangtao magent]# tar zxvf magent-0.6.tar.gz [root@zengxiangtao magent]# /sbin/ldconfig [root@zengxiangtao magent]# sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
4.Magent安装
[root@zengxiangtao magent]# make
解决方法是在ketama.h中添加如下红框部分的内容:
[root@zengxiangtao magent]# vi ketama.h
再次执行安装Magent出现错误“没有那个文件或目录”:
[root@zengxiangtao magent]# make
再次执行安装Magent出现错误“没有那个文件或目录”:
[root@zengxiangtao magent]# make
解决方法:如果是64bit的系统则不会在/usr/lib64/libm.a生成,如果是32bit即会有,所以,在64位机器中,还必须:
[root@zengxiangtao magent]# ln-s/usr/lib64/libm.so/usr/lib64/libm.a
[root@zengxiangtao magent]# make
解决办法是将Makefile文件中CFLAGS = -Wall -g -O2 -I/usr/local/include $(M64)改为:CFLAGS = -lrt -Wall -g -O2 -I/usr/local/include $(M64)。
[root@zengxiangtao magent]# vim Makefile
[root@zengxiangtao magent]# make
[root@zengxiangtao magent]# cp magent/usr/bin/magent
至此,Magent安装完毕,附带说明一下Magent的优劣势:
* 不足之处:当前Magent的运行速率只有memcached的80%,需要改进;
* 优势:增加后台的备份服务器不会影响到magent的性能,它的CPU使用量低于memcached,并且只需要非常小的内存即可以运行。
Magent支持Memcached的命令有:get、gets、delete、incr、decr、add、set、replace、prepend、append、cas,Magent本身的命令参数如下: