Memcached無單點解決方案


 

一.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:同步端口)

啓動salve
# ./memcached -v -u root -d -l 127.0.0.1 -p 11212 -x 127.0.0.1 -X 11111   (11212:slave端口;11111:同步端口)

4、測試:
操作master


查看slave

 

注意:如果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、編譯安裝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 ../

2、編譯安裝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 ../

 

3、編譯安裝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 ../

 

二、使用實例:

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還有數據(此問題尚待改進)

三、整個測試流程:

[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.

 

優點:

可以做多主或多從

缺點:

當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

  1. 從代理寫入數據,在兩臺memcached上查看。

2. 模擬主或從memcached宕機後,數據是否存在。

3. 模擬主或從memcached恢復後,數據是否存在/同步。

優點:

數據冗餘

兩臺memcached都可進行讀寫操作

可以做多主或多從(未測試)

缺點:

只支持memcached 1.2.x版本

發佈了125 篇原創文章 · 獲贊 0 · 訪問量 6279
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章