repcached实现memcached内存复制+keepalived主备模式

时间:2022-09-09 09:24:43

Repcached介绍

Repchched项目地址:http://repcached.sourceforge.net/

关于repcached

“repcached”是一个补丁集合,它添加数据复制功能到memcached 1.4.13但是网络上流传的大多是针对memcached1.2.8版本的repcached,本文将以memcached1.4.13最新版本为例来讲述repcached的兼容性内存复制功能。

主要目的
实现冗余memcached系统
主要功能
多主复制,异步数据复制,支持所有的memcached命令(set, add, delete, incr/decr, flush_all, cas)。

Memcached 1.4.13的Repcached补丁(注意:memcached版本必须要和repcached对应的兼容memcached的版本一致,否则会出现各种不兼容bug错误)

地址:http://mdounin.ru/

最新补丁:http://mdounin.ru/files/repcached-2.3.1-1.4.13.patch.gz

工作原理

repcached实现了memcached复制的功能,它是一个单master单slave的方案,但master/slave都是可读写的,而且可以相互同步,如果master坏掉slave侦测到连接断了,它会自动listen而成为master,这时坏掉的master只能启用为slave,它们之间互换角色,才能保持复制功能,换句话说,master没有抢占功能;而如果slave坏掉,master也会侦测到连接断,它就会重新listen等待新的slave加入。

应用场景

用memcached做session共享或其它服务时会存在memcached的单点故障,如果memcached宕机,那么整个系统用户无法登陆(session)。

基于这种情况,采用repcached做memcached的主从冗余

警告:repcached内存复制插件版本一定要和memcached版本一致,否则会出现版本不兼容等各种错误!

主从机器上必须都安装repcached插件

wget https://memcached.googlecode.com/files/memcached-1.4.13.tar.gz
wget http://mdounin.ru/files/repcached-2.3.1-1.4.13.patch.gz
tar zxvf memcached-1.4.13.tar.gz
gzip -d repcached-2.3.1-1.4.13.patch.gz
cd memcached-1.4.13
patch -p1 -i ../repcached-2.3.1-1.4.13.patch 以下命令路径要切换成自己的安装目录,还有
./configure –prefix=/usr/local/mecached –with-libevent=/usr/local/libevent –enable-replication
make && make install

出现的错误以及解决方法:

错误一:

在解压repcached文件时出现如下错误

gzip:stdin:not in gzip format

tar:Child returned status 1

tar:由于前面的延迟的错误而退出
这是因为文件的下载链接不是直接指向文件,而是先指向一个页面,在这个页面里才是真的下载链接,所以在前一个页面上直接保存文件,实际上保存的是一个页面。

解决办法:

首先用 file 命令查看该文件的真实属性,根据真实属性选择解压命令即可解决,遇到这样的错误提示记得查看该文件的真实属性,我这里file repcached-2.3.1-1.4.13.patch.gz得到的文件属性居然是html文件类型的,好家伙,难怪会提示不是gzip类型文件呢,原来是下载链接地址在wget 下下载的是html页面跳转地址,通过浏览器输入(如下)下载地址回车就得到了原始真实repcached的gzip包文件

http://mdounin.ru/files/repcached-2.3.1-1.4.13.patch.gz

错误二:
关于下面谷歌memcached源码包地址打不开的问题:

wget https://memcached.googlecode.com/files/memcached-1.4.13.tar.gz

   去掉https模式改用http模式试试

wget http://memcached.googlecode.com/files/memcached-1.4.13.tar.gz

   如果还无法打开源码包,可能是谷歌被封了,或者地址迁移了,请从下面链接地址进行下载即可:

   csdn memcached-1.4.13下载地址:http://download.csdn.net/detail/liaowuxukong/4578543

安装完毕了,下面我们来启动主从memcached服务器,主机为本地192.168.1.10 11211端口,从机为192.168.1.11 服务器的11211端口
/usr/local/memcached/bin/memcached -d -m -p 11211 -u nobody -l 192.168.1.10 -x 192.168.1.11 -X 11212 -P /tmp/localhost_master.pid -vv
注意:在使用keepalived做主备自动切换时去掉-l参数,否则会导致keepalived 无法监听绑定虚拟IP到主机上
/usr/local/memcached/bin/memcached -d -m -p 11211 -u nobody -l 192.168.1.11 -x 192.168.1.10 -X 11212 -P /tmp/localhost_slave.pid -vv

