一致性哈希算法你真的理解嘛?

維基百科定義

一致哈希是一種特殊的哈希算法。在使用一致哈希算法后菜谣,哈希表槽位數(shù)(大小)的改變平均只需要對 K/n個關(guān)鍵字重新映射砍的,其中K是關(guān)鍵字的數(shù)量蹂喻, n是槽位數(shù)量。然而在傳統(tǒng)的哈希表中开泽,添加或刪除一個槽位的幾乎需要對所有關(guān)鍵字進行重新映射牡拇。

引出


我們在上文中已經(jīng)介紹了一致性Hash算法的基本優(yōu)勢,我們看到了該算法主要解決的問題是:當slot數(shù)發(fā)生變化時穆律,能夠盡量少的移動數(shù)據(jù)惠呼。那么,我們思考一下峦耘,普通的Hash算法是如何實現(xiàn)剔蹋?又存在什么問題呢? 那么我們引出一個問題:

假設(shè)有1000w個數(shù)據(jù)項辅髓,100個存儲節(jié)點泣崩,請設(shè)計一種算法合理地將他們存儲在這些節(jié)點上少梁。

看一看普通Hash算法的原理:

1.png

算法的核心計算如下

for item in range(ITEMS):
    k = md5(str(item)).digest()
    h = unpack_from(">I", k)[0]
    # 通過取余的方式進行映射
    n = h % NODES
    node_stat[n] += 1

從上述結(jié)果可以發(fā)現(xiàn),普通的Hash算法均勻地將這些數(shù)據(jù)項打散到了這些節(jié)點上律想,并且分布最少和最多的存儲節(jié)點數(shù)據(jù)項數(shù)目小于1%猎莲。之所以分布均勻,主要是依賴Hash算法(實現(xiàn)使用的MD5算法)能夠比較隨機的分布技即。

然而著洼,我們看看存在一個問題,由于該算法使用節(jié)點數(shù)取余的方法而叼,強依賴node的數(shù)目身笤,因此,當是node數(shù)發(fā)生變化的時候葵陵,item所對應(yīng)的node發(fā)生劇烈變化液荸,而發(fā)生變化的成本就是我們需要在node數(shù)發(fā)生變化的時候,數(shù)據(jù)需要遷移脱篙,這對存儲產(chǎn)品來說顯然是不能忍的娇钱,我們觀察一下增加node后,數(shù)據(jù)項移動的情況:

如果有100個item绊困,當增加一個node文搂,之前99%的數(shù)據(jù)都需要重新移動

這顯然是不能忍的秤朗,普通哈希算法的問題我們已經(jīng)發(fā)現(xiàn)了煤蹭,如何對其進行改進呢?沒錯取视,我們的一致性哈希算法閃亮登場硝皂。

那么,一個亟待解決的問題就變成了:當node數(shù)發(fā)生變化時作谭,如何保證盡量少引起遷移呢稽物?即當增加或者刪除節(jié)點時,對于大多數(shù)item折欠,保證原來分配到的某個node姨裸,現(xiàn)在仍然應(yīng)該分配到那個node,將數(shù)據(jù)遷移量的降到最低怨酝。

一致性Hash算法的原理是這樣的:

2.png

雖然一致性Hash算法解決了節(jié)點變化導(dǎo)致的數(shù)據(jù)遷移問題,但是那先,我們回過頭來再看看數(shù)據(jù)項分布的均勻性农猬, 但是引入一致性哈希算法后,為什么就不均勻呢售淡?數(shù)據(jù)項本身的哈希值并未發(fā)生變化斤葱,變化的是判斷數(shù)據(jù)項哈希應(yīng)該落到哪個節(jié)點的算法變了慷垮。

3.png

因此,主要是因為這100個節(jié)點Hash后揍堕,在環(huán)上分布不均勻料身,導(dǎo)致了每個節(jié)點實際占據(jù)環(huán)上的區(qū)間大小不一造成的。

改進-虛節(jié)點


當我們將node進行哈希后衩茸,這些值并沒有均勻地落在環(huán)上芹血,因此,最終會導(dǎo)致楞慈,這些節(jié)點所管轄的范圍并不均勻幔烛,最終導(dǎo)致了數(shù)據(jù)分布的不均勻。

consist_hash_virtual

因此囊蓝,通過增加虛節(jié)點的方法饿悬,使得每個節(jié)點在環(huán)上所“管轄”更加均勻。這樣就既保證了在節(jié)點變化時聚霜,盡可能小的影響數(shù)據(jù)分布的變化狡恬,而同時又保證了數(shù)據(jù)分布的均勻。也就是靠增加“節(jié)點數(shù)量”加強管轄區(qū)間的均勻蝎宇。

另一種改進


然而弟劲,虛節(jié)點這種靠數(shù)量取勝的策略增加了存儲這些虛節(jié)點信息所需要的空間。在OpenStack的Swift組件中夫啊,使用了一種比較特殊的方法來解決分布不均的問題函卒,改進了這些數(shù)據(jù)分布的算法,將環(huán)上的空間均勻的映射到一個線性空間撇眯,這樣报嵌,就保證分布的均勻性。

5.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末熊榛,一起剝皮案震驚了整個濱河市锚国,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玄坦,老刑警劉巖血筑,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異煎楣,居然都是意外死亡豺总,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門择懂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喻喳,“玉大人,你說我怎么就攤上這事困曙”砺祝” “怎么了谦去?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蹦哼。 經(jīng)常有香客問我鳄哭,道長,這世上最難降的妖魔是什么纲熏? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任妆丘,我火速辦了婚禮,結(jié)果婚禮上赤套,老公的妹妹穿的比我還像新娘飘痛。我一直安慰自己,他們只是感情好容握,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布宣脉。 她就那樣靜靜地躺著,像睡著了一般剔氏。 火紅的嫁衣襯著肌膚如雪塑猖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天谈跛,我揣著相機與錄音羊苟,去河邊找鬼。 笑死感憾,一個胖子當著我的面吹牛蜡励,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阻桅,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼凉倚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嫂沉?” 一聲冷哼從身側(cè)響起稽寒,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎趟章,沒想到半個月后杏糙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡蚓土,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年宏侍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜀漆。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡负芋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情旧蛾,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布蠕嫁,位于F島的核電站锨天,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏剃毒。R本人自食惡果不足惜病袄,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赘阀。 院中可真熱鬧益缠,春花似錦、人聲如沸基公。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轰豆。三九已至胰伍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酸休,已是汗流浹背骂租。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斑司,地道東北人渗饮。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像宿刮,于是被迫代替她去往敵國和親互站。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

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