看完此文,必須明白一致性Hash算法

一致性Hash算法在1997年由麻省理工學(xué)院提出的一種分布式哈希(DHT)實(shí)現(xiàn)算法,設(shè)計目標(biāo)是為了解決因特網(wǎng)中的熱點(diǎn)(Hot Spot)問題择葡,初衷和CARP十分相似。一致性Hash修正了CARP使用的簡單哈希算法帶來的問題剃氧,使得分布式哈希(DHT)可以在P2P環(huán)境中真正得到應(yīng)用敏储。

一致性Hash算法提出了在動態(tài)變化的Cache環(huán)境中,判定哈希算法好壞的四個定義:

1她我、平衡性(Balance):平衡性是指哈希的結(jié)果能夠盡可能分布在所有的緩沖(Cache)中去虹曙,這樣可以使得所有的緩沖空間得到利用。很多哈希算法都能夠滿足這一條件番舆。

2酝碳、單調(diào)性(Monotonicity):單調(diào)性是指如果已經(jīng)有一些內(nèi)容通過哈希分派到了相應(yīng)的緩沖中,又有新的緩沖加入到系統(tǒng)中恨狈。哈希的結(jié)果應(yīng)該能夠保證原有已分配的內(nèi)容可以被映射到原有的或者新的緩沖中去疏哗,而不會映射到舊的緩沖集合中的其他緩沖區(qū)。

3禾怠、分散性(Spread):在分布式環(huán)境中返奉,終端有可能看不到所有的緩沖,而只能看到其中的一部分吗氏。當(dāng)終端希望通過哈希過程將內(nèi)容映射到緩沖上去芽偏,由于不同終端所見的緩沖范圍有可能不同,從而導(dǎo)致哈希的結(jié)果不一致弦讽,最終的結(jié)果是相同的內(nèi)容被不同的終端映射到不同的緩沖區(qū)中污尉。這種情況顯然是應(yīng)該避免的膀哲,因?yàn)樗鼘?dǎo)致相同內(nèi)容被存儲到不同緩沖中去,降低了系統(tǒng)存儲的效率被碗。分散性的定義就是上述情況發(fā)生的嚴(yán)重程度某宪。好的哈希算法應(yīng)該能夠盡量避免不一致的情況發(fā)生,也就是盡量降低分散性锐朴。

4兴喂、負(fù)載(Load):負(fù)載問題實(shí)際上是從另一個角度看待分散性問題。既然不同的終端可能將相同的內(nèi)容映射到不同的緩沖區(qū)中焚志,那么對于一個特定的緩沖區(qū)而言衣迷,也可能被不同的用戶映射到不同的內(nèi)容。與分散性一樣娩嚼,這種情況也是應(yīng)當(dāng)避免的蘑险,因此好的哈希算法應(yīng)能夠盡量降低緩沖的負(fù)荷。

在分布式集群中岳悟,對機(jī)器的添加刪除佃迄,或者機(jī)器故障后自動脫落集群這些操作是分布式集群管理最基本的功能。如果采用常用的hash(object)%N算法贵少,那么在有機(jī)器添加或者刪除后呵俏,很多原有的數(shù)據(jù)就無法找到了,這樣嚴(yán)重的違反了單調(diào)性原則滔灶。

解釋使用hash(object)%N普碎,其中N是指N個cache服務(wù)器/N個節(jié)點(diǎn)為啥不行:

如果N個cache服務(wù)器中編號為a的服務(wù)器故障了,需要把a(bǔ)從服務(wù)器群中移除录平,這個時候cache服務(wù)器的數(shù)量就變成了N-1臺麻车,那么所有對象(object)映射到cache服務(wù)器的計算公式就變成了hash(object)%N-1,對斗这,影響到了所有的對象與cache服務(wù)器的映射關(guān)系动猬,類似,由于訪問加重表箭,需要添加cache服務(wù)器赁咙,這時候cache服務(wù)器是N+1臺,映射公式就變成了hash(object)%N+1,這就意味著幾乎所有的cache都失效了免钻,對于服務(wù)器而言彼水,這是一場災(zāi)難,所有訪問都會直接沖向后臺服務(wù)器极舔。

接下來主要講解一下哈希算法是如何設(shè)計的:

