分布式快取系統 Memcached 整體架構

2021-07-31 05:14:52 字數 3731 閱讀 9475

別人的csdn    

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

什麼是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伺服器發生故障無法連線,也不會影響其他的快取,系統依然能繼續執行。

consistent hashing的簡單說明

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

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

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

memcached 安裝及啟動指令碼 

php中使用memcached的效能問題 

ubuntu下安裝memcached及命令解釋 

memcached的安裝和應用 

使用nginx+memcached的小儲存方案 

memcached使用入門 

快取多副本

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

1.    快取超時被移除(正常失效)

2.    快取由於儲存空間限制被移除(異常失效)

3.    由於快取節點變化而導致的快取失效(異常失效)

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

快取資料的一致性問題

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

分布式快取 memcache學習

1.使用分布式快取是為了解決多台機器共享資訊的問題,通過訪問乙個ip和埠來可以訪問不同的iis伺服器 2.memcache基礎原理 在socket伺服器端儲存資料是以鍵值對的形式儲存 記憶體處理的演算法 本質就是乙個大的雜湊表。key最大長度是255個字元,value最大為1mb 記憶體模型 mem...

memcache的分布式快取問題

有關使用memcache做分布式快取的方案,簡單寫下來,僅供參考。memcache是優異的快取解決方案,很多專案都有使用。memcache服務本身並不具備分布式快取的能力,它提供的就是對對的訪問能力,分布式的能力則完全來自於客戶端。現在有不少memcache的客戶端lib採用consistent h...

分布式快取Memcache和Redis

針對於現在計算機的cpu和網路設施,對應用程式來說,執行效率的瓶頸,已經不是 的長度 實現同乙個功能 和頻寬了,而是,訪問資源的過程,即 讓我們的程式慢下來的罪魁禍首就是io操作。程式從硬碟上讀取資料是乙個非常花費時間的操作,因為我們現在所使用的硬碟是機械式的,你想機械的執行速度和電的速度,那是乙個...