系統快取全解析7:第三方分散式快取解決方案 Memcached和Cacheman

iDotNetSpace發表於2009-07-02

Memcached — 分散式快取系統

1.Memcached是什麼?

    Memcached是高效能的,分散式的記憶體物件快取系統,用於在動態應用中減少資料庫負載,提升訪問速度。Memcached通過在記憶體裡維護一個統一的巨大的hash表,它能夠用來儲存各種格式的資料,包括影像、視訊、檔案以及資料庫檢索的結果等。MemcachedDanga 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.NETAPI就像和內建的API一樣。這讓開發人員很容易地轉換到Memcached上,僅僅通過在程式碼中查詢和替換即可實現。

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

     Memcached是基於Linux執行的,你可以在BSD的許可協議下使用Memcached。他也提供了針對C#的客戶端以及PerlPythonPHPJava和其他語言的APIhttp://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應用時,可以帶來26倍的效能提升。

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

     簡單介紹一下 Cacheman 這個專案。資料主要來源於 Krishnan的部落格對Cacheman的介紹。

Cacheman是一個基於Windows平臺的快速分散式雜湊表。是由純託管程式碼實現。中間擱置了有幾個月,直到最近才開始重新上馬這個專案,極可能就是因為Popfly專案需要的緣故才開始著手的。

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

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

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

目前最新的版本是0.0.2版 :http://www.sriramkrishnan.com/code/

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-608136/,如需轉載,請註明出處,否則將追究法律責任。

相關文章