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
參考鏈接:http://yjh625.blog.51cto.com/225746/1264696
http://f.dataguru.cn/thread-179095-1-1.html