一致性哈希算法在數(shù)據(jù)庫Sharding中的應(yīng)用

通常的Sharding方案

我們假設(shè)現(xiàn)在有2臺(tái)機(jī)器禁熏,我們需要把User表橫向切分映射到這2臺(tái)機(jī)器上惕味。

一個(gè)簡(jiǎn)單的想法就是 userid % 2鬼癣,余數(shù)可能是 0, 1 分別是2臺(tái)機(jī)器的編號(hào)旬迹。

但是這樣做存在一個(gè)巨大的問題弄贿,就是如果加一臺(tái)機(jī)器怎么辦沟蔑?我們的算法肯定要有擴(kuò)展性湿诊,能自由加減機(jī)器。假設(shè)我們現(xiàn)在加了一臺(tái)機(jī)器瘦材,那么現(xiàn)在有3臺(tái)厅须,于是我們的sharding變成了 userid % 3。

這下可麻煩了食棕,因?yàn)楹芏嗟臄?shù)據(jù)這樣計(jì)算完了之后 余數(shù)都變了朗和,于是我們要把大量的數(shù)據(jù)進(jìn)行遷移,而且這個(gè)遷移必須停機(jī)做簿晓,在遷移完成之前系統(tǒng)是不可用的眶拉。

這種哈希算法就叫不一致性哈希算法,那么顯然這種方式是不可取的憔儿。

那么我們改進(jìn)一下忆植,這次我們?nèi)∫粋€(gè)比較大的數(shù),比如 500,然后 userid % 500 來計(jì)算一個(gè)值朝刊,因?yàn)槲覀冎挥?臺(tái)機(jī)器吴侦,所以顯然這個(gè)余數(shù)不是機(jī)器編號(hào),而是我們把 0 ~ 499 分配給這2臺(tái)機(jī)器坞古。

這里我們做一個(gè)簡(jiǎn)單的均勻分配:

0?號(hào)機(jī)器: 0~249

1 號(hào)機(jī)器: 250~499

現(xiàn)在我們加一臺(tái)機(jī)器的時(shí)候备韧,編號(hào)為2,那么我們把2號(hào)機(jī)器插入到現(xiàn)有的兩臺(tái)機(jī)器之間痪枫,于是變成了這樣:

0?號(hào)機(jī)器: 0~160

1 號(hào)機(jī)器: 161~320

2 號(hào)機(jī)器: 320~499

圖示如下

可以看到現(xiàn)在全部機(jī)器的壓力都降低了织堂。

這么做的缺點(diǎn)是什么呢?

依然需要做一部分的數(shù)據(jù)遷移

每加入一臺(tái)只能降低鄰居兩臺(tái)機(jī)器的壓力奶陈,這樣很容易導(dǎo)致壓力分布不均局易阳。比如如果有5臺(tái)機(jī)器,增加一臺(tái)之后依然有三臺(tái)機(jī)器壓力不變吃粒。

如何將數(shù)據(jù)均勻的分散到各個(gè)節(jié)點(diǎn)中潦俺,并且盡量的在加減節(jié)點(diǎn)時(shí)能使受影響的數(shù)據(jù)最少呢?

一致 Hash 算法

一致 Hash 算法是將所有的哈希值構(gòu)成了一個(gè)環(huán)徐勃,其范圍在?0 ~ 2^32-1事示。如下圖:

之后將各個(gè)節(jié)點(diǎn)散列到這個(gè)環(huán)上,可以用節(jié)點(diǎn)的 IP僻肖、hostname 這樣的唯一性字段作為 Key 進(jìn)行?hash(key)肖爵,散列之后如下:


之后需要將數(shù)據(jù)定位到對(duì)應(yīng)的節(jié)點(diǎn)上,使用同樣的?hash?函數(shù)將 Key 也映射到這個(gè)環(huán)上臀脏。

這樣按照順時(shí)針方向就可以把 k1 定位到?N1節(jié)點(diǎn)劝堪,k2 定位到?N3節(jié)點(diǎn),k3 定位到?N2節(jié)點(diǎn)揉稚。

容錯(cuò)性

這時(shí)假設(shè) N1 宕機(jī)了:

依然根據(jù)順時(shí)針方向秒啦,k2 和 k3 保持不變,只有 k1 被重新映射到了 N3搀玖。這樣就很好的保證了容錯(cuò)性余境,當(dāng)一個(gè)節(jié)點(diǎn)宕機(jī)時(shí)只會(huì)影響到少少部分的數(shù)據(jù)。

拓展性

當(dāng)新增一個(gè)節(jié)點(diǎn)時(shí):

在 N2 和 N3 之間新增了一個(gè)節(jié)點(diǎn) N4 巷怜,這時(shí)會(huì)發(fā)現(xiàn)受印象的數(shù)據(jù)只有 k3葛超,其余數(shù)據(jù)也是保持不變,所以這樣也很好的保證了拓展性延塑。

虛擬節(jié)點(diǎn)

到目前為止該算法依然也有點(diǎn)問題:

當(dāng)節(jié)點(diǎn)較少時(shí)會(huì)出現(xiàn)數(shù)據(jù)分布不均勻的情況:

這樣會(huì)導(dǎo)致大部分?jǐn)?shù)據(jù)都在 N1 節(jié)點(diǎn),只有少量的數(shù)據(jù)在 N2 節(jié)點(diǎn)答渔。

為了解決這個(gè)問題关带,一致哈希算法引入了虛擬節(jié)點(diǎn)。將每一個(gè)節(jié)點(diǎn)都進(jìn)行多次 hash,生成多個(gè)節(jié)點(diǎn)放置在環(huán)上稱為虛擬節(jié)點(diǎn):

計(jì)算時(shí)可以在 IP 后加上編號(hào)來生成哈希值宋雏。

這樣只需要在原有的基礎(chǔ)上多一步由虛擬節(jié)點(diǎn)映射到實(shí)際節(jié)點(diǎn)的步驟即可讓少量節(jié)點(diǎn)也能滿足均勻性芜飘。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市磨总,隨后出現(xiàn)的幾起案子嗦明,更是在濱河造成了極大的恐慌,老刑警劉巖蚪燕,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娶牌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡馆纳,警方通過查閱死者的電腦和手機(jī)诗良,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鲁驶,“玉大人鉴裹,你說我怎么就攤上這事≡客洌” “怎么了径荔?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)脆霎。 經(jīng)常有香客問我猖凛,道長(zhǎng),這世上最難降的妖魔是什么绪穆? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任辨泳,我火速辦了婚禮,結(jié)果婚禮上玖院,老公的妹妹穿的比我還像新娘菠红。我一直安慰自己,他們只是感情好难菌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布试溯。 她就那樣靜靜地躺著,像睡著了一般郊酒。 火紅的嫁衣襯著肌膚如雪遇绞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天燎窘,我揣著相機(jī)與錄音摹闽,去河邊找鬼。 笑死褐健,一個(gè)胖子當(dāng)著我的面吹牛付鹿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舵匾,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼俊抵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坐梯,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤徽诲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后吵血,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谎替,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年践瓷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了院喜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晕翠,死狀恐怖喷舀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情淋肾,我是刑警寧澤硫麻,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站樊卓,受9級(jí)特大地震影響拿愧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碌尔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一浇辜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唾戚,春花似錦柳洋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至募书,卻和暖如春绪囱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背莹捡。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工鬼吵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人道盏。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓而柑,卻偏偏與公主長(zhǎng)得像文捶,于是被迫代替她去往敵國(guó)和親荷逞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子媒咳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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