1. 程式人生 > >Memcached叢集/分散式/高可用 及 Magent快取代理搭建過程 詳解

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/ 下

1cd /usr/local/
2mkdir ./magent
3cd ./magent
4wget -c http://memagent.googlecode.com/files/magent-0.6.tar.gz
5tar xzvf ./magent-0.6.tar.gz
6/sbin/ldconfig
7sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
8make
9cp ./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:

1magent -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);
5for ($i = 0; $i < 1000; $i++)
6{
7$memcache->set($i$i, 0, 1000);
8}

現在,程式碼還是那段程式碼,只不過連線的主機不是Memcached伺服器了,而是 Magent代理伺服器,給 addServer()方法傳參時,傳入的是Magent主機IP與埠!測試程式碼如下:

01$mem new \M