Magent搭建Memcached集群
原文地址:http://ultrasql.blog.51cto.com/9591438/1636374
Memcached集群介绍
由于Memcached服务器与服务器之间没有任何通讯,并且不进行任何数据复制备份,所以当任何服务器节点出现故障时,会出现单点故障,如果需要实现HA,则需要通过另外的方式来解决。
通过Magent缓存代理,防止单点现象,缓存代理也可以做备份,通过客户端连接到缓存代理服务器,缓存代理服务器连接缓存连接服务器,缓存代理服务器可以连接多台Memcached机器可以将每台Memcached机器进行数据同步。如果其中一台缓存服务器down机,系统依然可以继续工作,如果其中一台Memcached机器down掉,数据不会丢失并且可以保证数据的完整性。
搭建Memcached集群
Magent的架构方案已经在上一篇博文《Magent介绍》中有详细描述。现以如下图示例架构方案说明Magent如何搭建Memcached集群,而在生产环境需要根据自身业务特点设计健壮的架构方案。

现有测试机:192.168.11.51/52/68
先在三台测试机上安装好libevent和memcached,启动memcached实例;
然后在51和52上安装好magent,启动magent实例。
安装和启动memcached实例
详细步骤,请参见之前的博文《Memcached 1.4.22安装和配置》,分别启动如下实例:
|
1
2
3
|
/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下:
|
1
2
3
4
5
6
|
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文件开头添加
|
1
2
3
|
#ifndef SSIZE_MAX #define SSIZE_MAX 32767 #endif |
|
1
2
3
4
|
ln -s /usr/lib64/libm.so /usr/lib64/libm.a/sbin/ldconfigsed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile vi Makefile |
将
|
1
|
CFLAGS = -Wall -O2 -g |
修改为:
|
1
|
CFLAGS = -lrt -Wall -O2 -g |
保存
3. 编译:
|
1
|
make |
输出如下信息:
|
1
2
3
|
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. 查看命令帮助:
|
1
|
./magent –h |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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实例
|
1
2
|
/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:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
[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:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[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:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
[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:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
[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:
|
1
|
kill `cat /var/run/memcached/memcached.pid` |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
[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:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[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版本相关的错误汇总
产生如下错误:
|
1
2
3
4
5
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文件开头添加
|
1
2
3
|
#ifndef SSIZE_MAX #define SSIZE_MAX 32767 #endif |
再次make
产生如下错误:
|
1
2
3
4
5
6
7
|
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 |
解决方法:
|
1
2
|
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
产生如下错误:
|
1
2
3
4
5
6
7
|
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 |
解决方法:
|
1
|
vi Makefile |
将
|
1
|
CFLAGS = -Wall -g -O2 -I/usr/local/include $(M64) |
修改为:
|
1
|
CFLAGS = -lrt -Wall -g -O2 -I/usr/local/include $(M64) |
保存
再次make
输出为:
|
1
|
gcc -lrt -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib/libevent.a /usr/lib64/libm.a |
Magent搭建Memcached集群的更多相关文章
- Ubuntu 16.04通过Magent搭建Memcached集群(转)
一.下载Magent 官网:https://code.google.com/archive/p/memagent/downloads 离线版本:(链接: https://pan.baidu.com/s ...
- memcached+magent实现memcached集群
首先说明下memcached存在如下问题 本身没有内置分布式功能,无法实现使用多台Memcache服务器来存储不同的数据,最大程度的使用相同的资源:无法同步数据,容易造成单点故障.(memagent代 ...
- [转]memcached+magent实现memcached集群
From : http://www.cnblogs.com/happyday56/p/3461113.html 首先说明下memcached存在如下问题 本身没有内置分布式功能,无法实现使用多台Mem ...
- magent实现memcached集群的一个问题
之前我们小组封装了一个memcached类库,里面有一个名为RemoveStartWith的方法可以根据起始字符串删除所有节点中负责键值规则的缓存项.它实现的原理就是通过stats命令获取每个节点的所 ...
- mamcached+magent构建memcached集群
cat /etc/redhat-release CentOS release 6.7 (Final) 防火墙.selinux 关闭 192.168.12.30 安装libevent和memcached ...
- Memcached集群/分布式/高可用 及 Magent缓存代理搭建过程 详解
当网站访问量达到一定时,如何做Memcached集群,又如何高可用,是接下来要讨论的问题. 有这么一段文字来描述“Memcached集群” Memcached如何处理容错的? 不处理!:) 在memc ...
- Memcached 集群架构与memcached-session-manager
Memcached 集群架构方面的问题_知识库_博客园https://kb.cnblogs.com/page/69074/ memcached-session-manager配置 - 学习中间件调优管 ...
- nginx+tomcat+memcached搭建服务器集群及负载均衡
在实际项目中,由于用户的访问量很大的原因,往往需要同时开启多个服务器才能满足实际需求.但是同时开启多个服务又该怎么管理他们呢?怎样实现session共享呢?下面就来讲一讲如何使用tomcat+ngin ...
- [置顶] 搭建apache+tomcat+memcached集群环境
一.搭建apache server服务器 1.apache server图示:(加载图片要一张一张,所以可以到下面网站下载带图片的word) http://download.csdn.net/user ...
随机推荐
- tf.Session()和tf.InteractiveSession()的区别
官方tutorial是这么说的: The only difference with a regular Session is that an InteractiveSession installs i ...
- Tensorflow中的变量
从初识tf开始,变量这个名词就一直都很重要,因为深度模型往往所要获得的就是通过参数和函数对某一或某些具体事物的抽象表达.而那些未知的数据需要通过学习而获得,在学习的过程中它们不断变化着,最终收敛达到较 ...
- 洛谷 P1603 斯诺登的密码
我一开始还没看懂非正规数字的意义,以为那里写的单词不算,蒙了好久,而且这题非常考验仔细程度,一不小心就RE,WA. 嗯,好像讲了些废话,那我们看看思路,我的做法和前面的大佬们有些不同,因为这题只有六个 ...
- 月薪20K软件测试自动化岗必问面试题:验证码识别与处理
本文乃Happy老师的得意门生来自java全栈自动化测试4期的小核桃所作.正所谓严师出高徒,笔下有黄金~~让我们一起来征服面试官吧~~ 在做自动化测试的时候,经常会遇到需要输入验证码的地方,有些可以让 ...
- 以python代码解释fork系统调用
import os print('Process (%s) start...' % os.getpid()) # Only works on Unix/Linux/Mac: pid = os.fork ...
- 01 uni-app框架学习:项目创建及底部导航栏tabBar配置
1.创建一个项目类型选择uniapp 2. pages里新建3个页面如下 3.在pages.json中配置底部导航tabBar 效果展示:
- requests(二): json请求中固定键名顺序&消除键和值之间的空格
继上一篇requests发送json请求的文章后,实际工作中遇到了以下2种情况. 1:服务端要求json字符串,键名的顺序固定 2.服务端对于接收到的json数据中,若key和value之间有空格, ...
- AUI-靠谱的移动前端框架
在如何开发出优秀的APICloud应用中ApiCloud官方推荐我们使用轻量级的框架AUI,针对AUI官网没有提供体验地址 特意编译了一个APP供给大家体验 aui官方地址:http://www.au ...
- SharePoint 2013 另一个程序正在使用此文件,进程无法访问。 (异常来自 HRESULT:0x80070020)
环境:SharePoint 2013 + Windows Server 2012 R2 在管理中心新建一个Web Application,端口为:88.顺利创建网站集后,打开访问却提示:无法显示此页 ...
- Python_oldboy_自动化运维之路_面向对象(十)
面向对象编程 OOP编程是利用“类”和“对象”来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向 ...