經RD方面要求,需要對memcached進行優化,做到主從同步,上網搜索了下發現repcached對memcached進行patch之後可以實現memcached的複製功能,經過安裝測試發現還不錯。
測試環境:
操作系統:Redhat 5.3 64bit
memcached:memcached-1.4.5 + repcached-2.3-1.4.5.patch
libevent:1.4.4
node1:10.23.36.143
node2:10.23.36.201
1、repcached介紹
repcached是日本人開發的實現memcached複製功能,它是一個單 master單 slave的方案,但它的 master/slave都是可讀寫的,而且可以相互同步,如果 master壞掉, slave偵測到連接斷了,它會自動 listen而成爲 master;而如果 slave壞掉, master也會偵測到連接斷,它就會重新 listen等待新的 slave加入 。
2、安裝libevent
wget http://cloud.github.com/downloads/libevent/libevent/libevent-1.4.14b-stable.tar.gz tar xzvf libevent-1.4.14b-stable.tar.gz cd libevent-1.4.14b-stable ./configure --prefix=/app/soft/libevent-1.4.4 make && make install
將libevent添加到操作系統的動態鏈接庫裏面:
#cat /etc/ld.so.conf include ld.so.conf.d/*.conf /app/soft/libevent-1.4.4/lib #這行是新增的 #ldconfig #使動態庫生效
3、memcached的安裝
wget http://mdounin.ru/files/repcached-2.3.1-1.4.5.patch.gz gzip -d repcached-2.3.1-1.4.5.patch.gz wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz tar xzvf memcached-1.4.15.tar.gz patch -p0 -i repcached-2.3.1-1.4.5.patch #對memcached源碼進行patch cd memcached-1.4.15 ./configure --with-libevent=/app/soft/libevent-1.4.4/ --prefix=/app/soft/memcached-rep-1.4.5 --enable-replication --enable-64bit make && make install
就這樣帶有複製功能的memcached已經安裝完成了,接下來就是啓動了。
5、memcached的同步相關參數介紹
相比沒有沒有patch過的memcached,帶有複製功能的memcached只多了-x、-X兩個參數,具體信息如下:
-x <ip_addr> hostname or IP address of peer repcached -X <num> TCP port number for replication (default: 11212) -x #設置從哪個IP上進行數據同步,也就是設置Master的IP -X #設置數據同步的端口號,默認11212.如11212已經被使用的話, #需要通過這個參數來設置,否則memcached無法啓動
6、memcached啓動
#node1:10.23.36.143 /app/soft/memcached-rep-1.4.5/bin/memcached -d -m 1024 -p 11213 -u resin -c 1024 -P /tmp/memcached-rep.pid -x 10.23.36.201 -X 11215 #node2:10.23.36.201 /app/soft/memcached-rep-1.4.5/bin/memcached -d -m 1024 -p 11213 -u resin -c 1024 -P /tmp/memcached-rep.pid -x 10.23.36.143 -X 11215
本次啓動的是兩臺memcached互爲主從。
7、測試驗證
①、可以分別在兩臺機器上通過telnet localhost 11213,然後通過stats、stats slabs、stats items命令查看memcache一些大概信息。
②、通過java程序來對memcached的讀寫進行驗證,具體java代碼如下:
package TestMemcached; import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool; public class TestMemcached { public static void main(String[] args) { /*初始化SockIOPool,管理memcached的連接池*/ String[] servers = { "10.23.36.143:11213","10.23.36.201:11213" }; SockIOPool pool = SockIOPool.getInstance(); pool.setServers(servers); pool.setFailover(true); pool.setInitConn(10); pool.setMinConn(5); pool.setMaxConn(250); pool.setMaintSleep(30); pool.setNagle(false); pool.setSocketTO(3000); pool.setAliveCheck(true); pool.setFailback(false); pool.initialize(); /*建立MemcachedClient實例*/ MemCachedClient memCachedClient = new MemCachedClient(); /*測試往memcached上寫數據*/ int idx = 1; while(true){ System.out.println(idx); /*memCachedClient.add("key-"+idx, "value-"+idx);*/ //測試往memcached上讀數據 System.out.println(memCachedClient.get("key-"+idx)); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } if(idx > 20){ break; } /* System.out.println(memCachedClient.get("key-"+2)); idx++;*/ } } }
通過測試驗證發現,分別想兩臺memcached寫數據都會相互同步。
③、可以通過測試-vvv發現,每次memcached啓動的時候都會向Master發送同步請求。
總結:
優點:
數據冗餘
兩臺memcached都可以進行讀寫操作
缺點:
只支持單對單
不容易擴展