动态

详情 返回 返回

ByteByteGo學習筆記:一致性哈希 - 动态 详情

一、引言

在分佈式系統中,實現水平擴展的關鍵在於能夠有效地分配請求並均勻地將數據分配到各個服務器上。一致性哈希算法作為一種常用的技術,能夠很好地解決這一問題。本文將深入探討一致性哈希算法的原理、實現以及應用場景。

二、重哈希問題

2.1 傳統哈希方法

傳統的哈希方法通常使用取模運算來確定鍵存儲在哪個服務器上,即 serverIndex = hash(key) % N,其中 N 是服務器池的大小。這種方法在服務器數量固定且數據分佈均勻時效果較好,但在服務器數量發生變化時,會導致大量的鍵需要重新映射,從而引發緩存未命中等問題。

2.2 問題示例

假設我們有 4 個服務器和 8 個字符串鍵及其哈希值,如表 1 所示:

key hash hash % 4
key0 18358617 1
key1 26143584 0
key2 18131146 2
key3 35863496 0
key4 34085809 1
key5 27581703 3
key6 38164978 2
key7 22530351 3

image

當服務器 1 下線時,服務器池的大小變為 3,使用相同的哈希函數但不同的模運算,會導致大多數鍵需要重新分配。這會導致大量的緩存未命中,影響系統的性能。

image

三、一致性哈希算法

3.1 定義

一致性哈希算法是一種特殊的哈希方法,當哈希表重新分配時,只有 k/n 個鍵需要重新映射,其中 k 是鍵的數量,n 是槽的數量。相比之下,傳統哈希表在數組槽數量變化時,幾乎所有鍵都需要重新映射。

3.2 哈希空間和哈希環

一致性哈希算法使用一個哈希函數(如 SHA-1)將鍵和服務器映射到一個哈希環上。哈希環的範圍是從 0 到 2^160 - 1。服務器和鍵都被映射到這個環上。

image

3.3 確定存儲鍵的服務器

在一致性哈希算法中,確定存儲鍵的服務器的方法是從鍵的位置順時針移動,直到找到第一個服務器。例如,key0 存儲在服務器 0 上,key1 存儲在服務器 s1 上,key2 存儲在服務器 s2 上,key3 存儲在服務器 s3 上。

image

3.4 添加和移除服務器

  • 添加服務器:當添加新服務器時,只需要重新分配一小部分鍵。例如,添加服務器 s4 後,只需要重新分配 key0,其他鍵仍然存儲在原來的服務器上。

image

  • 移除服務器:當移除服務器時,也只需要重新分配一小部分鍵。例如,移除服務器 s1 後,只需要將 key1 重新映射到服務器 s2,其他鍵不受影響。

image

四、上述算法存在兩個問題

4.1 分區大小不均勻

在一致性哈希算法中,分區是哈希空間在相鄰服務器之間的部分。當服務器可以添加或移除時,分區大小可能非常大或非常小,導致數據分佈不均勻。例如,如果服務器 s1 被移除,服務器 s2 的分區可能是服務器 s0 和 s3 的分區的兩倍。

image

4.2 非均勻的鍵分佈

在某些情況下,鍵可能在哈希環上分佈不均勻。例如,如果服務器映射到圖中的位置,大多數鍵可能存儲在服務器 s2 上,而服務器 s3 幾乎沒有數據。

image

五、虛擬節點

5.1 定義

虛擬節點是一種解決上述問題的技術。每個服務器在哈希環上由多個虛擬節點表示。例如,服務器 0 和服務器 1 都有 3 個虛擬節點。使用虛擬節點,每個服務器負責多個分區,從而提高了數據分佈的均勻性。

image

5.2 確定存儲鍵的服務器

在使用虛擬節點的情況下,確定存儲鍵的服務器的方法是從鍵的位置順時針移動,直到找到第一個虛擬節點。例如,要找出服務器 k0 存儲在哪裏,我們從 k0 的位置順時針移動並找到虛擬節點 s1_1,它指的是服務器 s1。

image

5.3 找到受影響的鍵

當服務器添加或移除時,需要重新分配一部分數據。受影響的鍵範圍可以通過以下方法確定:

  • 添加服務器:受影響的範圍從新添加的節點開始,並順時針移動直到找到下一個服務器。例如,添加服務器 s4 後,位於 s3 和 s4 之間的鍵需要重新分配到 s4。

image

  • 移除服務器:受影響的範圍從移除的節點開始,並順時針移動直到找到下一個服務器。例如,移除服務器 s1 後,位於 s0 和 s1 之間的鍵必須重新分配到 s2。

image

六、一致性哈希算法的優點

6.1 最小化鍵的重新分配

一致性哈希算法在服務器添加或移除時,只需要重新分配一小部分鍵,從而最小化了鍵的重新分配。

6.2 易於水平擴展

一致性哈希算法使得數據更均勻地分佈,從而易於實現水平擴展。

6.3 緩解熱點鍵問題

一致性哈希算法通過均勻分佈數據,緩解了熱點鍵問題。例如,如果 Katy Perry、Justin Bieber 和 Lady Gaga 的數據都在同一分片上,一致性哈希算法可以幫助緩解服務器過載的問題。

七、一致性哈希算法的應用

一致性哈希算法在許多實際系統中得到了廣泛應用,包括:

  • 亞馬遜 Dynamo 數據庫的分區組件
  • Apache Cassandra 中的集羣數據分區
  • Discord 聊天應用程序
  • Akamai 內容交付網絡
  • Maglev 網絡負載均衡器

八、總結

一致性哈希算法是一種有效的技術,用於在分佈式系統中實現水平擴展和數據均勻分佈。通過使用哈希環和虛擬節點,一致性哈希算法能夠最小化鍵的重新分配,緩解熱點鍵問題,並支持系統的水平擴展。在實際應用中,一致性哈希算法已經被廣泛應用於許多著名的系統中,證明了其有效性和可靠性。

參考資料
ByteByteGo

user avatar daqianduan 头像 eolink 头像 buildyuan 头像 tssc 头像 dalideshoushudao 头像 chaoxi_67109d31bc42f 头像 java_3y 头像 best_6455a509a2177 头像 fanjiapeng 头像 ftkj_2018 头像 tanking 头像 guangmingleiluodebaomihua 头像
点赞 41 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.