手繪 一致性hash演算法原理

2021-10-18 21:42:44 字數 1140 閱讀 3666

有時候由於資料量太大,乙個資料庫的容量不能滿足我們的需求

就需要多個資料庫儲存資料,這樣讀寫前我們需要先確定應該操作哪乙個資料庫

如下圖,我們想將一批資料放入到8個資料庫中。可以將資料id跟8做求模運算,根據得到的值選擇對應的資料庫,這樣讀寫都可以這樣選擇乙個資料庫操作(有時候不一定是根據id或id非數值又或其他原因,一般會使用其hash值來做求模運算)

存在的問題:擴充套件或收縮乙個節點,其他所有節點都受影響

如果8個資料庫不夠用了或者業務量減少需要縮減機器,所有資料都需要重新計算並遷移

因為乙個數值跟8求模和7或9的結果肯定不一樣

所以就出現了一致性hash演算法

如下圖,我們設定乙個0~99範圍的環(hash環),a、b、c三個資料庫對應的位置分別是20、40、70

我們要讀寫是資料id的hash值跟100求模,大於等於20且小於40的操作a資料庫,大於等於40且小於70的操作b資料庫,大於等於70或小於20的操作c資料庫

這樣如果再加乙個資料庫d到a、c中間,只需將c資料庫中間的部分資料遷移就可以

同理如果移除b資料庫,只需將b資料庫中資料全部遷移到a資料庫即可

這樣擴充套件或收縮乙個節點時受影響的節點只有乙個(需要額外維護節點對應hash環範圍)

ps:一般hash環範圍是0 ~ 232-1,因為ip的最大範圍是0 ~ 232-1

存在的問題:資料傾斜

如上圖,一般我們是將a、b、c隨機均勻分配到hash環上,但是有可能出現極端情況資料id的hash值求模後大部分集中在某一段範圍,比如a和b中間,那麼可能會造成b資料庫超負荷,而a和c資料庫使用的卻非常少

為解決資料傾斜問題,我們可以在hash環上增加虛擬節點

比如我們增加a1、a2、b1、b2、c1、c2隨機均勻分布在hash環上

演算法不變,只是虛擬節點分別對映到對應的真實節點,理論上虛擬節點越多越可以避免資料傾斜問題

一致性hash演算法 面試必備 一致性hash演算法

最近公司在招人,我們準備的問題中有一道是關於一致性hash演算法的問題,只有一些面試者能夠回答上來,而且答的也不是很全面,有的面試者只是聽說過,有的連聽都沒聽過,下面我把一致性hash演算法整理一下分享給大家 一致性雜湊演算法在1997年由麻省理工學院的karger等人在解決分布式cache中提出的...

一致性hash演算法虛擬節點 一致性hash演算法

hash 演算法也叫做雜湊演算法,他可以讓任意長度的資料m對映成為長度固定的值h。hash演算法的第乙個作用就是資料的快速儲存與查詢。寫過程式的人都知道,基本上主流的程式語言裡面都有個資料結構叫做map dictionary或者 hash table 它是根據key來直接訪問結果的資料結構。key的...

一致性Hash演算法原理白話

1 技術背景 1.1 技術舉例 memcache 1.2 技術瓶頸 memcached伺服器端本身不提供分布式cache的一致性,由客戶端實現提供。以餘數分布式演算法為例。餘數分布式演算法是根據新增進入快取時key的hash值通過特定的演算法得出餘數,然後根據餘數對映到關聯的快取伺服器,將該key ...