在集中式環境中服務的機器臺只有一臺,這樣對於服務不僅存在服務單點故障問題而且還存在流量問題。爲了解決這個問題,就引入的分佈式與集羣概念。
分佈式:一個業務分拆多個子業務,部署在不同的服務器上
集羣:同一個業務,部署在多個服務器上
1、 dubbo 服務治理
當請求來臨時,如何從多個服務器中,選擇一個有效、合適的服務器,這個集羣所需要面對一問題。所以在集羣裏面就引申出負載均衡(LoadBalance),高可用(HA),路由(Route)等概念。我們來看一下 dubbo 在進行服務調用的時候是如何處理的。
這張集羣容錯包含以下幾個角色:
Invoker
:對Provider
(服務提供者) 的一個可調用 Service 接口的抽象,Invoker
封裝了Provider
地址及Service
接口信息。Cluster
:Directory
中的多個Invoker
僞裝成一個Invoker
,對上層透明,僞裝過程包含了容錯邏輯,調用失敗後,重試另一個Directory
:代表多個Invoker
,可以把它看成List<Invoker>
,但與 List 不同的是,它的值可能是動態變化的,比如註冊中心推送變更Router
: 負責從多個Invoker
中按路由規則選出子集,比如讀寫分離,應用隔離等LoadBalance
:LoadBalance
負責從多個Invoker
中選出具體的一個用於本次調用,選的過程包含了負載均衡算法,調用失敗後,需要重選.
2、負載均衡
下面我們來分析一下 LoadBalance, 也就是負載均衡。我們可以來看一下 維基百科, 對於負載均衡的描述。
在計算中,負載平衡1提高了跨多個計算資源的工作負載分佈,例如計算機、計算機集羣、網絡鏈接、中央處理器或磁盤驅動器。負載平衡的目的是優化資源使用,最大化吞吐量,最小化響應時間,避免任何單一資源的過載。使用負載平衡而不是單個組件的多個組件可以通過冗餘來提高可靠性和可用性。負載平衡通常涉及專用的軟件或硬件,比如多層交換機或域名系統服務器進程。
負載平衡與渠道結合的不同之處在於,負載平衡分裂之間的交通網絡上的網絡接口插座(OSI模型層4)基礎上,而通道結合意味着一個部門之間的交通物理接口在一個較低的水平,每包(OSI模型層3)或在一個數據鏈路(OSI模型層2)基礎與最短路徑等協議橋接。
3、dubbo LoadBalance
以下是 dubbo 中 負載均衡的定義:
public interface LoadBalance {
/**
* select one invoker in list.
*
* @param invokers invokers.
* @param url refer url
* @param invocation invocation.
* @return selected invoker.
*/
@Adaptive("loadbalance")
<T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException;
}
負載平衡的其實就是根據不同的策略從 Invoker 列表中選擇中一個適合的 Invoker 來進行遠程調用。
我們來看一下 dubbo 裏面的 LoadBalance 類圖:
3.1 RandomLoadBalance
RandomLoadBalance : 隨機,按權重設置隨機概率。
在一個截面上碰撞的概率高,但調用量越大分佈越均勻,而且按概率使用權重後也比較均勻,有利於動態調整提供者權重。
3.2 RoundRobinLoadBalance
RoundRobinLoadBalance:輪循,按公約後的權重設置輪循比率。
存在慢的提供者累積請求的問題,比如:第二臺機器很慢,但沒掛,當請求調到第二臺時就卡在那,久而久之,所有請求都卡在調到第二臺上。
3.3 LeastActiveLoadBalance
LeastActiveLoadBalance :最少活躍調用數,相同活躍數的隨機,活躍數指調用前後計數差。
使慢的提供者收到更少請求,因爲越慢的提供者的調用前後計數差會越大。
3.4 ConsistentHashLoadBalance
- 一致性 Hash,相同參數的請求總是發到同一提供者。
- 當某一臺提供者掛時,原本發往該提供者的請求,基於虛擬節點,平攤到其它提供者,不會引起劇烈變動。
- 算法參見:http://en.wikipedia.org/wiki/Consistent_hashing
- 缺省只對第一個參數 Hash,如果要修改,請配置
<dubbo:parameter key="hash.arguments" value="0,1" />
- 缺省用 160 份虛擬節點,如果要修改,請配置
<dubbo:parameter key="hash.nodes" value="320" />
4、LoadBalance 算法
負載均衡算法有幾種經典實現,已經是老生常談了,總結後主要有如下幾個:
- 輪詢(Round Robin)
- 加權輪詢(Weight Round Robin)
- 隨機(Random)
- 加權隨機(Weight Random)
- 源地址哈希(Hash)
- 一致性哈希(ConsistentHash)
- 最小連接數(Least Connections)
- 低併發優先(Active Weight)
dubbo 默認支持 1、2、3、7 這4種負載均衡策略,如果你需要使用另外 4 種負載均衡策略。可以使用 dubbo 的 SPI 機制來擴展 LoadBalance。具體可以參考 dubbo 負載均衡擴展
參考文章:
1.http://en.wikipedia.org/wiki/Load_balancing_(computing)
2.http://dubbo.apache.org/books/dubbo-user-book/demos/loadbalance.html
3.https://www.cnkirito.moe/rpc-cluster/