Memcached叢集/分散式/高可用 及 Magent快取代理搭建過程 詳解
當網站訪問量達到一定時,如何做Memcached叢集,又如何高可用,是接下來要討論的問題。
有這麼一段文字來描述“Memcached叢集”
Memcached如何處理容錯的?
不處理!:) 在memcached節點失效的情況下,叢集沒有必要做任何容錯處理。如果發生了節點失效,應對的措施完全取決於使用者。節點失效時,下面列出幾種方案供您選擇:
* 忽略它! 在失效節點被恢復或替換之前,還有很多其他節點可以應對節點失效帶來的影響。
* 把失效的節點從節點列表中移除。做這個操作千萬要小心!在預設情況下(餘數式雜湊演算法),客戶端新增或移除節點,會導致所有的快取資料不可用!因為雜湊參照的節點列表變化了,大部分key會因為雜湊值的改變而被對映到(與原來)不同的節點上。
* 啟動熱備節點,接管失效節點所佔用的IP。這樣可以防止雜湊紊亂(hashing chaos)。
根據上面的說法,Memcached其中一個節點失效以後,memcached本身是沒有任何策略維持失效轉發的,這對於大型系統是一個無法接受的事實。
舉例說明:
在客戶端連線的部分寫入多個伺服器端的ip地址,客戶端將會自動的把快取資料分佈的放在每個不同的機器上,如圖所示:
缺陷說明:
如果其中一個快取節點的機器down機,那麼客戶端存入的快取資料將會丟失一部分,就是圖中紅色字型描述的“Losed 33% Cache Data”,也就是說那部分資料徹底沒有了!如果是使用者的關鍵性資訊那麼就玩大了,如圖所示:
解決方案:
採用 Magent 快取代理,防止單點現象,快取代理也可以做備份,通過客戶端連線到快取代理伺服器,快取代理伺服器連線快取伺服器,快取代理伺服器可以連線多臺Memcached機器,如下圖所示,配件清單如下:
Magent代理伺服器:2臺,分別為 192.168.1.2:12000、192.168.1.3:12000
Memcached主伺服器:3臺,分別為 192.168.1.4:11211、192.168.1.5:11211、192.168.1.6:11211
Memcached備伺服器:2臺,分別為 192.168.1.5:11211、192.168.1.6:11211
搭建Memcahced伺服器
在 192.168.1.4、192.168.1.5、192.168.1.6、192.168.1.7、192.168.1.8 上分別編譯安裝並執行Memcached ,
搭建Magent代理伺服器:
在 192.168.1.2、192.168.1.3 上分別 編譯安裝 magent [CSDN下載 Magent]
#編譯安裝安裝magent到 /usr/local/ 下
1 | cd /usr/ local / |
2 | mkdir ./magent |
3 | cd ./magent |
4 | wget -c http://memagent.googlecode.com/files/magent-0.6. tar .gz |
5 | tar xzvf ./magent-0.6. tar .gz |
6 | /sbin/ldconfig |
7 | sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile |
8 | make |
9 | cp ./magent /usr/bin/magent |
注意:編譯的過程中遇到了好幾處錯誤,錯誤解決過程,請參考:
magent命令詳解:
-h this message
-u uid
-g gid
-p port, default is 11211. (0 to disable tcp support)
-s ip:port, set memcached server ip and port
-b ip:port, set backup memcached server ip and port
-l ip, local bind ip address, default is 0.0.0.0
-n number, set max connections, default is 4096
-D do not go to background
-k use ketama key allocation algorithm
-f file, unix socket path to listen on. default is off
-i number, max keep alive connections for one memcached server, default is 20
-v verbose
在 192.168.1.2、192.168.1.3 上分別執行 magent:
1 | magent -u root -n 51200 -l 192.168.1.2 -p 12000 -s 192.168.1.4:11211 -s 192.168.1.5:11211 -s 192.168.1.6:11211 -b 192.168.1.7:11211 -b 192.168.1.8:11211 |
測試快取資料的分佈情況:
以前,我們用PHP連線多臺Memcached伺服器,做分散式快取時,參考程式碼如下:
1 | $memcache = new Memcache; |
2 | $memcache ->addServer( 'localhost' , 11211); |
3 | $memcache ->addServer( 'localhost' , 11212); |
4 | $memcache ->addServer( 'localhost' , 11213); |
5 | for ( $i = 0; $i < 1000; $i ++) |
6 | { |
7 | $memcache ->set( $i , $i , 0, 1000); |
8 | } |
現在,程式碼還是那段程式碼,只不過連線的主機不是Memcached伺服器了,而是 Magent代理伺服器,給 addServer()方法傳參時,傳入的是Magent主機IP與埠!測試程式碼如下:
01 | $mem = new \M
|