一致性哈希算法

未完待續(xù)

一、引出

假設(shè)有 100W 的數(shù)據(jù),100 個存儲節(jié)點,如何分配呢?
通常的方法是哈希,數(shù)據(jù)存儲到第 hash(key)\%100 個節(jié)點上。
可是,當新增或刪除節(jié)點時,需要對所有的數(shù)據(jù)重新映射,可能發(fā)生大規(guī)模的數(shù)據(jù)遷移。這對于分布式系統(tǒng)而言,是一個很嚴重的問題。

一致性哈希算法就是為了解決這個問題產(chǎn)生的,即『當slot數(shù)發(fā)生變化時,能夠盡量少的移動數(shù)據(jù)』

維基百科:一致哈希是一種特殊的哈希算法。在使用一致哈希算法后,哈希表槽位數(shù)(大?。┑母淖兤骄恍枰獙?K/n個關(guān)鍵字重新映射,其中K是關(guān)鍵字的數(shù)量, n是槽位數(shù)量。然而在傳統(tǒng)的哈希表中,添加或刪除一個槽位的幾乎需要對所有關(guān)鍵字進行重新映射。

二、實現(xiàn)

基本實現(xiàn)

實現(xiàn)原理:
1)將 0~最大正整數(shù)形成一個環(huán)
2)計算每個節(jié)點的哈希值,即 hash(node),并落入環(huán)上某個位置
3)計算數(shù)據(jù)的哈希值,即 hash(key),并落入環(huán)上某個位置。
4)數(shù)據(jù)在環(huán)上的位置順時針找離它最近的節(jié)點,作為該數(shù)據(jù)的存儲節(jié)點

可理解成:每個節(jié)點負責某個范圍內(nèi)的哈希值的數(shù)據(jù)。比如,當哈希值在 [hash(node1), hash(node2)] 內(nèi)的數(shù)據(jù),落入 node2。

插圖(構(gòu)建環(huán)),參考文獻[1][3]

當節(jié)點變化,僅影響該節(jié)點順時針方向的下一個節(jié)點,具體情況如下:

  • 當刪除一個節(jié)點時,該節(jié)點上的數(shù)據(jù)遷移到該節(jié)點順時針方向的下一節(jié)點上
  • 當新增一個節(jié)點時,該節(jié)點順時針方向的下一節(jié)點部分數(shù)據(jù)遷移到該節(jié)點上。

插圖(刪除/新增節(jié)點),參考文獻[1][3]

改進一:加入虛擬節(jié)點

目的:為了使得每個節(jié)點的負載盡量均衡

參考文獻

[1] 一致性Hash原理_憧憬的專欄-CSDN博客
[2] 一致性哈希算法的理解與實踐 | Yikun
[3] 一致性hash算法及java實現(xiàn)Java青魚入云的博客-CSDN博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容