系統緩存全解析7:第三方分佈式緩存解決方案 Memcached和Cacheman

 

系統緩存全解析7:第三方分佈式緩存解決方案 Memcached和Cacheman

Memcached — 分佈式緩存系統

1.Memcached 是什麼?

Memcached是高性能的,分佈式的內存對象緩存系統,用於在動態應 用中減少數據庫負載,提升訪問速度。Memcached通過在內存裏維護一個統一的巨大的hash表,它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。Memcached由Danga Interactive最 初爲了加速 LiveJournal網站訪問速度而開發的,後 來被很多大型的網站採用。起初作者編寫它可能是爲了提高動態網頁應用,爲了減輕數據庫檢索的壓力,來做的這個緩存系統。它的緩存是一種分佈式的,也就是可 以允許不同主機上的多個用戶同時訪問這個緩存系統,這種方法不僅解決了共享內存只能是單機的弊端, 同時也解決了數據庫檢索的壓力,最大的優點是提高了訪問獲取數據的速度!基於memcached作 者對分佈式cache的理解和解決方案。memcached完 全可以用到其他地方 比如分佈式數據庫,分佈式計算等領域。Memcached將數據庫負載大幅度 降低,更好的分配資源,更快速訪問。

2.Memcached 工作機制

通過在內存中開闢一塊區域來維持一個大的hash表來加快頁面訪問速度,和數據庫是獨立的。但是目 前主要用來緩存數據庫的數據。允許多個server通過網絡形成一個大的hash,用戶不必關心數據存放在哪,只調用相關接口就可。存放在內存的數據通過 LRU算法進行淘汰出內存。同時可以通過刪除和設置失效時間來淘汰存放在內存的數據。

現在一些.NET開發人員開始放棄ASP.NET內置的緩存機 制,轉而使用Memcached——一種分佈式的內存緩存系統。當運行在單獨的Web服務器上,你可以很容易地清除一個已經確認被改變了的緩存。可惜,ASP.NET沒 有一個很好的方法來支持多服務器。每個服務器上的緩存都對其他緩存的改變一無所知。

ASP.NET允許通過基於文件系統和數據庫表的觸發器來作廢一個緩存。 然而,這也存在問題,比如數據庫觸發器需要使用昂貴的輪詢,以及觸發器本身冗長的編程。但是,我們還是有其他的選擇的。

不像ASP.NET內置的緩存機制,Memcached是一 個分佈式的緩存系統。任何Web服務器都能更新或刪除一個緩存項,並且所有其他的服務器都能在下次 訪問這些緩存項的時候自動獲取到更新的內容。這是通過把這些緩存項存儲在一個或者多個緩存服務器上來實現的。每一個緩存項都根據它的關鍵字的哈希值來分配 到一個服務器上。

表面看來,Memcached針對ASP.NET的API就像和內置的API一樣。這讓開發人員很容易地轉 換到Memcached上,僅僅通過在代碼中查找和替換即可實現。

一個被推薦的解決方案是不根據緩存項的關鍵字來生成哈希鍵值。這將允許開發人員能夠讓一個給定頁面中需要的所有緩存項,儘量存放在同一個服務器上。可惜, 基於數據保存的地方而不是基於緩存項自身的關鍵字來生成哈希鍵,很容易產生錯誤,需要仔細來實現(這個算法)。

Memcached是基於Linux運 行的,你可以在BSD的許可協議下使用Memcached。 他也提供了針對C#的客戶端以及Perl、Python、PHP、Java和其他語言的API:http://www.danga.com/memcached/apis.bml 。 還有一個Win32的移植版本(http://jehiah.cz/projects/memcached-win32/ ), 可以讓Memcached運行在非Linux的 機器上。

Cacheman — .NET架構下的分佈式緩存項目

Cacheman據說是由微軟旗下的 Popfly 項目組成員 Sriram Krishnan 的 作品。是他用業餘時間開發的。最新的情況是,微軟的 Popfly 網站已經“悄悄地”的做了更 新,就是採用了 Krishnan 的 Cacheman, 更新了緩存機制。該項緩存技術更新帶來的性能提升非常顯著,根據Popfly團隊中的 John Montgomery 的說法:加載一個已有的Mashup應 用時,可以帶來2到6倍的性能提升。

這些說法也得到了 Krishnan 本人的確認。他提到這是Cacheman 的 第一次的實際應用,並自豪的說 Cacheman 不費吹灰之力就拿下了 Popfly 的全部訪問量。

簡單介紹一下 Cacheman 這個項目。資料主要來源於 Krishnan的 博客對Cacheman的介紹。

Cacheman是一個基於Windows平臺的快速分佈式 哈希表。是由純託管代碼實現。中間擱置了有幾個月,直到最近纔開始重新上馬這個項目,極可能就是因爲Popfly項 目需要的緣故纔開始着手的。

Krishnan本人對 memcached 很感興趣,於是創建了 Cacheman。Cacheman上有很多 memcached 的影 子,比如與memcached相似的文本通訊協議。Cacheman的 通訊協議公開,任何人可以根據自己偏愛的語言環境寫客戶端。 Krishnan 在自己家用電腦(2.4GHz Intel Core 2 帶2GB內 存)上進入測試,達到了每秒16000次左右的請求,並且還是服務器與客戶端都是在同一臺服務器下 完成的。

現這款產品還不太完善,作者自身也提 到:在Cacheman做指定key的GET/SET/DELETE操作時,客戶端需要弄清需要與哪一臺Cacheman服 務器通訊,爲此要對該key做一個快速FNV哈 希然後求餘得到應該和幾臺服務器中的哪臺服務器通訊。但該法的缺點在於新增或刪除一個服務器節點時,緩存節點需要大規模遷移。修復該問題需要一致性的哈希 算法,作者表示還沒有時間解決此事。作者提出了採用中心架構的“主緩存服務器”的解決辦法,讓客戶端輪詢主緩存服務器來獲取應該與那個緩存服務器通訊,但 他也覺的這樣做增加了複雜性,會帶來些新問題。

可以感覺到,由於 Cacheman 這個個人項目已經介入到 Popfly 這 個正式產品中,可能很快就會被微軟吸納爲正式產品,因此如果有人採用這個產品做自己緩存的解決方案的話,應該不必太擔心後續的產品升級及文檔支持服務,它 的未來前途值的期待。說不定 Krishnan 會從 Popfly 項目脫身出來專職負責這個 Cacheman 項目。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章