博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Magent搭建Memcached集群
阅读量:7188 次
发布时间:2019-06-29

本文共 6971 字,大约阅读时间需要 23 分钟。

Memcached集群介绍

由于Memcached服务器与服务器之间没有任何通讯,并且不进行任何数据复制备份,所以当任何服务器节点出现故障时,会出现单点故障,如果需要实现HA,则需要通过另外的方式来解决。

通过Magent缓存代理,防止单点现象,缓存代理也可以做备份,通过客户端连接到缓存代理服务器,缓存代理服务器连接缓存连接服务器,缓存代理服务器可以连接多台Memcached机器可以将每台Memcached机器进行数据同步。如果其中一台缓存服务器down机,系统依然可以继续工作,如果其中一台Memcached机器down掉,数据不会丢失并且可以保证数据的完整性。

 

搭建Memcached集群

Magent的架构方案已经在上一篇博文中有详细描述。现以如下图示例架构方案说明Magent如何搭建Memcached集群,而在生产环境需要根据自身业务特点设计健壮的架构方案。

 

 

现有测试机:192.168.11.51/52/68

先在三台测试机上安装好libevent和memcached,启动memcached实例;

然后在51和52上安装好magent,启动magent实例。

 

安装和启动memcached实例

详细步骤,请参见之前的博文,分别启动如下实例:

/usr/local/bin/memcached -d -m 256 -u memcached -l 192.168.11.51 -p 11211 -c 1024 -P /var/run/memcached/memcached.pid/usr/local/bin/memcached -d -m 256 -u memcached -l 192.168.11.52 -p 11211 -c 1024 -P /var/run/memcached/memcached.pid/usr/local/bin/memcached -d -m 256 -u memcached -l 192.168.11.68 -p 11211 -c 1024 -P /var/run/memcached/memcached.pid

 

安装和启动magent实例

笔者在测试magent-0.6.tar.gz时,该版本在与最新版memcached运行下不够稳定,如下配置以magent-0.5.tar.gz为示例。

1. 安装magent到/usr/local下:   

cd /usr/local    mkdir magent    cd magent    wget http://memagent.googlecode.com/files/magent-0.5.tar.gz    (若无法直接访问,可先下载安装包后上传到服务器上)    tar zxvf magent-0.5.tar.gz

2. 修改配置:   

在ketama.h文件开头添加    

#ifndef SSIZE_MAX    #define SSIZE_MAX 32767    #endif

 

ln -s /usr/lib64/libm.so /usr/lib64/libm.a/sbin/ldconfigsed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile    vi Makefile

 

将    

CFLAGS = -Wall -O2 -g

修改为:    

CFLAGS = -lrt -Wall -O2 -g

保存

3. 编译:   

make

   

输出如下信息:    

gcc -lrt -Wall -O2 -g -c -o magent.o magent.c    gcc -lrt -Wall -O2 -g -c -o ketama.o ketama.c    gcc -lrt -Wall -O2 -g -o magent magent.o ketama.o -levent –lm

4. 查看命令帮助:   

./magent –h

   

memcached agent v0.4 Build-Date: Apr 21 2015 09:21:10    Usage:    -h this message    -u uid    -g gid    -p port, default is 11211. (0 to disable tcp support)    -s ip:port, set memcached server ip and port    -b ip:port, set backup memcached server ip and port    -l ip, local bind ip address, default is 0.0.0.0    -n number, set max connections, default is 4096    -D don't go to background    -k use ketama key allocation algorithm    -f file, unix socket path to listen on. default is off    -i number, set max keep alive connections for one memcached server, default is 20    -v verbose

5. 启动magent实例   

/usr/local/magent/magent -u root -n 4096 -l 192.168.11.51 -p 11200 -s 192.168.11.51:11211 -s 192.168.11.52:11211 -b 192.168.11.68:11211    /usr/local/magent/magent -u root -n 4096 -l 192.168.11.52 -p 11200 -s 192.168.11.51:11211 -s 192.168.11.52:11211 -b 192.168.11.68:11211

 

测试流程

登录51上的magent,存储key1到key5:

[root@mongo01 ~]# telnet 192.168.11.51 11200Trying 192.168.11.51...Connected to 192.168.11.51.Escape character is '^]'.statsmemcached agent v0.4matrix 1 -> 192.168.11.51:11211, pool size 0matrix 2 -> 192.168.11.52:11211, pool size 0ENDset key1 0 0 11STOREDset key2 0 0 222STOREDset key3 0 0 3333STOREDset key4 0 0 44444STOREDset key5 0 0 555555STOREDquitConnection closed by foreign host.

登录到51上的memcached,获取到了key2和key4:

[root@mongo01 ~]# telnet 192.168.11.51 11211Trying 192.168.11.51...Connected to 192.168.11.51.Escape character is '^]'.get key1ENDget key2VALUE key2 0 222ENDget key3ENDget key4VALUE key4 0 44444ENDget key5ENDquitConnection closed by foreign host.

登录到52上的memcached,获取到了key1、key3和key5:

[root@mongo02 ~]# telnet 192.168.11.52 11211Trying 192.168.11.52...Connected to 192.168.11.52.Escape character is '^]'.get key1VALUE key1 0 11ENDget key2ENDget key3VALUE key3 0 3333ENDget key4ENDget key5VALUE key5 0 555555ENDquitConnection closed by foreign host.

登录到68上的memcached,获取到了key1到key5:

