Memcached是一個分布式的高性能內存對象緩存系統,可以緩存數據,如果沒有它,就必須從數據庫中獲取數據,加重數據庫的負擔.
減輕數據庫負載,減少應用程序對數據庫的調用,加快了數據的訪問.
即使是通過在硬盤上設立高速緩存(cache)的方式,也無法滿足海量的數據查詢需求。一個典型的實例就是搜索網站,在某些時刻,1s內服務器收到的查詢請求會達到千萬級別。
在硬盤表現得日益無力時,人們自然而然就想到了速度更快的內存。Memcached系統就是這種思路的產物。把頻繁使用的數據放入內存,在CPU收到數據請求后,就可以直接從內存中返回所需要的結果,而不必訪問硬盤。由于內存在訪問速度上比硬盤快好幾個數量級,因此這種方式就可以大大提高數據庫運行的速度和效率。
通過在內存里同一維護一個巨大的hashtable,Memcached能夠存儲各種格式的數據
Memcached的緩存系統是分布式的,也就是允許在不同的主機上的多個用戶同時訪問這個系統.這種方式不僅解決了以往只能單機共享的缺憾,還減輕了數據庫的壓力,同時提高了訪問并獲取數據的速度
Memcached緩存技術的特點
1.協議簡單
服務器與客戶端使用簡單的基于文本的協議相互通信.
2.使用了基于libevent的事件處理方法
libevent是一個程序庫,能吧linux李痛得kqueue等事件處理功能封裝成一個同一的接口.
3.基于key-value的數據管理
Memcached在實際應用中,以守護進程daemon的形式駐留在服務器內存中,等待客戶端的連接.通信時,客戶端首先與服務器建立連接,隨后存取數據
4.自行管理內存
Memcached緩存給系統的基礎是內存,Mem保存的數據都存儲在Mem內置的內存存儲空間中,而不是文件,這就是快速的原因
Memcached的內存管理算法Slab Allocator
1)工作原理
初衷:減少內存碎片,提高工作效率
實現:事先將系統分配給Memcached的內存劃分為許多下該桶長度的頁(默認1M)
然后將不同的頁劃分為不同長度的塊(chunk)
2)通過Slab Allocator緩存記錄
Memcached收到一條數據時,會根據數據大小選擇何時的塊進行存儲.Memcached中維持一張表(FreeList[])記錄空閑塊信息.
通過這種方法,Memcached成功避免malloc和alloc式的內存管理;同時,通過固定內存塊管理,避免了內存碎片的產生.
3)Slab Allocator的缺點
解決了內存碎片的問題,但是也帶來新的問題.造成了內部碎片的問題:eg,申請85空間,但是只能返回100空間,就有15B的內碎片產生
4)Memcached的內存刪除機制
客戶端向Memcached提交數據時,除了指明key值外,還需要指明這條數據的有效期,超過有效期,客戶端就無法看到這個數據了.
Memcached自身不會釋放已分配的內存.通過這種方式,實現對內存空間的重復利用.
Memcached優先選擇已超時的記錄的空間,即使如此,依舊可能出現追加新數據時空間不足的問題.
這時就使用LRU機制來分配空間.:當Memcached的內存空間不足時(無法從Slab Class獲取新的空間時)Memcached就會從最近未被使用的記錄中搜索,并將其空間分配給新的記錄.
5)支持分布式數據管理
Memcached是一個高性能的分布式緩存系統.然而服務端沒有分布式功能,各個服務器不會相互通信.分布式實現依賴于客戶端的程序庫,這也是Memcached的一大特點
(1)Memcached的分布方法
a.向Memcached添加數據,首先根據客戶端算法利用key選擇保存的服務器;
b.服務器選定后,保存數據
c.獲取數據時,以相同的key,相同的算法可以定位到相同的服務器位置,從而獲取數據
(2)Memcached的分布式算法
Memcached使用的分布式算法中,我們簡單介紹兩種:余數哈希;一致性哈希
A.余數哈希
根據服務器臺數的余數進行哈希,求得鍵的哈希值,再處理服務器臺數,根據余數選擇服務器,
缺點:當添加或者移除服務器時,緩存重組的代價太大,
當添加服務器,訪問數據,Memcached命中率下降,那么就增加了數據庫服務器的負載.
B.一致性哈希
使用一致性哈??梢杂行П苊夥掌靼l生改變后對整個系統的影響.此外通過虛擬節點還可以避免負載不均衡的情況
一致性哈希是將整個哈希值空間組織成一個虛擬的圓環,如假設某哈希函數H的值空間是0~(2^32 -1)(即哈希值是一個32位的無符號整型),這個哈希空間為環
哈??臻g按順時針方向組織.為確定每臺服務器在空間上的位置,按照服務器主機名或者IP地址對每臺服務器進行Hash尋址.然后需要使用hash算法來判斷數據應該存儲在哪個服務器:首先,將數據根據key值使用相同的函數H計算出哈希值h,根據h確定數據在環上的位置,從此位置延環順時針向下尋找,遇到的第一個服務器就是其應該存儲的服務器.
注:一致性哈希方式,使得服務器保存的哈希值空間是一個范圍,而不是一個特定的余數系列.所以減少了增刪服務器后的影響.
一致性哈希的容錯性與可擴展性
eg容錯
對上圖,當Server3服務器故障時,數據的存儲指示D發生了改變,存放在了Server2上邊,系統的存儲數據變化最少
eg擴展
假設增加服務器Server4
那么只是B存儲在Server4上邊了,整體的影響只是發生在了新增節點的區間部分
一致性哈希的虛擬節點
為了解決負載均衡問題,引入了虛擬節點概念,通過虛擬節點可以使得數據更均勻分布在系統的服務器上
eg只有兩臺服務器時,如圖,那么會有很少的數據存放在server2上邊
引入虛擬節點可以解決這個問題,
所謂虛擬節點的機制,就是將每臺服務器在空間上映射為多個虛擬節點,大概數據哈希到系統空間時,仍然按照順時針方向找響應的存儲節點,但是找到的卻是虛擬節點.然后存儲到實際對應的服務器上