Hash取餘法與Hash一致性演算法

2021-10-02 20:04:32 字數 3176 閱讀 8286

三、hash一致性演算法的平衡性問題

hash取餘法其實非常簡單,只要學過資料結構雜湊表的大概都會知道(常用演算法)

hash取餘法在分布式系統中的使用

為了簡單說明問題,就不說微服務、redis之類的東西了(下面這個例子並不符合當前開發的模式,但足以說明hash取余能解決的問題以及帶來的問題)

以下圖為例。

下面每個tomcat都是乙個單體應用,通過nginx負載均衡搭建後端應用集群。為了session能夠的正確獲取,通過nginx的取餘演算法來達到負載均衡的目的

負載均衡演算法:hash(ip位址)%tomcat總數即(「ip位址」.hashcode&integer.max_value)%tomcat總數

通過hash演算法,得到ip位址的hash值(得出乙個整數),再通過取餘計算,因為這裡的tomcat為三颱,所以這裡的餘數為3,那麼這個ip位址每次訪問都總是可以分配到同一臺tomcat上去

優點:1)、這種演算法及其簡單,並且效率較高(cpu最擅長的就是計算)

2)、ip位址的hash值總是一樣的,可以解決每次請求被負載均衡到其他tomcat導致session失效的問題

缺點:1)、當增加/減少tomcat的數量時,會導致大量的session失效。

我們可以這麼算一下,一開始三颱tomcat存著的session,假如因為三颱tomcat承受不住過多的訪問壓力,需要新增一台tomcat,那麼tomcat的數量就會變成4臺,那麼就會出現這樣的問題,hash(ip位址)%4,那麼所有的請求都會被重新hash化,訪問的tomcat都會變得不同,這樣會導致大量的session失效。與未增加tomcat之前,命中同一臺tomcat的概率為1/4=25%,那麼說大概就會有75%概率的session失效。同樣假如tomcat宕機tomcat減少了一台,從之前的3臺變成了2臺,那麼就會有50%的概率導致session失效。

為了解決這種大量的session失效問題,就引入了hash一致性演算法的概念

hash一致性演算法是2023年由麻省理工提出的一種理論。

hash一致性演算法是這樣的,我們把hash值把它看成乙個圓環即整個最大的hash值為2^32-1(大概為43億多),最小值為0,並且將其固定為43億多+1=0,0-1=43億多(這裡很像c語言的unsigned int)。這樣整個hash值就是乙個大圓環了。

這裡我通過hash的取餘法來計算出,三颱tomcat所在的位置。即 hash(tomcat的ip)%43億

可以得出以下的分布

當有請求時,我們就將請求的ip位址hash化,即 hash(本次請求的ip位址)%43億

譬如有三個請求。

分別為請求1,請求2,請求3。這時我們規定,請求將會順時針方向尋找我們的伺服器tomcat

那麼請求3將會找到tomcat1,請求1將會找到tomcat2,請求2將會找到tomcat3

那麼目前解決了什麼問題呢?

當有9個請求,那麼將會通過hash演算法,雜湊分配到0-43億的位置,並且訪問順時針最近的tomcat伺服器。形如下圖所示。

那麼當tomcat1宕機了,所有的tomcat1請求就會轉向地去訪問tomcat2。雖然之前tomcat1的所有請求的session都會失效,但是之前訪問tomcat2和tomcat3的所有請求,仍舊訪問著之前訪問的伺服器,所以session並不會失效。

對比之前的hash取餘法,因為一台tomcat宕機或新增tomcat,導致大量的session失效。hash一致演算法會不會就好得多得多?當新增/減少足夠的tomcat,hash取餘和hash一致性兩者的區別就會越來越明顯了。

那麼當新增tomcat,hash一致性會出現怎樣的問題呢?

可以看出,新增一台tomcat4,所有部分原本訪問tomcat1的請求都轉向訪問tomcat4了。但這些影響只是一小部分的。所以影響並不是特別大。可容錯性就變強了

看完hash一致性演算法大家可能都會產生乙個疑問。hash一定就會雜湊分布嘛,總會小概率的出現一大部分的請求都分配給了tomcat1,而tomcat2和3都只分配了小部分啊。或者說太少的tomcat經過hash的雜湊演算法分布情況不一導致部分伺服器太閒,部分伺服器很忙的情況出現。形如下圖。tomcat2承受了大量的請求,而tomcat3和1閒的要死

為了解決這種平衡,這裡引出了一種虛擬節點的概念

首先tomcat1、tomcat2、tomcat3都是真實節點

我們可以虛擬出tomcat1-1、tomcat1-2、tomcat2-1、tomcat2-2、tomcat3-1、tomcat3-2的虛擬節點

所有訪問到達tomcat1-1和tomcat1-2的請求,都會轉向tomcat1中去。同理2-1和2-2會訪問tomcat2,到達虛擬節點的請求會轉向訪問其對應的真實節點。形如下圖

引入虛擬節點的概念後,我們其實就可以在這裡大做文章了。譬如權重的分配(tomcat1的硬體伺服器效能比較好,那麼分配的虛擬節點就多一些,tomcat2和3硬體伺服器效能都不咋地,就分配的虛擬節點少一些)

到這裡你可能還會有疑問:增加節點/刪除節點那麼總會有那麼一部分請求會轉向其他伺服器啊,那麼總會有那麼一部分session會失效啊。這可怎麼辦?

其實細想一下,不知道大家有沒有玩過dnf,是不是當伺服器壓力過大的時候就會造成部分玩家掉線?這時大家只要重新登入一下就好了(這是原來訪問的伺服器宕機了,那麼就轉向訪問別的伺服器),當玩家數太大,其實宕機也就導致一小部分人掉線,不會出現很大的問題。這些小問題就很難去避免了…

hash 餘數hash和一致性hash

的伸縮性架構中,分布式的設計是現在的基本應用。在memcached的分布式架構中,key value快取的命中通常採用分布式的演算法 一 餘數hash 簡單的路由演算法可以使用餘數hash node編號 hashcode key 伺服器數目 例如 key beijing 的hash值為4908064...

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

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

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

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