Memcached无单点解决方案

 

原文链接:https://linux.cn/article-669-2.html

一.Repcached (memcached同步补丁)

下载地址:http://sourceforge.net/projects/repcached/files/repcached/2.2.1-1.2.8/

版本号:memcached 1.2.8  repcached 2.2.1

1、repcached介绍

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

2、安装

在两台服务器上分别安装memcached服务,另注本文libevent的版本为:libevent-1.4.13,下载地址: http://www.monkey.org/~provos/libevent-1.4.13-stable.tar.gz (安装省略)

repcached有两种方式:

方式一、下载对应的repcached版本

#wget http://downloads.sourceforge.net/repcached/memcached-1.2.8-repcached-2.2.tar.gz
#tar zxf memcached-1.2.8-repcached-2.2.tar.gz
#cd memcached-1.2.8-repcached-2.2

方式二、下载对应patch版本

#wget http://downloads.sourceforge.net/repcached/repcached-2.2-1.2.8.patch.gz
#gzip -cd ../repcached-2.2-1.2.8.patch.gz | patch -p1】
#./configure –enable-replication
# make
# make install

3、启动:

启动master

# ./memcached -v -u root -d -l 127.0.0.1 -p 11211 -x 127.0.0.1 -X 11111   (11211:master端口;11111:同步端口)
replication: connect (peer=127.0.0.1:11111)
replication: accept
replication: marugoto copying
replication: start

启动salve

# ./memcached -v -u root -d -l 127.0.0.1 -p 11212 -x 127.0.0.1 -X 11111   (11212:slave端口;11111:同步端口)
replication: connect (peer=127.0.0.1:11111)
replication: marugoto copying
replication: close
replication: listen

4、测试:

操作master

[root@localhost bin]# telnet 127.1 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1)...
Escape character is '^]'.
get key1
END
set key1 0 0 2
aa
STORED
quit
Connection closed by foreign host.

查看slave

[root@localhost bin]# telnet 127.1 11212
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1)...
Escape character is '^]'.
get key1
VALUE key1 0 2
aa
END
quit
Connection closed by foreign host.

注意:如果master down机,slave接管并成为master,这时down机的master只能启用slave,他们之间互换角色,才能保持复制功能。换句话说,master没有抢占功能。而且,同步间隔时间未知。

优点:

  1. 数据冗余
  2. 两台memcached都可以进行读写操作

缺点:

  1. 只支持单对单
  2. 只支持memcached 1.2.x版本

二.Magent (memcached的代理)

原文地址:http://blog.s135.com/post/393/

magent是一款开源的Memcached代理服务器软件,其项目网址为:

http://code.google.com/p/memagent/

1、安装步骤:

a、编译安装libevent:

wget http://monkey.org/~provos/libevent-1.4.9-stable.tar.gz
tar zxvf libevent-1.4.9-stable.tar.gz
cd libevent-1.4.9-stable/
./configure --prefix=/usr
make && make install
cd ../

b、编译安装Memcached:

wget http://danga.com/memcached/dist/memcached-1.2.6.tar.gz
tar zxvf memcached-1.2.6.tar.gz
cd memcached-1.2.6/
./configure --with-libevent=/usr
make && make install
cd ../

c、编译安装magent:

mkdir magent
cd magent/
wget http://memagent.googlecode.com/files/magent-0.5.tar.gz
tar zxvf magent-0.5.tar.gz
/sbin/ldconfig
sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
make
cp magent /usr/bin/magent
cd ../

2、使用实例:

memcached -m 1 -u root -d -l 127.0.0.1 -p 11211
memcached -m 1 -u root -d -l 127.0.0.1 -p 11212
memcached -m 1 -u root -d -l 127.0.0.1 -p 11213
magent -u root -n 51200 -l 127.0.0.1 -p 12000 -s 127.0.0.1:11211 -s 127.0.0.1:11212 -b 127.0.0.1:11213
  1. 分别在11211、11212、11213端口启动3个Memcached进程,在12000端口开启magent代理程序;
  2. 11211、11212端口为主Memcached,11213端口为备份Memcached;
  3. 连接上12000的magent,set key1和set key2,根据哈希算法,key1被写入11212和11213端口的Memcached,key2被写入11212和11213端口的Memcached;
  4. 当11211、11212端口的Memcached死掉,连接到12000端口的magent取数据,数据会从11213端口的Memcached取出;
  5. 当11211、11212端口的Memcached重启复活,连接到12000端口,magent会从11211或11212端口的 Memcached取数据,由于这两台Memcached重启后无数据,因此magent取得的将是空值,尽管11213端口的Memcached还有数 据(此问题尚待改进)。

3、整个测试流程:

[root@centos52 ~]# telnet 127.0.0.1 12000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
stats
memcached agent v0.4
matrix 1 -> 127.0.0.1:11211, pool size 0
matrix 2 -> 127.0.0.1:11212, pool size 0
END
set key1 0 0 8
zhangyan
STORED
set key2 0 0 8
zhangyan
STORED
quit
Connection closed by foreign host.

