一致性hash演算法的一些理解

kolin發表於2022-02-17

之前對hash演算法的認識就是 傳一個key進去 然後計算出來一個值,還有就是nginx負載均衡策略中的ip_hash跟url_hash,也大概是傳一個值進去算一個值出來,直到後來同學問了我一句,nginx的ip_hash算出來一個node1,那如果這個node掉線了,nginx會將這個請求打到其他可用節點上麼?
基於上面這個問題 後來瞭解到了一致性hash演算法,百度了一些相關文章後,下面基於查閱到的資料說下自己的理解。
百度上說一致性hash演算法應該滿足4個適應條件:

  • 均衡性(平衡性)
  • 單調性
  • 分散性
  • 負載

看完上面幾個你可能也還一臉懵,沒關係 我當時也是 下面來看一些具體的設計 看完你就懂了~

1、環形的hash空間

按照常用的hash演算法來將對應的key雜湊到一個具有2^32次方個節點的空間中,即0 ~ (2^32)-1的數字空間中。現在我們可以將這些數字頭尾相連,想象成一個閉合的環形。大概是下面這樣:

一致性hash演算法的一些理解

2、對映伺服器節點

將伺服器使用hash計算出一個值,具體可以使用伺服器ip或一個唯一的主機名,這樣每臺機器就能在hash環上有一個確定的位置,下面是模擬了4臺伺服器在hash環上的落點:

一致性hash演算法的一些理解

3、對映請求

下面我們將RequestA,RequestB,RequestC,RequestD四個請求按照特定的hash函式計算出一個值,然後也分佈到雜湊環上,下面是示例:

一致性hash演算法的一些理解

然後四個小綠點就從所在位置開始順時針轉,遇到的第一個伺服器節點就是它應該定位到的伺服器節點。
此時如果某個節點下線了,請求也能根據順時針走向找到下一個可用的伺服器節點。

4、虛擬節點

可以想象一下,當我們的伺服器節點比較少時,那麼就不可避免的會造成大量的請求向某一個節點傾斜,也就是失去了平衡性,所以一致性雜湊演算法引入了虛擬節點機制,也就是對每一個伺服器節點多計算出幾個hash值,計算出來的這些虛擬子節點也會分佈到環上,但實際請求的時候還是會找到它對應真實存在的父節點,模擬出一種伺服器節點很多的感覺,這樣就解決了服務節點少時資料傾斜的問題。每個物理節點關聯的虛擬節點數量就根據具體的生產環境情況在確定。

參考文章:https://zhuanlan.zhihu.com/p/98030096

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章