memcache在大型網站的應用策略memcache在大型網站的應用策略

今天看完了日本人mixi寫的“memcached全面剖析”的系列文章,結合我在項目中使用memcache的經驗,再談談memcache在大型網站中的應用策略。

【部署策略】  
  基於memcached的slab 和dump的內存管理方式,它產生的內存碎片比較少,不需要OS去做繁雜的內存回收,所以它對CPU的佔用率那是相當的低。所以建議將它跟佔用CPU較高 的WEB服務器一起使用來節省成本。當然如果你有大量的廉價PC,那用來專門做memcached服務器也不錯。由於32位操作系統中,每個進程最多隻能 使用2GB內存,所以如果你有大內存的話,可以以daemon的方式啓動兩個以上的memcached服務,或者乾脆用64位的CPU和OS。
【服務監控】   
  memcached支持分佈式機 制,php通過memcache::addserver來實現該機制,它實現瞭如果服務器列表中的一臺down掉的時候在參數 retry_interval指定的時間就不會再連接該服務器的機制。所以只要你在該時間段內重啓或者修復了該服務器,則不會對前端造成太大的影響。當然 了,如果你一直不去重啓該服務器的話,我測試過addserver再次連接一臺down掉的服務器的時間將比平時延長了1秒的時間。可以通過 addserver的最後一個參數failure_callback定義一個回調函數來實現郵件通知或者短信通知管理員的功能。  
  如果是手 工重啓,我建議將該值設置爲20分鐘。不過對於memcached進程死掉的服務器,只要重新啓動memcached,就可以正常運行,所以採用了監視 memcached進程並自動啓動的方法的效果最好。mixi推薦的工具:nagios,daemontool
【應用策略】   
  memcached主要的作用是 爲減輕大訪問量對數據庫的衝擊,所以一般的邏輯是首先從memcached中讀取數據,如果沒有就從數據庫中讀取數據寫入到memcache中,等下一次 讀取的時候就可以從memcached中讀取了。但在項目中的具體應用策略(也就是哪些數據應該緩存?怎麼樣緩存?過期策略?)就是個問題了。它的一個總 原則是將經常需要從數據庫讀取的數據緩存在memcached中。這些數據也分爲幾類:
一、經常被讀取並且實時性要求不強可以等到自動過期的數據。例如網站首頁最新文章列表、某某排行等數據。也就是雖然新數據產生了,但對用戶體驗不會產生任何影響的場景。
  這類數據就使用典型的緩存策略,設置一過合理的過期時間,當數據過期以後再從數據庫中讀取。當然你得制定一個緩存清除策略,便於編輯或者其它人員能馬上看到效果。
二、經常被讀取並且實時性要求強的數據。比如用戶的好友列表,用戶文章列表,用戶閱讀記錄等。
   這類數據首先被載入到memcached中,當發生更改(添加、修改、刪除)時就清除緩存。在緩存的時候,我將查詢的SQL語句md5()得到它的 hash值作爲key,結果數組作爲值寫入memcached,並且將該SQL涉及的table_name以及hash值配對存入memcached中。 當更改了這個表時,我就將與此表相配對的key的緩存全部刪除。
三、統計類緩存,比如文章瀏覽數、網站PV等
  此類緩存是將在數據 庫的中來累加的數據放在memcached來累加。獲取也通過memcached來獲取。但這樣就產生了一個問題,如果memcached服務器down 掉的話這些數據就有可能丟失,所以一般使用memcached的永固性存儲,這方面我們新浪使用memcachedb。
四、活躍用戶的基本信息或者某篇熱門文章。
  此類數據的一個特點就是數據都是一行,也就是一個一維數組,當數據被update時(比如修改暱稱、文章的評論數),在更改數據庫數據的同時,使用Memcache::replace替換掉緩存裏的數據。這樣就有效了避免了再次查詢數據庫。
六、session數據
  使用memcached來存儲session的效率是最高的。memcached本身也是非常穩定的,不太用擔心它會突然down掉引起session數據的丟失,即使丟失就重新登錄了,也沒啥。見[多服務器session共享之memcache共享 ]
【總結】
  
通過以上的策略數據庫的壓力將會被大大減輕。檢驗你使用memcached是否得當的方法是查看memcached的命中率。有些策略好的網站的命中率可以到達到90%以上。
【後記】
  
一、memcached暫時還不支持故障 轉移,希望在以後的版本中能支持該功能。當然你可以使用日本人平林幹雄的Tokyo Tyrant 來代替memcached,它支持memcached協議,支持永固性存儲和故障轉移。但我沒有在生產環境中使用過,也沒有相關的性能測試數據。以後會試 用一下這個東東。
  二、memcached不支持檢索的功能,在實際使用中比如我們想把一個IP表放在memcached中,來檢索某一個IP屬於那個地區的話,有了檢索功能就方便多了。希望他在以後的版本中能提供該功能。暫時可以通過排序存儲和二分法在客戶端實現。
  三、memcached1.2.2版本確實有不穩定的情況,有時候會出現DOWN機,強烈建議升級至1.2.6的版本。見官方說明:Version 1.2.6
released .  Major crash fixes, DTrace support, minor updates. If you have stability issues with any previous release, please upgrade to this one.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章