一致性hash算法

轉(zhuǎn)載請說明出處:http://blog.csdn.net/cywosp/article/details/23397179
一致性哈希算法在1997年由麻省理工學(xué)院提出的一種分布式哈希(DHT)實現(xiàn)算法奕删,設(shè)計目標(biāo)是為了解決因特網(wǎng)中的熱點(Hot spot)問題载城,初衷和CARP十分類似税产。一致性哈希修正了CARP使用的簡 單哈希算法帶來的問題,使得分布式哈希(DHT)可以在P2P環(huán)境中真正得到應(yīng)用查坪。

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

1沛婴、平衡性(Balance):平衡性是指哈希的結(jié)果能夠盡可能分布到所有的緩沖中去欺旧,這樣可以使得所有的緩沖空間都得到利用。很多哈希算法都能夠滿足這一條件让网。

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)該避免的,因為它導(dǎo)致相同內(nèi)容被存儲到不同緩沖中去莉御,降低了系統(tǒng)存儲的效率撇吞。分散性的定義就是上述情況發(fā)生的嚴(yán)重程度俗冻。好的哈希算法應(yīng)能夠盡量避免不一致的情況發(fā)生,也就是盡量降低分散性牍颈。

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

在分布式集群中步氏,對機器的添加刪除响禽,或者機器故障后自動脫離集群這些操作是分布式集群管理最基本的功能。如果采用常用的hash(object)%N算法荚醒,那么在有機器添加或者刪除后芋类,很多原有的數(shù)據(jù)就無法找到了,這樣嚴(yán)重的違反了單調(diào)性原則界阁。接下來主要講解一下一致性哈希算法是如何設(shè)計的:

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


把數(shù)據(jù)通過一定的hash算法處理后映射到環(huán)上
現(xiàn)在我們將object1、object2较剃、object3咕别、object4四個對象通過特定的Hash函數(shù)計算出對應(yīng)的key值,然后散列到Hash環(huán)上重付。如下圖:
Hash(object1) = key1顷级;
Hash(object2) = key2凫乖;
Hash(object3) = key3确垫;
Hash(object4) = key4;

將機器通過hash算法映射到環(huán)上
在采用一致性哈希算法的分布式集群中將新的機器加入帽芽,其原理是通過使用與對象存儲一樣的Hash算法將機器也映射到環(huán)中(一般情況下對機器的hash計算是采用機器的IP或者機器唯一的別名作為輸入值)删掀,然后以順時針的方向計算,將所有對象存儲到離自己最近的機器中导街。
假設(shè)現(xiàn)在有NODE1披泪,NODE2,NODE3三臺機器搬瑰,通過Hash算法得到對應(yīng)的KEY值款票,映射到環(huán)中控硼,其示意圖如下:
Hash(NODE1) = KEY1;
Hash(NODE2) = KEY2;
Hash(NODE3) = KEY3;

通過上圖可以看出對象與機器處于同一哈希空間中艾少,這樣按順時針轉(zhuǎn)動object1存儲到了NODE1中卡乾,object3存儲到了NODE2中,object2缚够、object4存儲到了NODE3中幔妨。在這樣的部署環(huán)境中,hash環(huán)是不會變更的谍椅,因此误堡,通過算出對象的hash值就能快速的定位到對應(yīng)的機器中,這樣就能找到對象真正的存儲位置了雏吭。

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

  1. 節(jié)點(機器)的刪除
    以上面的分布為例沾谜,如果NODE2出現(xiàn)故障被刪除了,那么按照順時針遷移的方法胀莹,object3將會被遷移到NODE3中基跑,這樣僅僅是object3的映射位置發(fā)生了變化,其它的對象沒有任何的改動描焰。如下圖:


  2. 節(jié)點(機器)的添加
    如果往集群中添加一個新的節(jié)點NODE4媳否,通過對應(yīng)的哈希算法得到KEY4,并映射到環(huán)中荆秦,如下圖:



    通過按順時針遷移的規(guī)則篱竭,那么object2被遷移到了NODE4中,其它對象還保持這原有的存儲位置步绸。通過對節(jié)點的添加和刪除的分析掺逼,一致性哈希算法在保持了單調(diào)性的同時,還是數(shù)據(jù)的遷移達(dá)到了最小瓤介,這樣的算法對分布式集群來說是非常合適的吕喘,避免了大量數(shù)據(jù)遷移,減小了服務(wù)器的的壓力刑桑。

