memcache在大型網站的應用策略memcache在大型網站的應用策略
今天看完了日本人mixi寫的“memcached全面剖析”的系列文章,結合我在項目中使用memcache的經驗,再談談memcache在大型網站中的應用策略。
【部署策略】
基于memcached的slab和dump的內存管理方式,它產生的內存碎片比較少,不需要OS去做繁雜的內存回收,所以它對CPU的占用率那是相當的低。所以建議將它跟占用CPU較高的WEB服務器一起使用來節省成本。當然如果你有大量的廉價PC,那用來專門做memcached服務器也不錯。由于32位操作系統中,每個進程最多只能使用2GB內存,所以如果你有大內存的話,可以以daemon的方式啟動兩個以上的memcached服務,或者干脆用64位的CPU和OS。
基于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支持分布式機制,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主要的作用是為減輕大訪問量對數據庫的沖擊,所以一般的邏輯是首先從memcached中讀取數據,如果沒有就從數據庫中讀取數據寫入到memcache中,等下一次讀取的時候就可以從memcached中讀取了。但在項目中的具體應用策略(也就是哪些數據應該緩存?怎么樣緩存?過期策略?)就是個問題了。它的一個總原則是將經常需要從數據庫讀取的數據緩存在memcached中。這些數據也分為幾類:
一、經常被讀取并且實時性要求不強可以等到自動過期的數據。例如網站首頁最新文章列表、某某排行等數據。也就是雖然新數據產生了,但對用戶體驗不會產生任何影響的場景。
這類數據就使用典型的緩存策略,設置一過合理的過期時間,當數據過期以后再從數據庫中讀取。當然你得制定一個緩存清除策略,便于編輯或者其它人員能馬上看到效果。
這類數據就使用典型的緩存策略,設置一過合理的過期時間,當數據過期以后再從數據庫中讀取。當然你得制定一個緩存清除策略,便于編輯或者其它人員能馬上看到效果。
二、經常被讀取并且實時性要求強的數據。比如用戶的好友列表,用戶文章列表,用戶閱讀記錄等。
這類數據首先被載入到memcached中,當發生更改(添加、修改、刪除)時就清除緩存。在緩存的時候,我將查詢的SQL語句md5()得到它的hash值作為key,結果數組作為值寫入memcached,并且將該SQL涉及的table_name以及hash值配對存入memcached中。當更改了這個表時,我就將與此表相配對的key的緩存全部刪除。
這類數據首先被載入到memcached中,當發生更改(添加、修改、刪除)時就清除緩存。在緩存的時候,我將查詢的SQL語句md5()得到它的hash值作為key,結果數組作為值寫入memcached,并且將該SQL涉及的table_name以及hash值配對存入memcached中。當更改了這個表時,我就將與此表相配對的key的緩存全部刪除。
三、統計類緩存,比如文章瀏覽數、網站PV等
此類緩存是將在數據庫的中來累加的數據放在memcached來累加。獲取也通過memcached來獲取。但這樣就產生了一個問題,如果memcached服務器down掉的話這些數據就有可能丟失,所以一般使用memcached的永固性存儲,這方面我們新浪使用memcachedb。
此類緩存是將在數據庫的中來累加的數據放在memcached來累加。獲取也通過memcached來獲取。但這樣就產生了一個問題,如果memcached服務器down掉的話這些數據就有可能丟失,所以一般使用memcached的永固性存儲,這方面我們新浪使用memcachedb。
四、活躍用戶的基本信息或者某篇熱門文章。
此類數據的一個特點就是數據都是一行,也就是一個一維數組,當數據被update時(比如修改昵稱、文章的評論數),在更改數據庫數據的同時,使用Memcache::replace替換掉緩存里的數據。這樣就有效了避免了再次查詢數據庫。
此類數據的一個特點就是數據都是一行,也就是一個一維數組,當數據被update時(比如修改昵稱、文章的評論數),在更改數據庫數據的同時,使用Memcache::replace替換掉緩存里的數據。這樣就有效了避免了再次查詢數據庫。
六、session數據
使用memcached來存儲session的效率是最高的。memcached本身也是非常穩定的,不太用擔心它會突然down掉引起session數據的丟失,即使丟失就重新登錄了,也沒啥。見[多服務器session共享之memcache共享]
使用memcached來存儲session的效率是最高的。memcached本身也是非常穩定的,不太用擔心它會突然down掉引起session數據的丟失,即使丟失就重新登錄了,也沒啥。見[多服務器session共享之memcache共享]
【總結】
通過以上的策略數據庫的壓力將會被大大減輕。檢驗你使用memcached是否得當的方法是查看memcached的命中率。有些策略好的網站的命中率可以到達到90%以上。
通過以上的策略數據庫的壓力將會被大大減輕。檢驗你使用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.
一、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.

浙公網安備 33010602011771號