Hash算法和一致性Hash算法詳解

Hash算法在路由算法應用中,爲了保證數據均勻的分佈,例如有3個桶,分別是0號桶,1號桶和2號桶;現在有12個球,怎麼樣才能讓12個球平均分佈到3個桶中呢?使用Hash算法的做法是,將12個球從0開始編號,得到這樣的一個序列:0,1,2,3,4,5,6,7,8,9,10,11。將這個序列中的每個值模3,不管數字是什麼,得到的結果都是0,1,2,不會超過3,將結果爲0的數字放入0號桶,結果爲1的數子放入1號桶,結果爲2的數字放入2號桶,12個球就均勻的分佈到3個桶中,0,3,6,9,12號球放入0號桶,1,4,7,10號球放入1號桶,2,5,8,11號球放入2號桶。

    一致性Hash算法是在Hash算法的基礎上實現的,用於解決互聯網中熱點Hotspot問題,將來自網絡上的流量動態的劃分到不同的服務器處理。使用一致性Hash算法將流量均勻分發到不同服務器的做法是:

1、求出不同服務器的哈希值,然後映射到一個範圍爲0 — 2^32-1的數值空間的圓環中,即將首(0)和尾(2^32-1)相接的圓環,如下圖。


Hash算法和一致性Hash算法

2、當有一個李四的用戶訪問時,就會給該用戶分配一個隨機數,該隨機數映射到圓環中的任意一個地方,按照圓環順時針的方向查找距離最近的服務器,然後處理李四用戶的請求。如果找不到服務器,則有第一臺服務器來處理。

以上是兩種Hash算法的簡單介紹和對比,Hash算法在信息處理、信息安全方面應用廣泛,而一致性hash算法主要應用是互聯網分佈式場景、大數據領域等。在複雜場景下,以上一致性hash算法是有缺陷,通過以下兩方面來適用複雜隨機應用場景。

3、一致性Hash算法的容錯性和可擴展性

現假設Node C不幸宕機,可以看到此時對象A、B、D不會受到影響,只有C對象被重定位到Node D。一般的,在一致性Hash算法中,如果一臺服務器不可用,則受影響的數據僅僅是此服務器到其環空間中前一臺服務器(即沿着逆時針方向行走遇到的第一臺服務器)之間數據,其它不會受到影響,如下所示:


Hash算法和一致性Hash算法標題

4、Hash環的數據傾斜問題

一致性Hash算法在服務節點太少時,容易因爲節點分部不均勻而造成數據傾斜(被緩存的對象大部分集中緩存在某一臺服務器上)問題,例如系統中只有兩臺服務器,其環分佈如下:


Hash算法和一致性Hash算法

此時必然造成大量數據集中到Node A上,而只有極少量會定位到Node B上。爲了解決這種數據傾斜問題,一致性Hash算法引入了虛擬節點機制,即對每一個服務節點計算多個哈希,每個計算結果位置都放置一個此服務節點,稱爲虛擬節點。具體做法可以在服務器IP或主機名的後面增加編號來實現。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章