Memcached與一致性哈希

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)行的速度和效率树灶。

Memcached用途示例

通過(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ù)

Memcached的通信機(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)


Slab Allocator構(gòu)造圖

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ù)


客戶端上傳數(shù)據(jù)set



客戶端獲取數(shù)據(jù)get

(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ù)器.


有三臺(tái)服務(wù)器分布的哈希空間



數(shù)據(jù)分布的哈舷ㄍ眨空間

注:一致性哈希方式,使得服務(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上邊


負(fù)載不均衡的哈舷窈空間

引入虛擬節(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ù)器上


增加虛擬節(jié)點(diǎn)后的哈虾姹空間
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市诺祸,隨后出現(xiàn)的幾起案子携悯,更是在濱河造成了極大的恐慌,老刑警劉巖筷笨,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憔鬼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡胃夏,警方通過(guò)查閱死者的電腦和手機(jī)轴或,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)仰禀,“玉大人照雁,你說(shuō)我怎么就攤上這事〉狂” “怎么了囊榜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)亥宿。 經(jīng)常有香客問(wèn)我卸勺,道長(zhǎng),這世上最難降的妖魔是什么烫扼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任曙求,我火速辦了婚禮,結(jié)果婚禮上映企,老公的妹妹穿的比我還像新娘悟狱。我一直安慰自己,他們只是感情好堰氓,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布挤渐。 她就那樣靜靜地躺著,像睡著了一般双絮。 火紅的嫁衣襯著肌膚如雪浴麻。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天囤攀,我揣著相機(jī)與錄音软免,去河邊找鬼。 笑死焚挠,一個(gè)胖子當(dāng)著我的面吹牛膏萧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼榛泛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蝌蹂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起挟鸠,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叉信,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后艘希,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體硼身,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年覆享,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了佳遂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡撒顿,死狀恐怖丑罪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凤壁,我是刑警寧澤吩屹,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站拧抖,受9級(jí)特大地震影響煤搜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唧席,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一擦盾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧淌哟,春花似錦迹卢、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至掉弛,卻和暖如春喻杈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狰晚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缴啡,地道東北人壁晒。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像业栅,于是被迫代替她去往敵國(guó)和親秒咐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谬晕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容