Memcached-Repcached小小探测
忘记在什么地方,看到一个memcache的文档,当时看到在启动memcached服务的时候,有两个参数-x与-X,当时很奇怪,以前也做过memcached方面的实验,但也没有见过这两个参数,于是拉出来以前的实验环境,查看help,也没有此参数,便心想,自己对memcached也只是有一个初步的了解,可能是遗漏了什么内容,于是在网上搜了搜,总算搞清楚了是什么回事。
-x与-X参数并非来自于原生的memcached参数,它是由一个Memcached的变种产品repcached所以提供,repcached由日本人开发,可以说是Memcached的一个patch,为了实现Memcached的复制功能,可以支持多个Memcached之间相互复制,解决了Memcached的容灾问题。
Repcached是一个单master单slave的方案,它的master/slave都是可读写的,而且可以同步,如果master挂掉,slave侦测到连接断了,就会自动listen而成为master,如果slave挂掉,master也会侦测到连接已经断开,并且重新侦听,等待slave加入。
知道了原因,当然要动手操作一下,找了两台实验机,做一个主备。
Repcached有两种安装形式,一种是以Memcached的补丁形式,只有Repcached补丁,在为自己的Memcached打补丁的时候,要选对应的Repcached补丁,别一种是集成的形式,包中直接集成Memcached与Repcached,本次主要以后者实验。
实验环境:master: red hat5.4 IP :192.168.2.13
Slave: red hat 5.4 IP:192.168.2.14
软件包:libevent-2.0.21-stable.tar.gz
memcached-1.2.8-repcached-2.2.1.tar.gz
注:master与slave服务器的配置均相同,不再重复贴出
1.Libevent安装
Memcached是基于libevent的事件处理机制,Libevent是由C开发的程序库,它把BSD系统的kqueue与linux的epoll等事件处理功能封闭成一个接口。Memcached利用这个库进行异步事件处理
# ./configure--prefix=/usr/local/libevent
# make && make install
安装之后,将Libevent的库文件添加到动态库中
# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/libevent/lib //此处为要添加的libevent库目录
# ldconfig //重新加载动态lib库
注:如果无此步骤,在启动memcached时,会提示看不到libevent的库文件。
2.Memcached-repcached安装
## ./configure--prefix=/usr/local/memcachedrep --with-libevent=/usr/local/libevent--enable-replication --enable-64bit
# make && make install
如果在此处安装时,出现错误代码:
memcached.c: Infunction ‘add_iov’:
memcached.c:697:error: ‘IOV_MAX’ undeclared (first use in this function)
memcached.c:697:error: (Each undeclared identifier is reported only once
memcached.c:697:error: for each function it appears in.)
make[2]: ***[memcached-memcached.o] Error 1
make[2]: Leavingdirectory `/root/memcached/memcached-1.2.8-repcached-2.2.1'
make[1]: ***[all-recursive] Error 1
make[1]: Leavingdirectory `/root/memcached/memcached-1.2.8-repcached-2.2.1'
make: *** [all]Error 2
则需要手动修改源文件
# vim memcached.c
将
55 /* FreeBSD 4.x doesn't have IOV_MAXexposed. */
56 #ifndef IOV_MAX
57 #if defined(__FreeBSD__) ||defined(__APPLE__)
58 # define IOV_MAX 1024
59 #endif
60 #endif
修改为:
55 /* FreeBSD 4.x doesn't have IOV_MAXexposed. */
56 #ifndef IOV_MAX
57 /*#if defined(__FreeBSD__) ||defined(__APPLE__)*/
58 # define IOV_MAX 1024
59 #endif
60 /*#endif*/
安装过程比较简单,主要是memcached make时安装出错这儿会有点麻烦。
3.测试
首先启动master/slave memcached.
启动master memcached:
#/usr/local/memcachedrep/bin/memcached -d -m 100 -l 192.168.2.13 -p 11211 -u root -c 1024 -X 11212 -P/tmp/memcached-rep.pid
查看memcached监听端口:
# netstat -tupln | grep memcached
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 12443/memcached
tcp 0 0 :::11211 :::* LISTEN 12443/memcached
tcp 0 0 :::11212 :::* LISTEN 12443/memcached
udp 0 0 0.0.0.0:11211 0.0.0.0:* 12443/memcached
udp 0 0 :::11211:::* 12443/memcached
启动slave memcached
#/usr/local/memcachedrep/bin/memcached -d -m 100 -l 192.168.2.14 -p 11211 -uroot -c 1024 -x 192.168.2.13 -X 11212 -P /tmp/memcached-rep.pid
查看memcached监听端口:
# netstat -tupln | grep memcached
tcp 0 0192.168.2.14:11211 0.0.0.0:* LISTEN 22888/memcached
udp 0 0 192.168.2.14:11211 0.0.0.0:* 22888/memcached
参数:
-x: 设置从哪个IP上进行数据同步,也就是Master的IP
-X:设置数据同步的端口,默认为11212,所以可以省略此参数,如果11212已经被另外的服务占用的话,则必须使用此参数进行端口的指定。
其它的参数你可以直接使用:#/usr/local/memcachedrep/bin/memcached –h来获取,当然获取的也包括-x与-X
鉴于本文主要是测试数据间的同步,所以只进行简单的测试
1>连接到master服务器的11211端口,添加数据
Xshell:\>telnet 192.168.2.13 11211
Connectingto 192.168.2.13:11211...
Connectionestablished.
To escapeto local shell, press 'Ctrl+Alt+]'.
set dd 00 3 //命令
ddd //命令
STORED
2>连接到slave服务器的11211端口进行取数据
Connectingto 192.168.2.13:11211...
Connectionestablished.
To escapeto local shell, press 'Ctrl+Alt+]'.
get dd //命令
VALUE dd0 3
ddd
END
3>可以看到在slave服务器上也已经同步了数据。
4>我们也可以在slave服务器上写数据,在master上读数据
在slave服务器上写数据
Connectingto 192.168.2.14:11211...
Connectionestablished.
To escapeto local shell, press 'Ctrl+Alt+]'.
get dd
VALUE dd0 3
ddd
END
set ee 00 3 //命令
eee //命令
STORED
在master服务器上读数据
Connectingto 192.168.2.13:11211...
Connectionestablished.
To escapeto local shell, press 'Ctrl+Alt+]'.
set dd 00 3
ddd
STORED
get ee
ERROR
get ee
VALUE ee0 3
eee
END
可以看到slave也可以写数据,在master上可以读数据,但是期间有一定的数据同步时间。就像上面第一次取数据时,并没有取出,说明数据还没有同步!
4.如果你愿意的话,也可以将两台memcached服务器做成相互master/slave