memcached的簡單剖析及試用

1、 Memcached是什麼?

memcached是高性能的分佈式內存緩存服務器。用於動態web應用以減輕數據庫的負載。

2、 Memcached的特性

1) 協議:它是基於文本行的協議。

2) 基於Libevent的事件處理。

3)內存存儲方式:它將數據保存在內存中,因此重新啓動mc或者服務器的時候數據會丟失。目前Mc中採用Slab Allocatior機制分配、管理內存。

Slab Allocation機制出現之前,內存的分配是通過對所有記錄簡單地進行malloc和free來進行的。 但是,這種方式會導致內存碎片,加重操作系統內存管理器的負擔,最壞的情況下, 會導致操作系統比memcached進程本身還慢。 

Slab Allocator採用按照預先規定的大小,將分配的內存分割成各種尺寸的塊(chunk), 並把尺寸相同的塊分成組(chunk的集合)(圖1) 以完全解決內存碎片問題。

Slab Allocato的構造圖

Slab Allocatior的基本原理是:Slab Allocatior按照預先規定的大小,將分配的內存分割成各種特定長度的塊,並把尺寸相同的塊分成組,mc每次根據收到的數據的大小,選擇最適合數據大小的slab,將其保存在slab內空閒的chunk的列表中。選擇存儲記錄的組的方式如圖所示:

圖 選擇存儲記錄的組的方式

分配給Slab分配的默認內存空間是1MB,因此一般存儲的信息的value值要小於等於1MB。Chunk是用於緩存記錄的存儲空間,它的大小可以通過Growth Factor控制,即命令下通過$ memcached -f 2 –vv來修改chunk的大小。

Slab Allocator的缺點:由於分配的是特定長度的內存,因此無法有效的利用分配的內存。通過預先估計系統中存入的數據的大小,只要使用適合數據大小的組的列表,就可以減少浪費。

4)分佈式

根據鍵值來決定數據所在的服務器,將數據存儲於不同的服務器中,而且在mc的分佈式處理時一般有根據餘數計算分散和Consistent Hashing兩種算法。

根據餘數計算分散:也就是“根據服務器臺數的餘數進行分散”。 求得鍵的整數哈希值,再除以服務器臺數,根據其餘數來選擇服務器。

它的不足是添加或者減少一臺服務器時,命中率會明顯降低,這樣會導致瞬間db的壓力增高。

Consistent Hashing:首先求出memcached服務器(節點)的哈希值, 並將其配置到0~232的圓(continuum)上。 然後用同樣的方法求出存儲數據的鍵的哈希值,並映射到圓上。 然後從數據映射到的位置開始順時針查找,將數據保存到找到的第一個服務器上。 如果超過232仍然找不到服務器,就會保存到第一臺memcached服務器上。基本原理如下圖所示:

Consistent Hashing 的基本原理

它添加或者去掉一個服務器的時候,只會影響逆時針方向的第一個服務器的鍵的情況。添加或者移除圖如下。

圖 Consistent Hashing 添加服務器

3mc的刪除機制

mc分配的資源不會釋放,只是下次數據進來的時候重複寫在已分配的資源上。Mc內部也不會實時監控記錄是否過期,而是在get的時候檢查數據是否過期,如果已過期,將該鍵值的數據設爲invisible,使取不到數據。

Mc有寫入時,會優先使用已超時的記錄的空間,但即使如此,也會發生追加新記錄時空間不足的情況, 此時就要使用名爲 Least Recently UsedLRU)機制來分配空間。 顧名思義,這是刪除最近最少使用的記錄的機制。 因此,當memcached的內存空間不足時(無法從slab class 獲取到新的空間時),就從最近未被使用的記錄中搜索,並將其空間分配給新的記錄。

但是在啓動的時候使用-M 就會禁止在空間不足時使用LUR機制分配空間

4mc的使用

    1啓動 memcached

./memcached -d -m 2048 -l 10.0.0.40 -p 11211

    2) 連接到 memcached

telnet localhost 11211

如果一切正常,則應該得到一個 telnet 響應,它會指示 Connected to localhost(已經連接到 localhost)。如果未獲得此響應,則應該返回之前的步驟並確保 libevent 和 memcached 的源文件都已成功生成。

  3)基本 memcached 客戶機命令

您將使用五種基本 memcached 命令執行最簡單的操作。這些命令和操作包括:

set

add

replace

get

delete

gets

cas

使用cas是爲了防止多個用戶同時寫入的時候,舊的數據覆蓋最新的寫入,所以用cas,傳入最近gets到的標誌,這樣在cas的時候,如果判斷不是最新的,則丟棄,只有最新的數據才能寫入。

    4)緩存管理命令

最後兩個 memcached 命令用於監控和清理 memcached 實例。它們是 stats 和 flush_all 命令。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章