負載均衡策略之有限負載一致性雜湊
本文簡單介紹一下有限負載一致性雜湊(Consistent Hashing with Bounded Loads)(或者叫有界負載一致性雜湊、有負載界限/上限的一致性雜湊)這個負載均衡策略。
之前介紹的一致性雜湊策略 有一個缺陷,那就是沒有解決熱點問題:當有部分資源是熱點資源或者部分使用者請求量比較大的時候,會出現部分節點需要處理大量請求(這些請求根據一致性雜湊策略都選中了固定的部分節點),出現負載非常不均的情況,因為是一致性雜湊所以這些請求沒法分攤到其他節點上,導致出現持續的負載不均和熱點問題。下面要介紹的 Consistent Hashing with Bounded Loads 就是一種解決這個問題的方法。
有限負載一致性雜湊(Consistent Hashing with Bounded Loads)
有限負載一致性雜湊(Consistent Hashing with Bounded Loads) 出自論文Consistent Hashing with Bounded Loads ,主要思路是,根據當前負載情況對所有節點限制一個最大負載,在一致性雜湊中對 hash 環進行查詢時將跳過超出最大負載的節點,通過把過載的請求轉移到其他節點上來解決熱點和不均衡問題:
- R : 當前所有節點的總負載(正在處理的總請求數)
- T : 節點總個數
- L : 當前所有節點的平均負載
- L = R/T
- ε : 一個引數用於表示在平均負載的基礎上能夠承受的額外負載上限,可以按照實際需求進行設定(根據 vimeo 分享的經驗 這個值推薦設定為 0.25~1)
- M : 節點的最大負載上限
- M =L*(1+ε) =R*(1+ε)/T
- 一致性雜湊中進行節點查詢時,增加檢查匹配的節點的負載(正在處理的請求數)是否達到負載上限M 的操作,如果達到了上限則跳過當前節點繼續往後查詢。
通過上面可以發現 Consistent Hashing with Bounded Loads 結合了最少連線策略 和一致性雜湊 策略各自的優點,即平衡了負載又兼顧了一致性雜湊,並且還可以通過調整轉化為最少請求策略或一致性雜湊策略:
- 當ε 的值是 0 的時候,就實現了最少連線策略的效果
- 當ε 的值是無窮大的時候,就是傳統的一致性雜湊策略。
上面的方法是沒有區分節點權重的,如果要支援節點權重的話,需要做一點改動:
- R : 當前所有節點的總負載(正在處理的總請求數)
- T : 所有節點的權重總和
- L : 當前所有節點的平均負載(基於權重的平均負載)
- L = R/T
- W : 當前節點的權重值
- ε : 一個引數用於表示在平均負載的基礎上能夠承受的額外負載上限。
- M : 節點的最大負載上限
- M =W*L*(1+ε) =W*R*(1+ε)/T
- 一致性雜湊中進行節點查詢時,增加檢查匹配的節點的負載(正在處理的請求數)是否達到負載上限M 的操作,如果達到了上限則跳過當前節點繼續往後查詢。
可以看到主要區別是算平均負載的時候是基於節點的權重和來計算的,算負載上限的時候是按權重比來計算的。
簡單介紹了一下 Consistent Hashing with Bounded Loads ,更詳細的內容請參考參考資料。