[root@szlnmp01 ~]# telnet 192.168.11.68 11211Trying 192.168.11.68...Connected to 192.168.11.68.Escape character is '^]'.get key1VALUE key1 0 11ENDget key2VALUE key2 0 222ENDget key3VALUE key3 0 3333ENDget key4VALUE key4 0 44444ENDget key5VALUE key5 0 555555ENDquitConnection closed by foreign host.

停掉52的memcached进程,通过51上的magent获取到了key1到key5:

kill `cat /var/run/memcached/memcached.pid`
[root@mongo01 magent]# telnet 192.168.11.51 11200Trying 192.168.11.51...Connected to 192.168.11.51.Escape character is '^]'.get key1VALUE key1 0 11ENDget key2VALUE key2 0 222ENDget key3VALUE key3 0 3333ENDget key4VALUE key4 0 44444ENDget key5VALUE key5 0 555555ENDquitConnection closed by foreign host.

恢复52的memcached进程,通过51上的magent,只获取到了key2和key4:

[root@mongo01 ~]# telnet 192.168.11.51 11200Trying 192.168.11.51...Connected to 192.168.11.51.Escape character is '^]'.get key1ENDget key2VALUE key2 0 222ENDget key3ENDget key4VALUE key4 0 44444ENDget key5ENDquitConnection closed by foreign host.

通过以上测试可以得出结论:

1. 通过magent的连接池存放的值会分别存在magent代理的所有memcached上去。

2. 如果有一个memcached宕机通过magent代理方式还能取到值。

3. 如果memcached修复重启后通过magent代理方式取到的值就会为Null,这是由于memcache重启后里边的值随着memcache服务的停止就消失了(因为在内存中),但是magent是通过key进行哈希计算分配到某台机器上的,memcache重启后会还从这台机器上取值,所有取到的值就为空。

解决办法:

1. 在每次memcache宕机修复后可以写一个程序把集群中的其他memcache的所有信息全给拷贝到当前宕机修复后的memcache中。

2. 自己写代理,当从一个memcached服务上取到的值为Null时再去其他memcached上取值。

注意事项:

magent的调用方式同memcached一样,客户端可以不用改代码即可实现切换到magent模式下。

 

缓存与DB的同步

比较保险的做法是:查询的时候从缓存中取,add、updae、delete的时候同时操作缓存与DB。

当然你也可以定时同步缓存与DB的数据,不同的业务应该有不同的选择。

 

magent-0.6版本相关的错误汇总

产生如下错误:   

gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o magent.o magent.c    magent.c: In function ‘writev_list’:    magent.c:729: error: ‘SSIZE_MAX’ undeclared (first use in this function)    magent.c:729: error: (Each undeclared identifier is reported only once    magent.c:729: error: for each function it appears in.)    make: *** [magent.o] Error 1

   

解决方法:    

在ketama.h文件开头添加    

#ifndef SSIZE_MAX    #define SSIZE_MAX 32767    #endif

 

再次make    

产生如下错误:    

gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o magent.o magent.c    gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o ketama.o ketama.c    gcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o     usr/lib64/libevent.a /usr/lib64/libm.a     gcc: /usr/lib64/libevent.a: No such file or directory    gcc: /usr/lib64/libm.a: No such file or directory    make: *** [magent] Error 1

解决方法:    

ln -s /usr/lib64/libm.so /usr/lib64/libm.a    vi Makefile

找到LIBS = /usr/lib64/libevent.a /usr/lib64/libm.a    
按照如下格式修改:    
LIBS = /usr/<libevent的安装路径>/libevent.a /usr/lib64/libm.a    
如:LIBS = /usr/lib/libevent.a /usr/lib64/libm.a    
保存    

再次make    

产生如下错误:    

gcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib/libevent.a /usr/lib64/libm.a     /usr/lib/libevent.a(event.o): In function `gettime':    /tmp/libevent-2.0.22-stable/event.c:370: undefined reference to `clock_gettime'    /usr/lib/libevent.a(event.o): In function `detect_monotonic':    /tmp/libevent-2.0.22-stable/event.c:340: undefined reference to `clock_gettime'    collect2: ld returned 1 exit status    make: *** [magent] Error 1

解决方法:    

vi Makefile

将    

CFLAGS = -Wall -g -O2 -I/usr/local/include $(M64)

修改为:    

CFLAGS = -lrt -Wall -g -O2 -I/usr/local/include $(M64)

保存    

再次make    

输出为:    

gcc -lrt -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib/libevent.a /usr/lib64/libm.a

本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1636374 ,如需转载请自行联系原作者
你可能感兴趣的文章
C++ map下标访问的问题
查看>>
go filepath Abs
查看>>
透视JVM之垃圾回收
查看>>
【MySQL】replace into
查看>>
jxl 操作模板,自适应高度HssfCellStyle 自适应。
查看>>
从SharePoint当前状态看企业未来发展
查看>>
css02
查看>>
Hot Standby 与 Stream Replication
查看>>
【ZZ已解决】Python中如何在嵌套函数内部访问被嵌套(的父级函数)中的(局部,非全局)变量...
查看>>
一款jQuery满屏自适应焦点图切换特效
查看>>
python技能(2)-sys.argv
查看>>
NFS 安装问题解决
查看>>
对 Sea.js 进行配置 seajs.config
查看>>
我几次求职经验谈--智联相伴
查看>>
PHP中文乱码问题总结[转]
查看>>
IPv6系列-入门指南
查看>>
spring学习笔记(二)
查看>>
DNS智能解析的另类使用 让搜索引擎更快更好的收录您的网站
查看>>
转:java操作文件
查看>>
工具系列——eslint的使用
查看>>