平衡性
根據(jù)上面的圖解分析氯质,一致性哈希算法滿足了單調(diào)性和負(fù)載均衡的特性以及一般hash算法的分散性,但這還并不能當(dāng)做其被廣泛應(yīng)用的原由祠斧,因為還缺少了平衡性闻察。下面將分析一致性哈希算法是如何滿足平衡性的。hash算法是不保證平衡的,如上面只部署了NODE1和NODE3的情況(NODE2被刪除的圖)辕漂,object1存儲到了NODE1中呢灶,而object2、object3钉嘹、object4都存儲到了NODE3中填抬,這樣就照成了非常不平衡的狀態(tài)。在一致性哈希算法中隧期,為了盡可能的滿足平衡性飒责,其引入了虛擬節(jié)點。
——“虛擬節(jié)點”( virtual node )是實際節(jié)點(機器)在 hash 空間的復(fù)制品( replica )仆潮,一實際個節(jié)點(機器)對應(yīng)了若干個“虛擬節(jié)點”宏蛉,這個對應(yīng)個數(shù)也成為“復(fù)制個數(shù)”,“虛擬節(jié)點”在 hash 空間中以hash值排列性置。
以上面只部署了NODE1和NODE3的情況(NODE2被刪除的圖)為例拾并,之前的對象在機器上的分布很不均衡,現(xiàn)在我們以2個副本(復(fù)制個數(shù))為例鹏浅,這樣整個hash環(huán)中就存在了4個虛擬節(jié)點嗅义,最后對象映射的關(guān)系圖如下:


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

“虛擬節(jié)點”的hash計算可以采用對應(yīng)節(jié)點的IP地址加數(shù)字后綴的方式博敬。例如假設(shè)NODE1的IP地址為192.168.1.100。引入“虛擬節(jié)點”前峰尝,計算 cache A 的 hash 值:
Hash(“192.168.1.100”);
引入“虛擬節(jié)點”后偏窝,計算“虛擬節(jié)”點NODE1-1和NODE1-2的hash值:
Hash(“192.168.1.100#1”); // NODE1-1
Hash(“192.168.1.100#2”); // NODE1-2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市武学,隨后出現(xiàn)的幾起案子祭往,更是在濱河造成了極大的恐慌,老刑警劉巖劳淆,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件链沼,死亡現(xiàn)場離奇詭異,居然都是意外死亡沛鸵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來曲掰,“玉大人疾捍,你說我怎么就攤上這事±秆” “怎么了乱豆?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吊趾。 經(jīng)常有香客問我宛裕,道長,這世上最難降的妖魔是什么论泛? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任揩尸,我火速辦了婚禮,結(jié)果婚禮上屁奏,老公的妹妹穿的比我還像新娘岩榆。我一直安慰自己,他們只是感情好坟瓢,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布勇边。 她就那樣靜靜地躺著,像睡著了一般折联。 火紅的嫁衣襯著肌膚如雪粒褒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天诚镰,我揣著相機與錄音怀浆,去河邊找鬼。 笑死怕享,一個胖子當(dāng)著我的面吹牛执赡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播函筋,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼沙合,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了跌帐?” 一聲冷哼從身側(cè)響起首懈,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谨敛,沒想到半個月后究履,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡脸狸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年最仑,在試婚紗的時候發(fā)現(xiàn)自己被綠了藐俺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡泥彤,死狀恐怖欲芹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吟吝,我是刑警寧澤菱父,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站剑逃,受9級特大地震影響浙宜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛹磺,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一粟瞬、第九天 我趴在偏房一處隱蔽的房頂上張望果港。 院中可真熱鬧贯吓,春花似錦金刁、人聲如沸椰拒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讶踪。三九已至凿傅,卻和暖如春蕴侣,著一層夾襖步出監(jiān)牢的瞬間焰轻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工昆雀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辱志,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓狞膘,卻偏偏與公主長得像揩懒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挽封,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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