Rootop 服务器运维与web架构

memcached+repcached复制解决单点故障

| 暂无评论

用memcached做session共享或其它服务时会存在memcached的单点故障,如果memcached宕机,那么整个系统用户无法登陆(session)。
基于这种情况,采用repcached做memcached的主从冗余。

repcached实现了memcached复制的功能,它是一个单master单slave的方案,但master/slave都是可读写的,而且可以相互同步,如果master坏掉slave侦测到连接断了,它会自动listen而成为master;而如果slave坏掉,master也会侦测到连接断,它就会重新listen等待新的slave加入。

repcached最新下载地址:http://sourceforge.net/projects/repcached/files/repcached
有两种方式,一种通过打补丁形式,另一种直接安装融合版的memcached。这里选择第二种。
http://jaist.dl.sourceforge.net/project/repcached/repcached/2.2.1-1.2.8/memcached-1.2.8-repcached-2.2.1.tar.gz

系统信息:
memcached-master redhat5.5_x64 ip:192.168.1.20
memcached-slave    redhat5.5_x64 ip:192.168.1.21

先安装libevent:

[root@localhost ~]# wget -c https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz --no-check-certificate
[root@localhost ~]# tar zxvf libevent-2.0.21-stable.tar.gz
[root@localhost ~]# cd libevent-2.0.21-stable
[root@localhost libevent-2.0.21-stable]# ./configure --prefix=/usr/
[root@localhost libevent-2.0.21-stable]# make && make install

安装memcached-repcached

[root@localhost ~]# wget -c http://jaist.dl.sourceforge.net/project/repcached/repcached/2.2.1-1.2.8/memcached-1.2.8-repcached-2.2.1.tar.gz
[root@localhost ~]# tar zxvf memcached-1.2.8-repcached-2.2.1.tar.gz
[root@localhost ~]# cd memcached-1.2.8-repcached-2.2.1
[root@localhost memcached-1.2.8-repcached-2.2.1]# ./configure --prefix=/usr/local/memcached --enable-replication

下一步在make的时候得到一个错误:
make[2]: Entering directory `/root/memcached-1.2.8-repcached-2.2.1′
gcc -DHAVE_CONFIG_H -I. -DNDEBUG -g -O2 -MT memcached-memcached.o -MD -MP -MF .deps/memcached-memcached.Tpo -c -o memcached-memcached.o `test -f ‘memcached.c’ || echo ‘./’`memcached.c
memcached.c: In function ‘add_iov’:
memcached.c:697: 错误:‘IOV_MAX’ 未声明 (在此函数内第一次使用)
memcached.c:697: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
memcached.c:697: 错误:所在的函数内只报告一次。)
make[2]: *** [memcached-memcached.o] 错误 1
make[2]: Leaving directory `/root/memcached-1.2.8-repcached-2.2.1′
make[1]: *** [all-recursive] 错误 1
make[1]: Leaving directory `/root/memcached-1.2.8-repcached-2.2.1′
make: *** [all] 错误 2

解决方法:
[root@localhost memcached-1.2.8-repcached-2.2.1]# vi memcached.c

#ifdef HAVE_MALLOC_H
/* OpenBSD has a malloc.h, but warns to use stdlib.h instead */
#ifndef __OpenBSD__
#include <malloc.h>
#endif
#endif
修改为:
/* FreeBSD 4.x doesn't have IOV_MAX exposed. */
#ifndef IOV_MAX
# define IOV_MAX 1024
#endif

继续make:
[root@localhost memcached-1.2.8-repcached-2.2.1]# make && make install

在另一个机器中安装同上。过程略。

这里提示一下,默认memcached单个进程只支持到2G内存,需要更大内存支持的话,需要打开64位支持,编译的时候加参数:

--enable-64bit

启动master:
[root@localhost ~]# /usr/local/memcached/bin/memcached -v -u root -d -x 192.168.1.21
#192.168.1.21,与slave同步地址

启动slave:
[root@localhost ~]# /usr/local/memcached/bin/memcached -v -u root -d -x 192.168.1.20
#-x设置从哪个IP上进行同步 -X 指定数据同步的端口
memcached默认服务端口是11211,默认同步监听端口是11212

测试:
在master创建数据
C:\Users\Administrator>telnet 192.168.0.20 11211 #登陆master创建key1数据
get key1
END
set key1 0 0 2
aa
STORED
quit

遗失对主机的连接。

C:\Users\Administrator>telnet 192.168.0.21 11211 #登陆slave查看是否同步过来key1数据
get key1
VALUE key1 0 2
aa
END
quit

遗失对主机的连接。

在slave创建数据
C:\Users\Administrator>telnet 192.168.0.21 11211 #登陆slave创建key2数据
get key2
END
set key2 0 0 3
bb
STORED
quit

遗失对主机的连接。

C:\Users\Administrator>telnet 192.168.0.20 11211 #登陆master查看是否同步过来key2数据
VALUE key2 0 2
bb
END
quit

遗失对主机的连接。

然后配置上keepalived就可以作为高可用了。
这里注意在使用了keepalived时,启动memcached的时候不要加-l参数指定监听地址,否则keepalived无法监听VIP的地址。

本文适用于oper搭建环境测试,对于开发者来说没有什么作用。dever勿喷···

原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/2475.html

作者:Venus

专注于 服务器运维与web架构 E-mail:venus#rootop.org

发表评论