在分布式系統的高可用設計中,負載均衡非常關鍵,我們知道,分布式系統的特性之一就是支持快速擴展,那么集群擴展之后,服務請求如何從服務器列表中選擇合適的一臺呢?這就需要依賴負載均衡策略。
負載均衡在處理高并發,緩解網絡壓力,以及支持擴容等方面非常關鍵,在不同的應用場景下,可以選擇不同的負載均衡,下面一起來看一下負載均衡相關的知識。
負載均衡的應用
負載均衡是指如何將網絡請求派發到集群中的一個或多個節點上處理,一般來說,傳統的負載均衡可以分為硬件負載均衡和軟件負載均衡。
-
硬件負載均衡,就是通過專門的硬件來實現負載均衡,比如常見的 F5 設備。
-
軟件負載均衡則是通過負載均衡軟件實現,常見的就是 Nginx。
無論是硬件負載均衡還是軟件負載均衡,實現原理都是一樣的,在負載均衡中會記錄一個可用的服務列表,負載均衡服務器會通過心跳機制來確認服務可用性,在網絡請求到達后,F5 或者 Nginx 等負載均衡設備,會按照不同的策略,進行服務器的路由,這就是負載均衡的流程。
負載均衡的應用非常廣,這一課時我們主要關注在分布式系統的請求調用,服務分發中的負載均衡。
常見的復雜均衡策略
一般而言,有以下幾種常見的負載均衡策略。
輪詢策略
輪詢策略是最容易想到也是應用最廣泛的負載均衡策略。輪詢策略會順序地從服務器列表中選擇一個節點,請求會均勻地落在各個服務器上。輪詢適合各個節點性能接近,并且沒有狀態的情況,但是在實際開發中,不同節點之間性能往往很難相同,這時候就可以應用另一種加權輪詢策略。
加權輪詢
加權輪詢是對輪詢策略的優化,給每個節點添加不同的權重。舉個簡單的例子,在實際開發中通常使用數組的數據結構來實現輪詢,比如現在我有 A、B、C 三個節點,就可以在數組中添加 1、2、3 的數據,分別對應三個節點。現在我進行一個加權調整,讓 1、2、3 對應 A,4、5 對應 B、C,這時候繼續進行輪詢,不同節點的權重就有變化了。
隨機策略
隨機策略和輪詢相似,從列表中隨機的取一個。我們都學過概率論的課程,真正的隨機是很難實現的,所以如果訪問量不是很大,最好不要應用隨機策略,可能會導致請求不均勻。
最小響應時間
這個主要是在一些對請求延時敏感的場景中,在進行路由時,會優先發送給響應時間最小的節點。
最小并發數策略
你可以對比最小響應時間,最小并發策略會記錄當前時刻每個節點正在處理的事務數,在路由時選擇并發最小的節點。最小并發策略可以比較好地反應服務器運行情況,適用于對系統負載較為敏感的場景。
除了這些,還有哈希策略等,另外,在第 35 課時中我們提到過一致性哈希,其實一致性哈希也是一種負載均衡策略,一致性哈希經常應用在數據服務的路由中。
負載均衡如何實現
在分布式服務調用中,根據負載均衡實現的位置不同,可以分為服務端負載均衡和客戶端負載均衡。
-
在服務器端負載均衡中,請求先發送到負載均衡服務器,然后通過負載均衡算法,在眾多可用的服務器之中選擇一個來處理請求。
-
在客戶端負載均衡中,不需要額外的負載均衡軟件,客戶端自己維護服務器地址列表,自己選擇請求的地址,通過負載均衡算法將請求發送至該服務器。
相信你已經看到了,這兩種負載均衡,最大的區別就是服務器列表維護的位置。
下面我們來看一下,服務端負載均衡和客戶端負載均衡如何實現呢?
在分布式服務調用中,服務端負載均衡常用的組件是 Spring Cloud Eureka,如果你選擇了 Dubbo 作為中間件,那么可以應用 Dubbo 內置的路由策略。
在 Spring Cloud 中開啟負載均衡的方法很簡單,有一個專門的注解 @LoadBalanced 注解,配置這個注解之后,客戶端在發起請求的時候會選擇一個服務端,向該服務端發起請求,實現負載均衡。另外一種客戶端負載均衡,也有對應的實現,典型的是 Spring Cloud Ribbon。
Ribbon 實際上是一個實現了 HTTP 的網絡客戶端,內置負載均衡工具、支持多種容錯等。
我們上面提到的幾種策略,在 Ribbon 中都有提供,包括 RoundRobinRule 輪詢策略、RandomRule 隨機策略、BestAvailableRule 最大可用策略、WeightedResponseTimeRule 帶有加權的輪詢策略等。
如果你的應用需要比較復雜的負載均衡場景,推薦應用 Ribbon,本課時的目的是講解負載均衡被實現的原理,你可以到 Ribbon 的官方倉庫,去了解相關的應用。
總結
以上內容我和大家一起討論了負載均衡的應用場景、常見負載均衡策略,以及服務端和客戶端負載均衡實現組件。
現在我們來思考一個問題,為什么說分布式高可用設計中,負載均衡很關鍵呢?我們都知道,在分布式場景下,特別是微服務拆分后,不同業務系統之間是解耦的,負載均衡策略,也就是描述了各個應用之間如何聯系。
我們用訂單場景來舉例子,下單時依賴商品服務,假設我們選擇的是輪詢策略,當某臺商品服務器出現網絡故障、服務超時,此時下單就會受影響,如果改為最小可用時間策略,訂單服務就會自動進行故障轉移,不去請求超時的節點,實現高可用。
在你的工作中,應用過哪些負載均衡策略呢,又是如何進行配置的,歡迎留言進行分享~