一致性hash演算法 負載均衡

2022-08-23 10:42:13 字數 1995 閱讀 5833

有沒有好奇過redis、memcache等是怎麼實現集群負載均衡的呢?

其實他們都是通過一致性hash演算法實現節點排程的。

講一致性hash演算法前,先簡述一下求餘hash演算法:

hash(object)%n
乙個快取伺服器宕機了,這樣所有對映到這台伺服器的物件都會失效,我們需要把屬於該伺服器中的快取移除,這時候快取伺服器是 n-1 臺,對映公式變成了 hash(object)%(n-1) ;

由於qps公升高,我們需要新增多一台伺服器,這時候伺服器是 n+1 臺,對映公式變成了 hash(object)%(n+1) 。

1 和 2 的改變都會出現所有伺服器需要進行資料遷移。

一致性hash演算法的出現有效的解決了上面普通求餘演算法在節點變動後面臨全部快取失效的問題:

type consistent struct

簡單地說,一致性雜湊將整個雜湊值空間組織成乙個虛擬的圓環,如假設某空間雜湊函式h的值空間是0-2^32-1(即雜湊值是乙個32位無符號整形),整個雜湊空間如下:

下一步將各個伺服器使用雜湊演算法計算出每台機器的位置,具體可以使用伺服器的ip位址或者主機名作為關鍵字,並且是按照順時針排列:

//這裡我選擇crc32,具體情況具體安排

func hashkey(host string) uint32

這裡我們假設三颱節點memcache經計算後位置如下:

}接下來使用相同演算法計算出資料的雜湊值,並由此確定資料在此雜湊環上的位置

假如我們有資料a、b、c和d,經過雜湊計算後位置如下:

根據一致性雜湊演算法,資料a就被繫結到了server01上,d被繫結到了server02上,b、c在server03上,是按照順時針找最近服務節點方法

這樣得到的雜湊環排程方法,有很高的容錯性和可擴充套件性:

假設server03宕機

可以看到此時a、c、b不會受到影響,只是將b、c節點被重定位到server 1。一般的,在一致性雜湊演算法中,如果一台伺服器不可用,則受影響的資料僅僅是此伺服器到其環空間中前一台伺服器(即順著逆時針方向行走遇到的第一台伺服器)之間資料,其它不會受到影響。

考慮另外一種情況,如果我們在系統中增加一台伺服器memcached server 04:

此時a、d、c不受影響,只有b需要重定位到新的server 4。一般的,在一致性雜湊演算法中,如果增加一台伺服器,則受影響的資料僅僅是新伺服器到其環空間中前一台伺服器(即順著逆時針方向行走遇到的第一台伺服器)之間資料,其它不會受到影響。

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

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

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

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

負載均衡一致性hash演算法一點總結

參考 這篇寫的非常通俗易懂 大意 利用乙個環形的hash空間selectors 雜湊範圍0 2 32 1,實際上底層是乙個concurrentmap 按照hash演算法將乙個key雜湊到指定的位置。物件 o1,o2,o3 的雜湊與機器 node1,node2,node3 的雜湊演算法是一樣的。形成過...