可用性是指系统一段时间内没故障的时间占比多少。比如说在1个小时里面,出现了故障系统出现5xx、4xx的http响应码。用了3分钟才修复问题。那么这1个小时内这个系统的可用性就是(60-3)/60=95%。
系统可用性:(总时间-故障时间)/总时间 * 100%
memcached如何实现高可用性呢?
其实跟mysql high available的概念差不多。在应用和memcached(mysql)之间增加代理。应用连接2个或者以上的代理。通过代理找到具体的数据节点(memcached/mysql)。
下面是单点memcached,不使用代理的情况, 图:
本来使用memcached可以拦截住很大一部分的请求。忽然之间memcached挂了的话,请求都丢到数据库中了:
请求都丢到数据库中,数据库处理不过来。导致整个系统都卡顿,挂掉的情况。称呼为雪崩现象。如果这时候忽然之间恢复memcached(数据已经丢失了),大量的memcached都不存在请求想要的数据了。然后依然要访问数据库,系统稳定性照样有问题。
为了避免memcached单点故障。使用代理的情况, 图:
通过agent,可以避免单点memcached故障问题。而且还可以增加备份的memcached,其中一个点挂了,agent读取该点的时候有备份。下图是有备份的情况:
magent是一个memcached的代理软件。应用请求magent,magent把memcached的请求转发到对应的memcached(也可以继续转发给magent)。
本来项目源码是托管在googleCode中的。目前google code已经关闭。我们需要先把magent导出到我们自己的github地址中去。
google code中的地址:https://code.google.com/p/memagent/
点击导出到 github。 按照提示输入内容。下面是我的地址:
https://github.com/emmerichLuang/memagent
在个人的github repository中, donwnload zip。解压缩。
执行make命令报错了?
root@Ebian:~/tools/magent/test# make gcc -Wall -O2 -g -c -o magent.o magent.c magent.c: In function ?.ritev_list?. magent.c:623:17: error: ?.SIZE_MAX?.undeclared (first use in this function) if (toSend > SSIZE_MAX || ^ magent.c:623:17: note: each undeclared identifier is reported only once for each function it appears in Makefile:14: recipe for target 'magent.o' failed make: *** [magent.o] Error 1
google得知,需要修改magent.c源码增加define(http://technicalsearch.iteye.com/blog/1698723)
#ifndef SSIZE_MAX # define SSIZE_MAX 32767 #endif
然后还是报错了:
root@Ebian:~/tools/magent/test# make gcc -Wall -O2 -g -c -o magent.o magent.c gcc -Wall -O2 -g -c -o ketama.o ketama.c gcc -Wall -O2 -g -o magent magent.o ketama.o -levent ketama.o: In function `create_ketama': /root/tools/magent/test/ketama.c:399: undefined reference to `floorf' collect2: error: ld returned 1 exit status Makefile:17: recipe for target 'magent' failed make: *** [magent] Error 1
继续google,得知缺少库(http://stackoverflow.com/questions/8671366/undefined-reference-to-pow-and-floor)
修改MakeFile脚本:
LIBS = -levent CFLAGS = -Wall -O2 -g -lm CC = gcc PROGS = magent all: $(PROGS) STPROG = magent.o ketama.o ketama.o: ketama.c ketama.h $(CC) $(CFLAGS) $(INCLUDE) -c -o $@ ketama.c magent.o: magent.c ketama.h $(CC) $(CFLAGS) $(INCLUDE) -c -o $@ magent.c magent: $(STPROG) $(CC) $(CFLAGS) -o $@ $^ $(LIBS) clean: rm -f *.o *~ $(PROGS) tags
make成功了。
root@Ebian:~/tools/magent/test# make gcc -Wall -O2 -g -lm -c -o magent.o magent.c gcc -Wall -O2 -g -lm -c -o ketama.o ketama.c gcc -Wall -O2 -g -lm -o magent magent.o ketama.o -levent root@Ebian:~/tools/magent/test# ls ketama.c ketama.h ketama.o magent magent-0.5.tar.gz magent.c magent.o Makefile
启动magent的方式:
./magent -p 11210 -s localhost:11211 -b localhost:11212
1、引入magent,毕竟是增加了一层代理。请求memcached的性能会有所下降的。
2、使用magent,有主备的情况。主挂了,magent会自动访问备份,备是有数据的。但是主恢复后,就会访问主,会变成没有数据的。
使用magent的时候,主memcached挂了后,希望从备memcached恢复。 就涉及到数据复制功能了。
然后,memcached本身不带有数据复制功能。有一个工具可以对1.2.x版本的mc进行数据复制:http://repcached.lab.klab.org/ 。
不过话说回来,考虑数据复制就建议使用redis了。。。