一致性Hash演算法

2021-10-13 04:57:04 字數 3056 閱讀 2945

分布式和集群是不⼀樣的, 分布式⼀定是集群,但是集群不⼀定是分布式(因為集群就是多個例項⼀起⼯作,分布式將⼀個系統拆分之後那就是多個例項;

集群並不⼀定是分布式,因為複製型的集群不是拆分⽽是複製)

hash演算法在分布式集群架構中的應用場景,如 分布式集群架構redis、hadoop、elasticsearch, mysql分庫分表, nginx負載均衡

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

nginx的ip_hash 策略可以在客戶端ip不變的情況下,將其發出的請求始終路由到同乙個目標伺服器上,實現會話粘滯,避免處理session共享問題

使用hash演算法,我們可以對ip位址或sessionid 計算hash值   hash值 % 伺服器數量 = 當前請求路由到的伺服器編號,如此 , 同乙個客戶ip地請求可以路由到同台機器上,實現會話粘滯

* @description 一般hash演算法

*/public class generalhash ;

//定義伺服器數量

int servercountn = 5; // 0 , 1 , 2

for (string client: clients)}}

nginx 的 ip_hash**在

資料儲存到哪個伺服器當中呢,針對key進行hash處理, hash(key1) % 3 = index

redis1,  redis2,  redis3 三颱redis伺服器

普通hash演算法存在的問題示意圖

5 這台機器會 請求不到 原來的session,   重新進行hash計算 代價很大

將1~2^32-1 圍成乙個圖, 4臺伺服器 分布在 圓圈上的 4個節點上(圖中的大紅點)。   同時 客戶的請求根據ip也是相同的處理(圖中的綠色小人)

當使用者請求來臨時,按照使用者請求計算的值 ,按順時針去 請求對應的伺服器

伺服器3下線後,原來路由到3的客戶端重新路由到伺服器4,對於其他客戶端沒有影響

只是這⼀⼩部分受影響(請求的遷移達到了最⼩,這樣的演算法對分布式集群來說⾮常合適的,避免了⼤量請求遷移 )

增加伺服器5之後,原來路由到3的部分客戶端路由到新增伺服器5上,對於其他客戶端沒有影響

只是這⼀⼩部分受影響(請求的遷移達到了最⼩,這樣的演算法對分布式集群來說⾮常合適的,避免了⼤量請求遷移 )

* @description 一致性hash演算法(無虛擬節點)

*/public class consistenthashnovirtualhost ;

for (string serverip: tomcatservers)

string clients = ;

// 求客戶端的 ip

for (string client: clients) else

system.out.println("------------------ client :" + client+" 被路由到 : " + hashservermap.get(serverip));}}

}當伺服器集群節點分布不均勻時,會造成節點1的負載較大,造成資料傾斜的問題,如下圖所示。

此時我們可以增加虛擬節點,(比如對於節點1,  再進行計算 節點1的ip#1  節點1的ip#2  節點1的ip#3 這些值的hash值, 落在虛擬節點上的請求,還是由節點1去處理請求), 節點二同理。

這樣可以減少 資料傾斜問題

/**

* @description 一致性hash演算法(含有虛擬節點)

*/public class consistenthashwithvirtualhost ;

// 定義虛擬伺服器ip

int virtualcount = 3;

for (string serverip: tomcatservers)

}string clients = ;

// 求客戶端的 ip

for (string client: clients) else

system.out.println("------------------ client :" + client+" 被路由到 : " + hashservermap.get(serverip));}}

編譯安裝

make

make install

在nginx/conf/nginx.conf中進行配置

配置說明 :

ngx_http_upstream_consistent_hash 模組是⼀個負載均衡器,使⽤⼀個內部⼀致性hash演算法來選擇合適的後端節點。

該模組可以根據配置引數採取不同的⽅式將請求均勻對映到後端機器,

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