zoukankan      html  css  js  c++  java
  • 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
Copyright © 2011-2022 走看看