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:
2.修改配置:
在ketama.h文件开头添加
。
将
修改为:
保存
3.编译:
输出以下信息:
4.查看命令帮助:
5.启动magent实例
测试流程
在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版本相关的错误摘要
出现了以下错误:
解决方法:
在ketama.h文件的开头添加
。
再次制作
出现了以下错误:
解决方法:
找到libs=/usr/lib64/libevent.a/usr/lib64/libm.a
并按以下格式修改:
libs=/usr/
例如:libs=/usr/lib/libevent.a/usr/lib64/libm.a
Save[/br
再次制作
出现了以下错误:
解决方法:
将
修改为:
保存
再次制作
输出:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)