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