Memcache分散式部署方案

cnbird發表於2011-11-10

 

前言
應該是很久之前,我開始研究Memcache,寫了一系列的學習心得,比如《Discuz!的Memcache快取實現》等。後面的好幾十條回覆也讓這篇文章成為了此部落格中頗受關注的一員。

同時在百度和Google,關鍵詞Memcache在長達一年多的時間裡佔據著第二位(第一位是官方),為很多需要了解或者應用Memcache的朋友提供了一些資訊,但是我始終覺著還不夠,於是本文誕生。

嘮嘮叨叨說了半天,如果你覺著前面囉嗦,請直接看最後一大段,那是本文的重點。

基礎環境
其實基於PHP擴充套件的Memcache客戶端實際上早已經實現,而且非常穩定。先解釋一些名詞,Memcache是danga.com的一個開源專案,可以類比於MySQL這樣的服務,而PHP擴充套件的Memcache實際上是連線Memcache的方式。

首先,進行Memcache被安裝具體可檢視:
Linux下的Memcache安裝:http://www.ccvita.com/257.html
Windows下的Memcache安裝:http://www.ccvita.com/258.html;
其次,進行PHP擴充套件的安裝,官方地址是http://pecl.php.net/package/memcache
最後,啟動Memcache服務,比如這樣


/usr/local/bin/memcached d p 11213 u
root
m 10 c 1024 t 8 P /tmp/memcached.pid 
/usr/local/bin/memcached d p 11214 u
root
m 10 c 1024 t 8 P /tmp/memcached.pid 
/usr/local/bin/memcached d p 11215 u
root
m 10 c 1024 t 8 P /tmp/memcached.pid

啟動三個只使用10M記憶體以方便測試。

分散式部署
PHP的PECL擴充套件中的memcache實際上在2.0.0的版本中就已經實現多伺服器支援,現在都已經2.2.5了。請看如下程式碼


$memcache = new Memcache; 
$memcache->addServer(`localhost`, 11213); 
$memcache->addServer(`localhost`, 11214); 
$memcache->addServer(`localhost`, 11215); 
$memStats =
$memcache
->getExtendedStats(); 
print_r($memStats);

通過上例就已經實現Memcache的分散式部署,是不是非常簡單。

分散式系統的良性執行
在Memcache的實際使用中,遇到的最嚴重的問題,就是在增減伺服器的時候,會導致大範圍的快取丟失,從而可能會引導資料庫的效能瓶頸,為了避免出現這種情況,請先看Consistent hashing演算法,中文的介紹可以參考這裡,通過存取時選定伺服器演算法的改變,來實現。

修改PHP的Memcache擴充套件memcache.c的原始碼中的


“memcache.hash_strategy” = standard


“memcache.hash_strategy” = consistent

重新編譯,這時候就是使用Consistent hashing演算法來尋找伺服器存取資料了。

有效測試資料表明,使用Consistent hashing可以極大的改善增刪Memcache時快取大範圍丟失的情況。
NonConsistentHash: 92% of lookups changed after adding a target to the existing 10
NonConsistentHash: 90% of lookups changed after removing 1 of 10 targets
ConsistentHash: 6% of lookups changed after adding a target to the existing 10
ConsistentHash: 9% of lookups changed after removing 1 of 10 targets


相關文章