環(huán)形Hash空間

按照常用的hash算法來將對應(yīng)的key哈希到一個具有232次方個桶的空間中凤覆,即0~(232)-1的數(shù)字空間。現(xiàn)在我們可以將這些數(shù)字頭尾相連拆魏,想象成一個閉合的環(huán)形盯桦。如下圖

image

把數(shù)據(jù)(對象)通過一定的hash算法處理后映射到環(huán)上

現(xiàn)在我們將object1澡绩、object2、object3俺附、object4四個對象通過特定的Hash函數(shù)計算出對應(yīng)的key值,然后散列到hash換上溪掀。如下圖:

Hash(object1)=key1;Hash(object2)=key2;Hash(object3)=key3;Hash(object4)=key4;

image

將機(jī)器通過hash算法映射到環(huán)上

在采用一致性哈希算法的分布式集群中將新的機(jī)器加入事镣,其原理是通過使用與對象存儲一樣的Hash算法將機(jī)器也映射到換種(一般情況下對機(jī)器的hash計算是采用機(jī)器的IP或者唯一的別名作為輸入值),然后以順時針的方向計算揪胃,將所有對象存儲到離自己最近的機(jī)器中璃哟。

假設(shè)現(xiàn)在有NODE1,NODE2,NODE3三臺機(jī)器中,通過hash算法得到對應(yīng)的KEY值喊递,映射到環(huán)中随闪,其示意圖如下:

Hash(NODE1)=KEY1;Hash(NODE2)=KEY2;Hash(NODE3)=KEY3;

image

通過上圖可以看出對象與機(jī)器處于同一個哈希空間中骚勘,這樣按順時針轉(zhuǎn)動object1(對象)存儲到了NODE1(機(jī)器)中,object3(對象)存儲到了NODE2(機(jī)器)中,object2铐伴、object4(對象)存儲到了NODE3(機(jī)器)中。在這樣的部署環(huán)境中俏讹,hash環(huán)是不會變更的当宴,因此,通過算出對象的hash值就能快速的定位到對應(yīng)的機(jī)器中泽疆,這樣就能找到對象真正的存儲位置了户矢。

機(jī)器刪除與添加

普通hash求余算法最為不妥的地方就是在有機(jī)器的添加與刪除以后會造成大量的對象存儲位置的失效,這樣就大大的不滿足單調(diào)性了殉疼。下面來分析一下一致性哈希算法是如何處理的梯浪。

1、節(jié)點(diǎn)(機(jī)器)的刪除

  以上面的分布式集群為例瓢娜,如果NODE2出現(xiàn)故障被刪除了挂洛,那么按照順時針遷移的方法,object3將會被遷移到NODE3中恋腕,這樣僅僅是object3的映射位置發(fā)生了變化抹锄,其他的對象沒有任何的變動,如下圖:
image

2荠藤、節(jié)點(diǎn)(機(jī)器)的添加

 如果往集群中添加一個新的節(jié)點(diǎn)NODE4,通過對應(yīng)的Hash算法得到KEY4伙单,并映射到環(huán)中,如下圖:
image

通過按照順時針遷移的規(guī)則哈肖,那么object2被遷移到NODE4中吻育,其他對象還保持這原有的存儲位置。通過對節(jié)點(diǎn)的添加和刪除的分析淤井,一致性哈希算法在保持了單調(diào)性的同時布疼,還是數(shù)據(jù)的遷移達(dá)到了最小摊趾,這樣的算法對分布式集群來說非常合適的,避免了大量收數(shù)據(jù)遷移游两,減少了服務(wù)器的壓力砾层。

平衡性

根據(jù)上面的圖解分析,一致性哈希算法滿足了單調(diào)性和負(fù)載均衡的特性以及一般hash算法的分散性贱案,但這還并不能當(dāng)做其被廣泛應(yīng)用的原由肛炮,因?yàn)槿鄙倭似胶庑浴O旅鎸⒎治鲆恢滦怨K惴ㄊ侨绾螡M足平衡性的宝踪。hash算法是不保證平衡性的侨糟,如上面只部署了NODE1和NODE3的情況(NODE2被刪除的圖),object1存儲在NODE1中瘩燥,而object2秕重、object3、object4都存儲在NODE3中厉膀,這樣就造成了非常不平衡的狀態(tài)溶耘。在一致性哈希算法中,為了盡可能的滿足平衡性服鹅,其引入了虛擬節(jié)點(diǎn)汰具。

