分布式系統下的雜湊一致性演算法設計

2022-09-16 12:30:14 字數 1198 閱讀 3688

本文涉及:普通雜湊演算法存在的問題,分布式系統的雜湊一致性演算法,雜湊一致性演算法中的資料傾斜問題

我們知道,在分布式系統中當資料量無法使用單機進行儲存時,最簡單粗暴的方法就是水平擴充套件:加機器,搞集群。

假如當前我們有乙個redis集群,共5個節點對外提供服務

hash取模

◆最開始的解決方案就是首先給5臺機器分別編號:1、2、3、4、5

當對乙個資料進行操作時首先計算key的hash然後對機器數量5進行取餘,得出的餘數就是需要放置的機器的編號。

1

key應該放置的機器編號=hash(key) % 5

如果其中一台機器宕機了、或者新增了伺服器,則整個集群所有的資料都需要重新計算位置,這個過程簡直不要太痛苦。

◆一致性hash

◆既然出現了問題,聰明的程式設計師很快就想到了解決方案:一致性雜湊演算法

如上圖所示,程式設計師們把所有的機器模擬成了乙個虛擬的雜湊環,然後設計了乙個空間的大小,這個空間被平均分配到了所有機器的中間。當需要對乙個key操作時,同樣進行進行取模運算,只不過這裡的模不再是機器數量而是空間大小,然後根據得出的結果,去離結果順時針最近的乙個節點上操作key。

例如:當乙個集群有5個節點、空間大小被設定為500的時候,當要設定乙個key的hash值為601時。首先會對key的hash進行取餘,601%500 結果為101,然後根據結果101順時針查詢最近的節點找到了192.168.1.3。

同理,設定另乙個key,先算hash,假如是888,則首先取餘得出結果388然後得出節點192.168.1.5。

使用hash一致性的時候如果遇到了節點宕機或者新增伺服器的情況下可就簡單的多了:

節點宕機,只需要把宕機節點的資料遷移到順時針的下乙個伺服器上

新增節點僅僅需要遷移逆時針的第一台伺服器的部分資料

◆資料傾斜

◆一致性雜湊演算法完美的解決了普通的雜湊演算法的問題,但是呢,沒有十全十美的演算法,一致性雜湊演算法同樣存在一些問題。由上方的示例我們可以看出來,當集群內擴縮容次數多了以後,資料很容易出現不均勻的情況,有的機器負責了大半的空間,而有的機器僅僅負責一點點空間。這個問題有乙個名詞,資料傾斜:

為了解決資料傾斜問題,一致性雜湊演算法引入了虛擬節點機制,即將每乙個服務節點都計算為多個虛擬節點,避免單個節點持有連續的大空間:

分布式 一致性雜湊演算法

一致性雜湊演算法,作為分布式計算的資料分配參考,比傳統的取模,劃段都好很多 傳統雜湊取模,在資料需要遷移時代價巨大,因此需要優化。一致性雜湊 將雜湊值看作乙個環,順時針將雜湊值接近節點的物件存到對應節點,通過這種演算法做資料分布,在增減節點的時候,可以大大減少資料的遷移規模。此時,可能會出現乙個問題...

分布式雜湊和一致性雜湊演算法

目錄 1 資料分布 2 雜湊方式 3 一致性雜湊方式 筆記來自分布式原理一書,供個人學習。單機系統與分布式系統的最大的區別在於問題的規模,即計算 儲存的資料量的區別。將乙個單機問題使用分布式解決,首先要解決的就是如何將問題拆解為可以使用多機分布式解決,使得 分布式系統中的每台機器負責原問題的乙個子集...

一致性Hash演算法 分布式雜湊

一致性雜湊演算法在1997年由麻省理工學院提出的一種分布式雜湊 dht 實現演算法,設計目標是為了解決網際網路中的熱點 hot spot 問題,初衷和carp十分類似。一致性雜湊修正了carp使用的簡單雜湊演算法帶來的問題,使得分布式雜湊 dht 可以在p2p環境中真正得到應用。一致性hash演算法...