一致性hash演算法

2021-08-09 15:37:45 字數 2995 閱讀 6873

伺服器的負載均衡的演算法有很多,包括:輪循演算法(round robin)、雜湊演算法(hash)、最少連線演算法(least connection)、響應速度演算法(response time)、加權法(weighted )等。其中雜湊演算法是最為常用的演算法。

典型的應用場景是: 有n臺伺服器提供快取服務,需要對伺服器進行負載均衡,將請求平均分發到每台伺服器上,每台機器負責1/n的服務。常用的演算法是對hash結果取餘數 (hash() mod n ):對機器編號從0到n-1,按照自定義的hash()演算法,對每個請求的hash()值按n取模,得到餘數i,然後將請求分發到編號為i的機器

但這樣的演算法方法存在致命問題,如果某一台機器宕機(或者新增一台機器),那麼應該落在該機器的請求就無法得到正確的處理,這時需要將當掉的伺服器從演算法從去除,此時候會有伺服器的快取資料需要重新進行計算。對於系統而言,這通常是不可接受的顛簸(因為這意味著大量快取的失效或者資料需要轉移)。乙個設計良好的分布式雜湊方案應該具有良好的單調性,即服務節點的增減不會造成大量雜湊重定位。一致性雜湊演算法就是這樣一種雜湊方案。那麼,如何設計乙個負載均衡策略,使得受到影響的請求盡可能的少呢?

(在memcached

、key-value store 、bittorrent dht、lvs中都採用了consistent hashing演算法,可以說consistent hashing 是分布式系統負載均衡的首選演算法)

一致性雜湊演算法(consistenthashing algorithm)是一種分布式演算法,常用於負載均衡。

memcached client也選擇這種演算法,解決將key-value均勻分配到眾多memcached server上的問題。它可以取代傳統的取模操作,解決了取模操作無法應對增刪memcached server的問題(增刪server會導致同乙個key,在get操作時分配不到資料真正儲存的server,命中率會急劇下降)。

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

2、下一步將各個伺服器使用h進行乙個雜湊,具體可以選擇伺服器的ip或主機名作為關鍵字進行雜湊,這樣每台機器就能確定其在雜湊環上的位置,這裡假設將上文中三颱伺服器使用ip位址雜湊後在環空間的位置如下: 

3、接下來使用如下演算法定位資料訪問到相應伺服器:將資料key使用相同的函式h計算出雜湊值h,通根據h確定此資料在環上的位置,從此位置沿環順時針「行走」,第一台遇到的伺服器就是其應該定位到的伺服器。

例如我們有a、b、c、d四個資料物件,經過雜湊計算後,在環空間上的位置如下:

根據一致性雜湊演算法,資料a會被定為到server 1上,d被定為到server3上,而b、c分別被定為到server 2上。

下面分析一致性雜湊演算法的容錯性和可擴充套件性。現假設server 3宕機了:

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

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

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

綜上所述,一致性雜湊演算法對於節點的增減都只需重定位環空間中的一小部分資料,具有較好的容錯性和可擴充套件性。

一致性雜湊演算法在服務節點太少時,容易因為節點分部不均勻而造成資料傾斜問題。例如我們的系統中有兩台伺服器,其環分布如下: 

此時必然造成大量資料集中到server 1上,而只有極少量會定位到server 2上。為了解決這種資料傾斜問題,一致性雜湊演算法引入了虛擬節點機制,即對每乙個服務節點計算多個雜湊,每個計算結果位置都放置乙個此服務節點,稱為虛擬節點。

具體做法可以在伺服器ip或主機名的後面增加編號來實現。例如上面的情況,我們決定為每台伺服器計算三個虛擬節點,於是可以分別計算「memcached server 1#1」、「memcached server 1#2」、「memcached server 1#3」、「memcached server 2#1」、「memcached server 2#2」、「memcached server 2#3」的雜湊值,於是形成六個虛擬節點: 

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

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

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

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

一致性hash演算法

july部落格16章開始 第一題 全排列,輸入乙個字串,列印出該字串中字元的所有排列 1.個人思路 回溯法建立的排序樹 2.july部落格 遞迴實現,依次固定第乙個字母,後面的交換,和上面描述的使用回溯法相似 c stl 演算法 next permutation的思想,關於next permutat...