原文:
什麼是memcached
許多web應用程式都將資料儲存到rdbms中,應用伺服器從中讀取資料並在瀏覽器中顯示。但隨著資料量的增大,訪問的集中,就會出現rebms的負擔加重,資料庫響應惡化,**顯示延遲等重大影響。memcached是高效能的分布式記憶體快取伺服器。一般的使用目的是通過快取資料庫查詢結果,減少資料庫的訪問次數,以提高動態web應用的速度、提高擴充套件性。如圖:
memcached作為高速執行的分布式快取伺服器具有以下特點。
memcached的記憶體管理
最近的memcached預設情況下採用了名為slaballocatoion的機制分配,管理記憶體。在改機制出現以前,記憶體的分配是通過對所有記錄簡單地進行malloc和free來進行的。但是這中方式會導致記憶體碎片,加重作業系統記憶體管理器的負擔。
slab allocator的基本原理是按照預先規定的大小,將分配的記憶體分割成特定長度的塊,已完全解決記憶體碎片問題。slaballocation
的原理相當簡單。將分配的記憶體分割成各種尺寸的塊(chucnk),並把尺寸相同的塊分成組(chucnk的集合)如圖:
而且slab allocator 還有重複使用已分配記憶體的目的。也就是說,分配到的記憶體不會釋放,而是重複利用。
slab allocation 的主要術語
在slab 中快取記錄的原理
memcached根據收到的資料的大小,選擇最合適資料大小的slab (圖2)memcached中儲存著slab內空閒chunk的列表,根據該列表選擇chunk,然後將資料快取於其中。
memcached在資料刪除方面有效裡利用資源
memcached刪除資料時資料不會真正從memcached中消失。memcached不會釋放已分配的記憶體。記錄超時後,客戶端就無法再看見該記錄(invisible透明),其儲存空間即可重複使用。
lazyexpriationmemcached內部不會監視記錄是否過期,而是在get時檢視記錄的時間戳,檢查記錄是否過期。這種技術稱為lazyexpiration.因此memcached不會再過期監視上耗費cpu時間。
對於快取儲存容量滿的情況下的刪除需要考慮多種機制,一方面是按佇列機制,一方面應該對應快取物件本身的優先順序,根據快取物件的優先順序進行物件的刪除。
lru:從快取中有效刪除資料的原理
memcached會優先使用已超時的記錄空間,但即使如此,也會發生追加新紀錄時空間不足的情況。此時就要使用名為leastrecently used(lru)機制來分配空間。這就是刪除最少使用的記錄的機制。因此當memcached的記憶體空間不足時(無法從slabclass)獲取到新空間時,就從最近未使用的記錄中搜尋,並將空間分配給新的記錄。
memcached分布式
memcached雖然稱為「分布式「快取伺服器,但伺服器端並沒有「分布式」的功能。memcached的分布式完全是有客戶端實現的。現在我們就看一下memcached是怎麼實現分布式快取的。
例如下面假設memcached伺服器有node1~node3三颱,應用程式要儲存鍵名為「tokyo」「kanagawa」「chiba」「saitama」「gunma」的資料。
首先向memcached中新增「tokyo」。將「tokyo」傳給客戶端程式庫後,客戶端實現的演算法就會根據「鍵」來決定儲存資料的memcached伺服器。伺服器選定後,即命令它儲存「tokyo」及其值。
同樣,「kanagawa」「chiba」「saitama」「gunma」都是先選擇伺服器再儲存。
接下來獲取儲存的資料。獲取時也要將要獲取的鍵「tokyo」傳遞給函式庫。函式庫通過與資料儲存時相同的演算法,根據「鍵」選擇伺服器。使用的演算法相同,就能選中與儲存時相同的伺服器,然後傳送get命令。只要資料沒有因為某些原因被刪除,就能獲得儲存的值。
這樣,將不同的鍵儲存到不同的伺服器上,就實現了memcached的分布式。memcached伺服器增多後,鍵就會分散,即使一台memcached伺服器發生故障無法連線,也不會影響其他的快取,系統依然能繼續執行。
memcached的快取分布策略:
consistenthashing的簡單說明
consistent hashing如下所示:首先求出memcached伺服器(節點)的雜湊值,並將其配置到0~232的圓(continuum)上。 然後用同樣的方法求出儲存資料的鍵的雜湊值,並對映到圓上。然後從資料對映到的位置開始順時針查詢,將資料儲存到找到的第乙個伺服器上。如果超過232仍然找不到伺服器,就會儲存到第一台memcached伺服器上。
從上圖的狀態中新增一台memcached伺服器。餘數分布式演算法由於儲存鍵的伺服器會發生巨大變化而影響快取的命中率,但consistent hashing中,只有在continuum上增加伺服器的地點逆時針方向的第一台伺服器上的鍵會受到影響。
因此,consistent hashing最大限度地抑制了鍵的重新分布。 而且,有的consistenthashing的實現方法還採用了虛擬節點的思想。 使用一般的hash函式的話,伺服器的對映地點的分布非常不均勻。因此,使用虛擬節點的思想,為每個物理節點(伺服器) 在continuum上分配100~200個點。這樣就能抑制分布不均勻,最大限度地減小伺服器增減時的快取重新分布。
快取多副本
快取多副本主要是用於在快取資料存放時儲存快取資料的多個副本,以防止快取失效。快取失效發生在以下幾種情況:
在快取多副本的情況下,需要重新考慮快取的分布式分布策略。其次快取的多個副本實際本身是可能的多個讀的節點,可以做為分布式的並行讀,這是另外乙個可以考慮的問題。
快取資料的一致性問題
快取資料盡量唯讀,因此快取本身是不適合大量寫和更新操作的資料場景的。對於讀的情況下,如果存在資料變化,一種是同時更新快取和資料庫。一種是直接對快取資料進行失效處理。
Memcached 分布式快取
memcached是什麼?memcached 是乙個高效能的分布式記憶體物件快取系統,用於動態web應用以減輕資料庫負載。它通過在記憶體中快取資料和物件來減少讀取資料庫的次數,從而提供動態 資料庫驅動 的速度。memcached基於乙個儲存鍵 值對的hashmap。其守護程序 daemon 是用c寫...
分布式快取 Memcached
分布式快取出於如下考慮,首先是快取本身的水平線性擴充套件問題,其次是快取大併發下的本身的效能問題,再次避免快取的單點故障問題 多副本和副本一致性 分布式快取的核心技術包括首先是記憶體本身的管理問題,包括了記憶體的分配,管理和 機制。其次是分布式管理和分布式演算法,其次是快取鍵值管理和路由。原文 什麼...
Memcached 分布式快取
memcached 是乙個高效能的分布式 記憶體物件快取系統,用於動態web應用以減輕 資料庫負載。它基於乙個 儲存鍵 值對的 hashmap 其守護程序 daemon 是用 c寫的,但是 客戶端可以用任何語言來編寫,並通過memcached協議與守護程序通訊。memcached 通過在記憶體中快取...