Memcached-Repcached小小探测

  忘记在什么地方,看到一个memcache的文档,当时看到在启动memcached服务的时候,有两个参数-x-X,当时很奇怪,以前也做过memcached方面的实验,但也没有见过这两个参数,于是拉出来以前的实验环境,查看help,也没有此参数,便心想,自己对memcached也只是有一个初步的了解,可能是遗漏了什么内容,于是在网上搜了搜,总算搞清楚了是什么回事。

-x-X参数并非来自于原生的memcached参数,它是由一个Memcached的变种产品repcached所以提供,repcached由日本人开发,可以说是Memcached的一个patch,为了实现Memcached的复制功能,可以支持多个Memcached之间相互复制,解决了Memcached的容灾问题。

Repcached是一个单masterslave的方案,它的master/slave都是可读写的,而且可以同步,如果master挂掉,slave侦测到连接断了,就会自动listen而成为master,如果slave挂掉,master也会侦测到连接已经断开,并且重新侦听,等待slave加入。

知道了原因,当然要动手操作一下,找了两台实验机,做一个主备。

Repcached有两种安装形式,一种是以Memcached的补丁形式,只有Repcached补丁,在为自己的Memcached打补丁的时候,要选对应的Repcached补丁,别一种是集成的形式,包中直接集成MemcachedRepcached,本次主要以后者实验。

实验环境: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

注:masterslave服务器的配置均相同,不再重复贴出

1.Libevent安装

Memcached是基于libevent的事件处理机制,Libevent是由C开发的程序库,它把BSD系统的kqueuelinuxepoll等事件处理功能封闭成一个接口。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上进行数据同步,也就是MasterIP

    -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

参考链接:http://yjh625.blog.51cto.com/225746/1264696

         http://f.dataguru.cn/thread-179095-1-1.html