偶識一致性 Hash 演算法

2021-10-11 10:59:59 字數 1872 閱讀 8970

主要的應用場景歸納起來有兩個

比如 nginx 的 ip_hash 可以在客戶端 ip 不變的情況下,將其請求始終路由到同一臺伺服器上,實現了會話粘滯,避免了 session 共享問題。

sessionid 

進⾏計算雜湊值,雜湊值與伺服器數量進⾏取模運算,得到的值就是當前請求應該被路由到的伺服器編號

upstream lagouserver
如果沒有 ip_hash 策略,那麼如何實現會話粘滯?可以維護⼀張對映表,儲存客戶端 ip

或者 sessionid 

與具體⽬標伺服器的對映關係 或 

缺點 1

)在客戶端很多的情況下,對映表⾮常⼤,浪費記憶體空間 2

)客戶端上下線,⽬標伺服器上下線,都需要重新維護對映表,對映表維護成本⼤

假設集群中現在有 3 臺 redis 伺服器:reids1,redis2,redis3。那麼,在進行資料儲存時,儲存到哪個伺服器中呢?這時可以採用 hash 演算法,對 key 進行 hash 處理。

hash(key1) % 3(伺服器數量) = index,index 就是儲存該資料的伺服器編號。

以 ip_hash 

為例,假定客戶端 ip 

沒有發⽣改變,現在 

tomcat3 

宕機了,伺服器數量由 

3 個變為了 

2 個,之前所有的求模都需要重新計算。

如果在⽣產環境下,後台伺服器數量多,客戶端也有很多,那麼影響是很⼤的。伺服器的縮容和擴容都會存在這樣的問題,⼤量⽤戶的請求會被路由到其他的⽬標伺服器,⽤戶在原來伺服器中的會話都會丟失。

// 定義伺服器數量

int servercount = 5;// (編號對應0,1,2)

// hash(ip)%node_counts=index

//根據index鎖定應該路由到的tomcat伺服器

for(string client: clients) }}

public class consistenthashnovirtual ;

sortedmaphashservermap = new treemap<>();

for (string tomcatserver : tomcatservers)

//step2 針對客戶端ip求出hash值

// 定義客戶端ip

string clients = new string;

for (string client : clients) else }}

}

public class consistenthashwithvirtual ;

sortedmaphashservermap = new treemap<>();

// 定義針對每個真實伺服器虛擬出來⼏個節點

int virtaulcount = 3;

for (string tomcatserver : tomcatservers)

}//step2 針對客戶端ip求出hash值

// 定義客戶端ip

string clients = new string;

for (string client : clients) else }}

}

一致性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...