参数说明:
-x 设置从哪个IP上进行同步。
-X 指定数据同步的端口。
-d 选项是启动一个守护进程,
-m 是分配给Memcache使用的内存数量,单位是MB,我这里是8096MB,
-u 是运行Memcache的用户,我这里是root,
-l 是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.77.105,
-p 是设置Memcache监听的端口,我这里设置了11211,最好是1024以上的端口,
-c 选项是最大运行的并发连接数,默认是1024,按照你服务器的负载量来设定,
-P 是设置保存Memcache的pid文件的位置

查看端口

netstat -tupln | grep memcached
tcp 0 0 192.168.1.10:11211 0.0.0.0:* LISTEN 12242/memcached
udp 0 0 192.168.1.10:11211 0.0.0.0:* 12242/memcached

验证数据同步

在Master创建数据:
[root@test01 bin]# telnet 192.168.1.10 11211

Trying 192.168.1.10…
Connected to 192.168.1.10.
Escape character is ‘^]’.
get key1
END
set key1 0 0 2
aa
STORED
quit
Connection closed by foreign host.

在Slave获取数据:
[root@test02 bin]# telnet 192.168.1.11 11211

Trying 192.168.1.11…
Connected to 192.168.1.11.
Escape character is ‘^]’.
get key1
VALUE key1 0 2
aa
END
quit
Connection closed by foreign host.

在Slave创建数据:
[root@test02 bin]# telnet 192.168.1.11 11211

Trying 192.168.1.11…
Connected to 192.168.1.11.
Escape character is ‘^]’.
get key2
END
set key2 0 0 3
bbb
STORED
get key2
VALUE key2 0 3
bbb
END
quit
Connection closed by foreign host.

在Master获取数据:
[root@test01 bin]# telnet 192.168.1.10 11211

Trying 192.168.1.10…
Connected to 192.168.1.10.
Escape character is ‘^]’.
get key2
VALUE key2 0 3
bbb
END
quit
Connection closed by foreign host.

Memcached高可用

启动Master和Slave时不要加-l参数指定监听地址,否则keepalived无法监听VIP的地址。
然后配置上keepalived就可以作为高可用了。
以下是keppalived配置信息,在此就不多数了,相信大家都熟悉keepalived的作用了
MASTER 主机 配置信息
! Configuration File for keepalived

global_defs {
notification_email {
happy.yin@qq.com
}
notification_email_from zqtsx@email.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}

vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 51
priority 101 主机 为 101
advert_int 1
authentication {
auth_type PASS 验证类型
auth_pass 1111 验证密码自己修改即可,记得主备机上的密码要一致
}
virtual_ipaddress {
192.168.1.120 虚拟IP 地址
}
}

SLAVE 从机 配置信息
! Configuration File for keepalived

global_defs {
notification_email {
happy.yin@qq.com
}
notification_email_from zqtsx@email.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}

vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 51
priority 100 从机 为 100
advert_int 1
authentication {
auth_type PASS 验证类型
auth_pass 1111 验证密码自己修改即可,记得主备机上的密码要一致
}
virtual_ipaddress {
192.168.1.120 虚拟IP 地址
}
}

通过虚拟IP进行memcached 存取操作
[root@localhost happy]# telnet 192.168.1.120 11211
Trying 192.168.1.120…
Connected to 192.168.1.120.
Escape character is ‘^]’.
set key 0 0 6
123456
STORED
get key
VALUE key 0 6
123456
END
get key1
VALUE key1 0 2
aa
END
quit
Connection closed by foreign host.
OK keepalived + memcached主备模式到此设置完成了,下面我们来停止一台机器上的keepalived模拟down机,然后再用虚拟IP 192.168.1.120链接memcached并对其进行读写,看下能否正常访问到memcached数据就知道了主备模式是否健全了
[root@localhost happy]# telnet 192.168.1.120 11211
Trying 192.168.1.120…
Connected to 192.168.1.120.
Escape character is ‘^]’.
get key
VALUE key 0 6
123456
END
get key1
VALUE key1 0 2
aa
END
quit
Connection closed by foreign host.

OK MEMCACHED一切正常,不仅memcached实现了内存复制,而且keepalived运行也一切正常,至此一个完整可靠的memcached主备模式构建完成了。。。
关于Mecached和php memcached扩展安装方法请参见 摘取天上星 的另外一篇博文:http://blog.csdn.net/zqtsx/article/details/26720849

本教程所使用软件包下载地址

memcached1.4.13
http://download.csdn.net/detail/zqtsx/8910705
repcached-1.4.13
http://download.csdn.net/detail/zqtsx/8910709