何為虛擬節(jié)點(diǎn)?虛擬節(jié)點(diǎn)(Virtual node)是實(shí)際節(jié)點(diǎn)(機(jī)器)在hash空間的復(fù)制品(replica)菱魔,一個實(shí)際節(jié)點(diǎn)對應(yīng)了若干個“虛擬節(jié)點(diǎn)”留荔,這個對應(yīng)個數(shù)也稱為“復(fù)制個數(shù)”,“虛擬節(jié)點(diǎn)”在hash空間中以hash值排列澜倦。

在上面只部署了NODE1和NODE3的情況(NODE2被刪除的圖)為例聚蝶,之前的對象在機(jī)器上的分布很不均衡,現(xiàn)在我們以2個副本(每個節(jié)點(diǎn)復(fù)制2個)為例藻治,這樣整個hash環(huán)就存在4個虛擬節(jié)點(diǎn)碘勉,最后對象映射的關(guān)系圖如下:

image

根據(jù)上圖可知對象的映射關(guān)系:object1->NODE1-1,object2->NODE1-2 ,object3->NODE3-2,object4->NODE3-1,通過虛擬節(jié)點(diǎn)的引入桩卵,對象的分布就比較均衡了验靡。那么在實(shí)際操作中,真正的對象查詢是如何工作的呢雏节?對象從hash到虛擬節(jié)點(diǎn)到實(shí)際節(jié)點(diǎn)的轉(zhuǎn)換如下圖:

image

虛擬節(jié)點(diǎn)”的hash計算可以采用對應(yīng)節(jié)點(diǎn)的IP地址加數(shù)字后綴的方式胜嗓。例如假設(shè)NODE1的IP地址為192.168.1.100。引入“虛擬節(jié)點(diǎn)”前钩乍,計算 cache A 的 hash 值:

Hash(“192.168.1.100”);

引入“虛擬節(jié)點(diǎn)”后辞州,計算“虛擬節(jié)”點(diǎn)NODE1-1和NODE1-2的hash值:

Hash(“192.168.1.100#1”); // NODE1-1

Hash(“192.168.1.100#2”); // NODE1-2

參考:https://blog.csdn.net/cywosp/article/details/23397179/

       [http://www.reibang.com/p/e8fb89bb3a61](http://www.reibang.com/p/e8fb89bb3a61)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寥粹,隨后出現(xiàn)的幾起案子变过,更是在濱河造成了極大的恐慌埃元,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媚狰,死亡現(xiàn)場離奇詭異岛杀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)崭孤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門楞件,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人裳瘪,你說我怎么就攤上這事∽镎耄” “怎么了彭羹?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泪酱。 經(jīng)常有香客問我派殷,道長,這世上最難降的妖魔是什么墓阀? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任毡惜,我火速辦了婚禮,結(jié)果婚禮上斯撮,老公的妹妹穿的比我還像新娘经伙。我一直安慰自己,他們只是感情好勿锅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布帕膜。 她就那樣靜靜地躺著,像睡著了一般溢十。 火紅的嫁衣襯著肌膚如雪垮刹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天张弛,我揣著相機(jī)與錄音荒典,去河邊找鬼。 笑死吞鸭,一個胖子當(dāng)著我的面吹牛寺董,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刻剥,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼螃征,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了透敌?” 一聲冷哼從身側(cè)響起盯滚,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤踢械,失蹤者是張志新(化名)和其女友劉穎板乙,沒想到半個月后坐搔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恩够,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年背率,在試婚紗的時候發(fā)現(xiàn)自己被綠了话瞧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡寝姿,死狀恐怖交排,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饵筑,我是刑警寧澤埃篓,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站根资,受9級特大地震影響架专,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玄帕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一部脚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧裤纹,春花似錦委刘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吹零,卻和暖如春罩抗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背灿椅。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工套蒂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茫蛹。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓操刀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親婴洼。 傳聞我的和親對象是個殘疾皇子骨坑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

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