Memcached叢集
Magent軟體介紹
magent是一款開源的memcached代理伺服器軟體
位址: http://code.google.com/p/memagent/
安裝magent到/usr/local/下
cd /usr/local
mkdir magent
cd magent/
wgethttp://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
magent指令參數:
-hthis message
-u uid
-g gid
-p port, default is 11211. (0 to disable tcpsupport)
-s ip:port, set memcached server ip and port
-b ip:port, set backup memcached server ip andport
-l ip, local bind ip address, default is 0.0.0.0
-n number, set max connections, default is 4096
-D don't go to background
-k use ketama key allocation algorithm
-f file, unix socket path to listen on. defaultis off
-i number, max keep alive connections for onememcached server, default is 20
-v verbose
啟動magent服務
magent -u root -n 4096 -l 127.0.0.1 -p12000 -s127.0.0.1:8086 -s 127.0.0.2:8086 -b 127.0.0.1:11213
magent的hash算法
magent采用的是:Consistent Hashing原理,Consistent Hashing如下所示:首先求出memcached伺服器(節點)的哈希值,并将其配置到0~232的圓(continuum)上。 然後用同樣的方法求出存儲資料的鍵的哈希值,并映射到圓上。 然後從資料映射到的位置開始順時針查找,将資料儲存到找到的第一個伺服器上。如果超過232仍然找不到伺服器,就會儲存到第一台memcached伺服器上。
從上圖的狀态中添加一台memcached伺服器。餘數分布式算法由于儲存鍵的伺服器會發生巨大變化而影響緩存的命中率,但Consistent Hashing中,隻有在continuum上增加伺服器的地點逆時針方向的第一台伺服器上的鍵會受到影響。
利用magent實作對memecache的分布式管理,搭建一套memcache叢集服務
1、前端php對magent的通路跟對memcache通路相同,不需要做任何更改,對于插入的key,magent會把值散列到各個memcache服務上,隻操作magent,不用關心後端處理
2、公司項目應用:南北各10台前端,南北各部署一套magent服務,主要是考慮電信網通的跨網通路.以北方為例,每個前端安裝memcached服務(大記憶體機器可以啟動多個服務),每個前端都安裝magent服務,後端挂載全部機器的 memcached服務,啟動參數:
magent-p 12000 -s 127.0.0.1:8086 -s 127.0.0.2:8086 -s 127.0.0.3:8086.......-s127.0.0.10:8086
,所有前端配置都是相同的,任何一個前端隻需通路本地端口的magent,這樣的memcache叢集對應用帶來很大便利.
比如項目的基本配置資訊,早期政策隻能在中控機生成配置檔案,同步到各個前端,沒有辦法把配置資訊放到緩存中,因為各個前端的memcache是不共享 的,一台機器緩存更新,其它機器是不更新的,用程式去控制更新,還是存在不穩定因素,而且随着服務增多,也不便于管理,部署了magent後,就可以解決 這個問題,任何一個前端更新資料=全局更新
這種部署還可以解決的應用:session共享
Magent使用舉例
啟動兩個memcached程序,端口分别為11211和11212:
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
啟動兩個magent程序,端口分别為10000和11000:
magent -u root -n 51200 -l 127.0.0.1 -p 10000 -s127.0.0.1:11211 -b 127.0.0.1:11212
magent -u root -n 51200 -l 127.0.0.1 -p 11000 -s127.0.0.1:11212 -b 127.0.0.1:11211
-s 為要寫入的memcached, -b 為備份用的memcached。
說明:測試環境用magent和memached的不同端口來實作,在生産環境中可以将magent和memached作為一組放到兩台伺服器上。
也就是說通過magent能夠寫入兩個memcached。
magent使用
1、安裝libevent:
wget http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz tar -xzvf libevent-1.4.13-stable.tar.gz cd libevent-1.4.13-stable ./configure --prefix=/usr/local/libevent make make install |
2、安裝Memcached:
wget http://memcached.googlecode.com/files/memcached-1.4.4.tar.gz tar -xzvf memcached-1.4.4.tar.gz cd memcached-1.4.4 ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent make make install ln -s /usr/local/libevent/lib/libevent-1.4.so.2 /usr/lib/ |
3、編譯安裝magent:
mkdir magent cp magent-0.5.tar.gz magent cd magent tar -xzvf magent-0.5.tar.gz /sbin/ldconfig sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile vi magent.c 添加 #include <limits.h> make |
一、使用執行個體:
memcached -m 1 -u root -d -l 192.168.1.219 -p 11211 memcached -m 1 -u root -d -l 192.168.1.219 -p 11212 memcached -m 1 -u root -d -l 192.168.1.219 -p 11213 magent -u root -n 51200 -l 192.168.1.219 -p 12000 -s 192.168.1.219:11211 -s 192.168.1.219:11212 -b 192.168.1.219: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取出。
三、整個測試流程:
# telnet 192.168.1.219 12000 Trying 1192.168.1.219... Connected to 192.168.1。219. Escape character is '^]'. stats memcached agent v0.4 matrix 1 -> 192.168.1.219:11211, pool size 0 matrix 2 -> 192.168.1.219:11212, pool size 0 END set key1 0 0 5 reesun STORED set key2 0 0 6 reesun1 STORED quit Connection closed by foreign host. # telnet 192.168.1.219 11211 Trying 192.168.1.219... Connected to 192.168.1.219. Escape character is '^]'. get key1 END get key2 VALUE key2 0 6 reesun1 END quit Connection closed by foreign host. # telnet 192.168.1.219 11212 Trying 192.168.1.219... Connected to 1192.168.1.219. Escape character is '^]'. get key1 VALUE key1 0 5 reesun END get key2 END quit Connection closed by foreign host. # telnet 192.168.1.219 11213 Trying 192.168.1.219... Connected to 1192.168.1.219. Escape character is '^]'. get key1 VALUE key1 0 5 reesun END get key2 VALUE key2 0 6 reesun1 END quit Connection closed by foreign host. |
java端調用隻要對magent公布的IP和端口就可以