[root@centos52 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get key1
END
get key2
VALUE key2 0 8
zhangyan
END
quit
Connection closed by foreign host.

[root@centos52 ~]# telnet 127.0.0.1 11212
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get key1
VALUE key1 0 8
zhangyan
END
get key2
END
quit
Connection closed by foreign host.

[root@centos52 ~]# telnet 127.0.0.1 11213
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get key1
VALUE key1 0 8
zhangyan
END
get key2
VALUE key2 0 8
zhangyan
END
quit
Connection closed by foreign host.

模拟11211、11212端口的Memcached死掉

[root@centos52 ~]# ps -ef | grep memcached
root      6589     1  0 01:25 ?        00:00:00 memcached -m 1 -u root -d -l 127.0.0.1 -p 11211
root      6591     1  0 01:25 ?        00:00:00 memcached -m 1 -u root -d -l 127.0.0.1 -p 11212
root      6593     1  0 01:25 ?        00:00:00 memcached -m 1 -u root -d -l 127.0.0.1 -p 11213
root      6609  6509  0 01:44 pts/0    00:00:00 grep memcached
[root@centos52 ~]# kill -9 6589
[root@centos52 ~]# kill -9 6591
[root@centos52 ~]# telnet 127.0.0.1 12000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get key1
VALUE key1 0 8
zhangyan
END
get key2
VALUE key2 0 8
zhangyan
END
quit
Connection closed by foreign host.

模拟11211、11212端口的Memcached重启复活

[root@centos52 ~]# memcached -m 1 -u root -d -l 127.0.0.1 -p 11211
[root@centos52 ~]# memcached -m 1 -u root -d -l 127.0.0.1 -p 11212
[root@centos52 ~]# telnet 127.0.0.1 12000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get key1
END
get key2
END
quit
Connection closed by foreign host.

 

优点:

  1. 可以做多主或多从

缺点:

  1. 当master宕掉又恢复后,取不到数据。

三.Repcached和Magent结合

安装memcached 1.2.8、repcached 2.2.1、magent 0.5

测试流程:

1、启动memcached和magent

开启代理,代理端口为12000,设置127.0.0.1:11211为主,127.0.0.1:11212为从。

magent -u root -p 12000 -s 127.0.0.1:11211 -b 127.0.0.1:11212

启动两个memcached进程,做数据同步,同步端口为11111。

./memcached -u root -d -l 127.0.0.1 -p 11211 -x 127.0.0.1 -X 11111

./memcached -u root -d -l 127.0.0.1 -p 11212 -x 127.0.0.1 -X 11111

2、从代理写入数据,在两台memcached上查看

[root@localhost bin]# telnet 127.1 12000
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set key1 0 0 1
a
STORED
quit
Connection closed by foreign host.
[root@localhost bin]# telnet 127.1 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
get key1
VALUE key1 0 1
a
END
quit
Connection closed by foreign host.

 

3. 模拟主或从memcached宕机后,数据是否存在

[root@localhost bin]# ps aux|grep memcached
root    15314  0.0 0.4 3556  2108 ?     Ss   16:03   0:00 ./memcached -u root -d -l 127.0.0.1 -p 11211 -x 127.0.0.1 -X 11111
root    15318  0.0 0.3 3556  1836 ?     Ss   16:04   0:00 ./memcached -u root -d -l 127.0.0.1 -p 11211 -x 127.0.0.1 -X 11111
root    15370  0.0 0.1 4016   696 pts/3 R+   16:09   0:00 grep memcached
[root@localhost bin]# kill 15314
[root@localhost bin]# ps aux|grep memcached
root    15318  0.0 0.3 3556  1836 ?     Ss   16:04   0:00 ./memcached -u root -d -l 127.0.0.1 -p 11211 -x 127.0.0.1 -X 11111
root    15370  0.0 0.1 4016   696 pts/3 R+   16:09   0:00 grep memcached
[root@localhost bin]# telnet 127.1 12000
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set key1 0 0 1
a
STORED
quit
Connection closed by foreign host.
[root@localhost bin]# telnet 127.1 11212
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
get key1
VALUE key1 0 1
a
END
quit
Connection closed by foreign host.

4. 模拟主或从memcached恢复后,数据是否存在/同步

[root@localhost bin]# ./memcached -u root -d -l 127.0.0.1 -X 11111
[root@localhost bin]# ps aux|grep memcached
root    15318  0.0 0.4 3556  2112 ?     Ss   16:04   0:00 ./memcached -u root -d -l 127.0.0.1 -p 11211 -x 127.0.0.1 -X 11111
root    15380  0.0 0.3 3556  1808 ?     Ss   16:11   0:00 ./memcached -u root -d -l 127.0.0.1 -p 11211 -x 127.0.0.1 -X 11111
root    15384  0.0 0.1 4016   700 pts/3 R+   16:11   0:00 grep memcached
[root@localhost bin]# telnet 127.1 12000
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set key1 0 0 1
a
STORED
quit
Connection closed by foreign host.
[root@localhost bin]# telnet 127.1 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
get key1
VALUE key1 0 1
a
END
quit
Connection closed by foreign host.

优点:

  1. 数据冗余
  2. 两台memcached都可进行读写操作
  3. 可以做多主或多从(未测试)

缺点:

  1. 只支持memcached 1.2.x版本

你可能感兴趣的:(memcached)