《Memcached全面剖析》筆記

1 基礎

Memcached是以 LiveJournal 旗下 DangaInteractive 公司的 Brad Fitzpatric 爲首開發的一款高性能的分佈式內存緩存服務器。算法

1.1 特徵

  • 協議簡單:簡單的基於文本行的協議
  • 基於libevent事件處理
  • 內置內存存儲方式
  • memcached不互通訊的分佈式:」分佈式「沒有在服務器端實現,而是取決於客戶端。

memcached的分佈式

1.2 指令

保存數據

  • add('key', 'value' ,'expire'):key不存在則保存
  • replace('key', 'value', 'expire'):key存在則保存,會覆蓋舊值
  • set('key', 'value', 'expire'):直接保存

獲取數據

  • get('key')
  • get_multi('key'):獲取多個key

刪除數據

  • delete('key', 'block time'):能夠設置指定時間內禁止新增該key

增一/減一

  • incr('key')

2 內存存儲

Slab Allocation機制

問題背景:內存的分配是經過對全部記錄簡單地進行mallocfree來進行,但這種方式致使內存碎片,加劇操做系統內存管理器的負擔。緩存

機制原理:按照預先規定的大小,將分配的內存分割成特定長度的塊,以徹底解決內存碎片問題。服務器

The primary goal of the slabs subsystem in memecached was to eliminate memory fragmentation issues totally by using fixed-size memory chunks coming from a few predetermined size classes.分佈式

Slab Allocation 構造圖

如圖所示,Slab Allocation機制即將分配好的內存頁(Page)分割成各類尺寸的塊(Chunk),並把尺寸相同的塊組合成組(Slab Class)。memcached

Memcached會維護着一份Slab中空閒Chunk的列表,當每次存儲數據時,會根據數據大小選擇最合適的組(以減小空間浪費)。性能

Slab緩存數據原理

但即便使用了列表記錄空閒的塊,仍是沒法作到徹底消除空間的浪費,而最優的方案只能是減小各個塊之間的大小差距,從而可讓緩存的數據恰好選擇一個差異不大的塊進行存儲。而這個調優參數便是 Growth Factor 因子,默認值爲1.25。操作系統

3 刪除機制

memcached不會釋放已分配的內存,記錄超時後,客戶端就沒法再看見該記錄(invisible,透明),其存儲空間便可重複使用。code

同時,memcached內部不會監視記錄是否過時,而是在get請求訪問記錄時,檢查記錄的時間戳。該機制稱爲 Lazy Expiration(惰性過時)。cdn

刪除原理:採用 LRU(Least Recently Used)來分配空間。blog

4 分佈式算法

分佈式簡介:添加時

memcached是經過分佈式算法將入參映射到具體的存儲節點,從而實現分佈式存儲。

Memcached原始的分佈式是模運算。

特色:算法簡單、數據分散性優秀

缺點:當機器節點改變時,數據散列受到影響,從而緩存命中率會降低

算法改進:一致性Hash算法

一致性Hash基本原理

首先求出memcached服務器(節點)的哈希值,並將其配置到 0 ~ 2^32的圓(continuum)上。而後用一樣的方法求出存儲數據的鍵的哈希值,並映射到圓上。而後從數據映射到的位置開始順時針查找,將數據保存到找到的第一個服務器上。若是超過 2^32 仍然找不到,就會保存到第一臺memcached服務器上。

一致性Hash:添加服務器

當往上圖狀態添加一臺服務器時,只有在continuum上增長服務器的地點逆時針方向的第一臺服務器的鍵會受到影響。

5 應用和兼容程序

參考

  • 《Memcached全面剖析》 —— 長野雅廣、前阪撤
相關文章
相關標籤/搜索