Dubbo 中有四種負載均衡策略:RandomLoadBalance(按權重隨機)、RoundRobinLoadBalance(輪詢)、LeastActiveLoadBalance(最少活躍數)、ConsistentHashLoadBalance(一致性哈希)
LoadBalance
1. RandomLoadBalance 隨機策略
- 如果所有的權重一樣,則隨機挑選一個節點;
- 節點權重不一樣:A(1),B(2),C(3),D(4)
- 先根據總權重10 隨機生成一個數,比如說3;
- 接下來遍歷所有節點:3-1=2;2-2=0;0-3=-3,知道offset< 0
- 3<0 則返回C節點
2. RoundRobinLoadBalance
輪詢是Dubbo的負載均衡策略;
- Round-Robin Scheduling: 按照1-N(節點數量) 順序分配節點,不考慮權重。如果某一節點處理速度較慢,那么該節點就會累計大量的請求。
- Weighted Round-Robin Scheduling(按照權重的輪詢):
3. LeastActiveLoadBalance
假設有A、B兩個節點。A、B兩個節點分別處理兩個請求,計數分別+1;如果B節點處理請求比A快,B處理完請求后,計數-1。于是A的計數為1,B的計數為0. 下次請求過來時,B的計數比較小,于是B節點獲得請求。如果A、B的計數值一樣,則按照節點的權重隨機選取(參考RandomLoadBalance)。
擴展:ActiveLimitFilter可以用來限制客戶端的并發請求數量
4. ConsistentHashLoadBalance
相同參數的請求,最終都會請求到一個節點上去。
- 如果某一個節點down了,節點總數-1,hash/(N-1)和原來的hash/(N)的差別比較大,導致緩存失效,會引起服務端較大的震蕩。N越大,震蕩越大。
- 一致性Hash算法解決上述問題
-
環形Hash空間
按照常用的Hash取模的方式,將key分布在0~(2^32)-1的數字空間中,我們可以將這些數字頭尾相連,想象成一個閉合的環形。
屏幕快照 2019-06-30 下午1.12.13.png - 采用一致性Hash算法,把請求參數、節點映射到上述的數字空間中。
- 按照順時針的順序,找到最近的節點。
- 如果某一個節點down了,請求只會按照順時針尋找到下一個節點。于是只影響了一個節點。但是這樣增加了被影響節點的訪問壓力,為了分散這種影響,可以使用虛擬節點。
- 假如有N個真實節點,把每個真實節點映射成M個虛擬節點,再把 M*N 個虛擬節點, 散列在圓環上. 各真實節點對應的虛擬節點相互交錯分布這樣,某真實節點down后,則把其影響平均分擔到其他所有節點上.(中間方案)