怎么搭建集群

怎么搭建集群,第1张

Magent搭建Memcached集群

Magent构建Memcached集群



Memcached集群简介


因为Memcached服务器之间没有通信,也没有数据复制和备份,所以当任何服务器节点出现故障时,都会出现单点故障。如果需要实现HA,就需要通过另一种方式来解决。


Magent缓存代理可以防止单点现象,缓存代理还可以做备份,通过客户端连接到缓存代理服务器,客户端连接到缓存连接服务器。缓存代理服务器可以连接到多个Memcached机器,并同步每个Memcached机器的数据。如果其中一个缓存服务器关闭,系统仍然可以工作。如果其中一台Memcached机器出现故障,数据不会丢失,并且可以保证数据的完整性。

构建Memcached集群


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

现有试验机:192.168.11.51/52/68

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

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

安装并启动memcached实例


详细步骤请参考之前的博文《Memcached1.4.22安装和配置》,分别开始下面的例子:

/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/ldconfig sed -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 11200 Trying 192.168.11.51... Connected to 192.168.11.51. Escape character is '^]'. stats memcached agent v0.4 matrix 1 -> 192.168.11.51:11211, pool size 0 matrix 2 -> 192.168.11.52:11211, pool size 0 END set key1 0 0 1 1 STORED set key2 0 0 2 22 STORED set key3 0 0 3 333 STORED set key4 0 0 4 4444 STORED set key5 0 0 5 55555 STORED quit Connection closed by foreign host.


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

[root@mongo01 ~]# telnet 192.168.11.51 11211 Trying 192.168.11.51... Connected to 192.168.11.51. Escape character is '^]'. get key1 END get key2 VALUE key2 0 2 22 END get key3 END get key4 VALUE key4 0 4 4444 END get key5 END quit Connection closed by foreign host.


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

[root@mongo02 ~]# telnet 192.168.11.52 11211 Trying 192.168.11.52... Connected to 192.168.11.52. Escape character is '^]'. get key1 VALUE key1 0 1 1 END get key2 END get key3 VALUE key3 0 3 333 END get key4 END get key5 VALUE key5 0 5 55555 END quit Connection closed by foreign host.


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

[root@szlnmp01 ~]# telnet 192.168.11.68 11211 Trying 192.168.11.68... Connected to 192.168.11.68. Escape character is '^]'. get key1 VALUE key1 0 1 1 END get key2 VALUE key2 0 2 22 END get key3 VALUE key3 0 3 333 END get key4 VALUE key4 0 4 4444 END get key5 VALUE key5 0 5 55555 END quit Connection closed by foreign host.


停止52的memcached进程,在51:

kill `cat /var/run/memcached/memcached.pid` [root@mongo01 magent]# telnet 192.168.11.51 11200 Trying 192.168.11.51... Connected to 192.168.11.51. Escape character is '^]'. get key1 VALUE key1 0 1 1 END get key2 VALUE key2 0 2 22 END get key3 VALUE key3 0 3 333 END get key4 VALUE key4 0 4 4444 END get key5 VALUE key5 0 5 55555 END quit Connection closed by foreign host.


恢复了52的memcached进程,在51:

[root@mongo01 ~]# telnet 192.168.11.51 11200 Trying 192.168.11.51... Connected to 192.168.11.51. Escape character is '^]'. get key1 END get key2 VALUE key2 0 2 22 END get key3 END get key4 VALUE key4 0 4 4444 END get key5 END quit Connection 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。

当然,也可以定期用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


再次制作


出现了以下错误:

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.a/usr/lib64/libm.a
例如:libs=/usr/lib/libevent.a/usr/lib64/libm.a
Save[/br


再次制作


出现了以下错误:

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)

保存


再次制作


输出:

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



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/783537.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-04
下一篇 2022-05-04

发表评论

登录后才能评论

评论列表(0条)

保存