分布式快取 Memcached

2021-07-09 08:47:25 字數 3520 閱讀 3304

分布式快取出於如下考慮,首先是快取本身的水平線性擴充套件問題,其次是快取大併發下的本身的效能問題,再次避免快取的單點故障問題(多副本和副本一致性)。分布式快取的核心技術包括首先是記憶體本身的管理問題,包括了記憶體的分配,管理和**機制。其次是分布式管理和分布式演算法,其次是快取鍵值管理和路由。

原文:什麼是memcached

許多web 應用程式都將資料儲存到rdbms中,應用伺服器從中讀取資料並在瀏覽器中顯示。但隨著資料量的增大,訪問的集中,就會出現rebms的負擔加重,資料庫響應惡化,**顯示延遲等重大影響。memcached是高效能的分布式記憶體快取伺服器。一般的使用目的是通過快取資料庫查詢結果,減少資料庫的訪問次數,以提高動態web 應用的速度、提高擴充套件性。如圖:

memcached作為高速執行的分布式快取伺服器具有以下特點。

memcached的記憶體管理

最近的memcached預設情況下採用了名為slab allocatoion的機制分配,管理記憶體。在改機制出現以前,記憶體的分配是通過對所有記錄簡單地進行malloc和free來進行的。但是這中方式會導致記憶體碎片,加重作業系統記憶體管理器的負擔。

slab allocator的基本原理是按照預先規定的大小,將分配的記憶體分割成特定長度的塊,已完全解決記憶體碎片問題。slab allocation 

的原理相當簡單。將分配的記憶體分割成各種尺寸的塊(chucnk),並把尺寸相同的塊分成組(chucnk的集合)如圖:

而且slab allocator 還有重複使用已分配記憶體的目的。也就是說,分配到的記憶體不會釋放,而是重複利用。

slab allocation 的主要術語

在slab 中快取記錄的原理

memcached根據收到的資料的大小,選擇最合適資料大小的slab (圖2) memcached中儲存著slab內空閒chunk的列表,根據該列表選擇chunk,然後將資料快取於其中。

memcached在資料刪除方面有效裡利用資源

memcached刪除資料時資料不會真正從memcached中消失。memcached不會釋放已分配的記憶體。記錄超時後,客戶端就無法再看見該記錄(invisible 透明),其儲存空間即可重複使用。

lazy expriationmemcached內部不會監視記錄是否過期,而是在get時檢視記錄的時間戳,檢查記錄是否過期。這種技術稱為lazy expiration.因此memcached不會再過期監視上耗費cpu時間。

對於快取儲存容量滿的情況下的刪除需要考慮多種機制,一方面是按佇列機制,一方面應該對應快取物件本身的優先順序,根據快取物件的優先順序進行物件的刪除。

lru:從快取中有效刪除資料的原理

memcached會優先使用已超時的記錄空間,但即使如此,也會發生追加新紀錄時空間不足的情況。此時就要使用名為least recently used (lru)機制來分配空間。這就是刪除最少使用的記錄的機制。因此當memcached的記憶體空間不足時(無法從slab class)獲取到新空間時,就從最近未使用的記錄中搜尋,並將空間分配給新的記錄。

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的快取分布策略:

consistent hashing的簡單說明

consistent hashing如下所示:首先求出memcached伺服器(節點)的雜湊值, 並將其配置到0~232的圓(continuum)上。 然後用同樣的方法求出儲存資料的鍵的雜湊值,並對映到圓上。 然後從資料對映到的位置開始順時針查詢,將資料儲存到找到的第乙個伺服器上。 如果超過232仍然找不到伺服器,就會儲存到第一台memcached伺服器上。

從上圖的狀態中新增一台memcached伺服器。餘數分布式演算法由於儲存鍵的伺服器會發生巨大變化 而影響快取的命中率,但consistent hashing中,只有在continuum上增加伺服器的地點逆時針方向的 第一台伺服器上的鍵會受到影響。

因此,consistent hashing最大限度地抑制了鍵的重新分布。 而且,有的consistent hashing的實現方法還採用了虛擬節點的思想。 使用一般的hash函式的話,伺服器的對映地點的分布非常不均勻。 因此,使用虛擬節點的思想,為每個物理節點(伺服器) 在continuum上分配100~200個點。這樣就能抑制分布不均勻, 最大限度地減小伺服器增減時的快取重新分布。

快取多副本

快取多副本主要是用於在快取資料存放時儲存快取資料的多個副本,以防止快取失效。快取失效發生在以下幾種情況:

在快取多副本的情況下,需要重新考慮快取的分布式分布策略。其次快取的多個副本實際本身是可能的多個讀的節點,可以做為分布式的並行讀,這是另外乙個可以考慮的問題。

快取資料的一致性問題

快取資料盡量唯讀,因此快取本身是不適合大量寫和更新操作的資料場景的。對於讀的情況下,如果存在資料變化,一種是同時更新快取和資料庫。一種是直接對快取資料進行失效處理。

Memcached 分布式快取

memcached是什麼?memcached 是乙個高效能的分布式記憶體物件快取系統,用於動態web應用以減輕資料庫負載。它通過在記憶體中快取資料和物件來減少讀取資料庫的次數,從而提供動態 資料庫驅動 的速度。memcached基於乙個儲存鍵 值對的hashmap。其守護程序 daemon 是用c寫...

Memcached 分布式快取

memcached 是乙個高效能的分布式 記憶體物件快取系統,用於動態web應用以減輕 資料庫負載。它基於乙個 儲存鍵 值對的 hashmap 其守護程序 daemon 是用 c寫的,但是 客戶端可以用任何語言來編寫,並通過memcached協議與守護程序通訊。memcached 通過在記憶體中快取...

分布式快取 Memcached

分布式快取出於如下考慮,首先是快取本身的水平線性擴充套件問題,其次是快取大併發下的本身的效能問題,再次避免快取的單點故障問題 多副本和副本一致性 分布式快取的核心技術包括首先是記憶體本身的管理問題,包括了記憶體的分配,管理和 機制。其次是分布式管理和分布式演算法,其次是快取鍵值管理和路由。原文 什麼...