memcached(十一)magent实现高可用

可用性

  可用性是指系统一段时间内没故障的时间占比多少。比如说在1个小时里面,出现了故障系统出现5xx、4xx的http响应码。用了3分钟才修复问题。那么这1个小时内这个系统的可用性就是(60-3)/60=95%。

  系统可用性:(总时间-故障时间)/总时间 * 100%

memcached单点问题、memcached实现高可用

  memcached如何实现高可用性呢?

  其实跟mysql high available的概念差不多。在应用和memcached(mysql)之间增加代理。应用连接2个或者以上的代理。通过代理找到具体的数据节点(memcached/mysql)。

  下面是单点memcached,不使用代理的情况, 图:

  本来使用memcached可以拦截住很大一部分的请求。忽然之间memcached挂了的话,请求都丢到数据库中了:

  请求都丢到数据库中,数据库处理不过来。导致整个系统都卡顿,挂掉的情况。称呼为雪崩现象。如果这时候忽然之间恢复memcached(数据已经丢失了),大量的memcached都不存在请求想要的数据了。然后依然要访问数据库,系统稳定性照样有问题。

  为了避免memcached单点故障。使用代理的情况, 图:

  通过agent,可以避免单点memcached故障问题。而且还可以增加备份的memcached,其中一个点挂了,agent读取该点的时候有备份。下图是有备份的情况:

  

magent安装

  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
  -s参数是server 主机;
  -b参数是备机。
  -p参数是magent端口。
 
默认就是daemon进程的了。 可以增加-v 输出调试日志然后就变成不是守护进程。

注意事项

  1、引入magent,毕竟是增加了一层代理。请求memcached的性能会有所下降的。

  2、使用magent,有主备的情况。主挂了,magent会自动访问备份,备是有数据的。但是主恢复后,就会访问主,会变成没有数据的

数据复制

  使用magent的时候,主memcached挂了后,希望从备memcached恢复。 就涉及到数据复制功能了。

  然后,memcached本身不带有数据复制功能。有一个工具可以对1.2.x版本的mc进行数据复制:http://repcached.lab.klab.org/  。

  不过话说回来,考虑数据复制就建议使用redis了。。。

转载烦请说明出处: github weibo
新博客: hal123
原文地址:https://www.cnblogs.com/ELMND/p/4546262.html