學習筆記之Memcached理

學習筆記之Memcached理
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

0x00 Memcached簡述

Memcached是一套高效能的分散式記憶體物件快取系統,用於在動態系統中減少資料庫負載,提升效能。

0x01 Memcached特性

基於libevent的事件處理

內建記憶體儲存方式SLab Allocation機制

並不單一的資料刪除機制

基於客戶端的分散式系統

0x02 高效能的基礎:libevent事件處理

Libevent 是一個用C語言編寫的、輕量級的開源高效能網路庫,主要有以下幾個亮點:事件驅動( event-driven),高效能;輕量級,專注於網路,不如 ACE 那麼臃腫龐大;原始碼相當精煉、易讀;跨平臺,支援 Windows、 Linux、 *BSD 和 Mac Os;支援多種 I/O 多路複用技術, epoll、 poll、 dev/poll、 select 和 kqueue 等;支援 I/O,定時器和訊號等事件;註冊事件優先順序。

以上引自百度百科,在不支援I/O多路複用的情況下,一個執行緒同時只能處理一個socket檔案操作符,所以當一個任務未完成時,執行緒需要等待任務的處理,這種處理模型效率低下。而I/O多路複用無需等待任務完成,而是將所有任務維護在一個I/O組中,在等待過程中執行緒可以去處理其他的任務,當某個任務完成後,再去操作該socket操作符。值得一提的是,在I/O多路複用技術中,epoll是非常棒的,相比於select模型,epoll沒有檔案操作符數量的限制;並且select模型是將所有操作符維護在一個I/O組中,當有socket資料可操作時,執行緒需要在組中尋找哪個檔案操作符可操作,而epoll只將可操作的socket檔案操作符給執行緒,執行緒無需自己尋找,可以直接操作該socket,提高了處理效能。

所以,使用libevent時間處理模型,非常好的提升了memcached的效能。

0x03 SLab Allocation機制

在memcached中,記憶體不是直接C語言提供的malloc() free() 進行管理的,因為原生的記憶體管理方式會造成記憶體碎片,會加重記憶體管理器的記憶體管理負擔。而SLab Allocation機制完美的解決了記憶體碎片化的問題。

a.解決記憶體碎片化

SLab Allocator 在初始化時,通過將記憶體分配成預先設定的大小,將這些記憶體分割成特定長度的塊(chunk),並把尺寸相同的chunk分成一個組,也就是chunk集合,而這種方式就解決了記憶體碎片化的問題。

b.記憶體預分配

在需要儲存快取資料時,memcached會在chunk中選擇與所存資料大小最接近的chunk,並將資料儲存到該chunk中,這樣不需要每次在儲存資料時,都向作業系統申請空間,提升了memcached的處理效能。

c.記憶體重複利用

當儲存的資料過期後,memcached不會釋放該資料的所佔用的記憶體,而僅僅是將該資料標記為不可用,當有新資料需要儲存時,memcached會將資料重新儲存到該空間中,用這種方式對記憶體進行重複利用。

d.缺點

因為Slab Allocator將記憶體分割成固定大小的塊,當儲存的資料小於chunk的長度,會導致該chunk剩餘空間的浪費。例如:當一個資料佔用60K,而最接近的chunk長度為64K,此時就有4K的空間造成浪費。而目前僅有的調優方案是調整Growth Factor因子,讓chunk的大小儘可能的接近,減少空間的浪費。

0x04 memached的刪除機制
a.不會真正刪除記錄

當儲存在memcached中的記錄過期時,memcached不會釋放該記憶體,而是讓客戶端對該記錄不可見。留下記憶體來,讓之後的儲存記錄進行記憶體重複利用。

b.Lazy Expiration(懶過期機制)

memcached為了提升效能,在內部不會對儲存在memcached中的記錄進行監視,而是在每次get資料的時候,對該記錄的過期時間進行校驗,當記錄過期,則不返回資料。

c.LRU(最近最少使用)

雖然memcached擁有記憶體重複利用的機制,但是進行大量資料快取時,還是會出現記憶體吃滿,memcached無法在SLab中獲取到空閒的記憶體,在這種情況下,memcached會觸發LRU,會在最近未被使用的記錄中進行搜尋,並將這些空間分配給新的記錄。

0x05 memcached的分散式

不同於其他軟體的分散式,memcached的分散式不存在於服務端,而是完全由客戶端進行分散式的處理。這樣的好處是,減少memcached服務端之間的網路連線,當某一個伺服器宕機時,不至於影響其他機器的正常使用。

a.根據餘數計算分散

通過crc32()計算出鍵的整數雜湊值,然後除以伺服器的臺數,求得餘數進行伺服器節點的選擇,此種方式的優點是,簡單易操作,並且資料的分散性也非常優秀。但缺點是,當改變伺服器的數量時,快取重組的代價巨大,在此過程中快取的命中率急劇下降。

b.Consistent Hashing(一致性雜湊)

首先求出memcached伺服器節點的雜湊值,並將其分配到一個0~2^32的圓上,我們稱該這個圓為值域,之後通過同樣的計算方式求出鍵的雜湊值,並將值對映到圓上,然後從資料對映到的位置開始順時針尋找,並將資料儲存到找到的第一個伺服器節點上,如果找到2^32仍然找不到就將資料儲存到第一臺memcached機器上。

當新增一臺新機器時,通過同樣的hash演算法將該機器對映到圓上,影響的僅僅是新機器的節點到它的上一個節點之間的資料。

當刪除一臺機器時,同樣也僅僅影響對映到刪除的機器和它的上一臺機器之間的資料,而不會造成大面積的快取重組即rehash.

0x06 擴充套件閱讀

memcached完全剖析

使用 libevent 和 libev 提高網路應用效能

高效能IO模型淺析

備註:資源和圖片等均來自網路

原文作者:我才是二亮
原文連結:http://blog.2liang.me/2016/11/28/learn-memcached-principle/
轉載請在正文中標註並保留原文連結、作者等資訊。

相關文章

伺服器 最新文章