一文讀懂“負載均衡”

yinghualeihenmei發表於2024-07-01

原文連結:https://blog.csdn.net/cyl101816/article/details/135195729

負載均衡無處不在,無論是分散式,還是中介軟體,還是微服務,都需要涉及到負載均衡。

一、什麼是負載均衡
負載均衡是一種在計算機網路和系統架構中使用的技術,用於均衡分發工作負載到多個資源,比如:伺服器、計算節點或儲存裝置上,以提高系統的效能、可伸縮性。

如下圖所示:

在傳統的單個伺服器架構中,當請求量增加時,單個伺服器可能無法處理所有的請求,導致效能下降或系統崩潰。

負載均衡技術透過將負載(請求)分發到多個伺服器上,實現資源的合理利用,從而平衡伺服器的負載。

這樣可以提高系統的處理能力,增加併發處理能力,並減少單點故障的風險。

二、負載均衡作用
負載均衡的作用,主要包含如下幾點:

1.提高系統效能
負載均衡技術將負載(請求或任務)分發到多個資源上,使得系統能夠處理更多的併發請求,從而提高整體的處理能力和效能。

2.實現高可用性
負載均衡可以將負載分發到多個資源上,當其中一個資源發生故障或不可用時,負載均衡可以自動將請求轉發到其他可用的資源。

這樣可以降低單點故障的風險,提高系統的可靠性和容錯性。

3.提高系統可伸縮性
隨著業務的增長,負載均衡技術可以動態地增加或減少資源的數量,根據實際負載情況進行擴充套件或收縮。

透過自動分配負載到新增的資源上,系統可以實現水平擴充套件,滿足不斷增長的需求,提高系統的可伸縮性。

4.最佳化資源利用
負載均衡技術可以根據資源的效能、可用性和負載情況,合理地分配請求或任務。

這樣可以最大限度地利用資源,避免資源的空閒或過載,提高資源的利用率和效率。

三、負載均衡的原理
系統的擴充套件可分為縱向(垂直)擴充套件和橫向(水平)擴充套件。

比如:縱向擴充套件,是從單機的角度透過增加硬體處理能力,比如CPU處理能力,記憶體容量,磁碟等方面,實現伺服器處理能力的提升。這種情況,不能滿足大型分散式系統(網站),大流量,高併發,海量資料的問題。

因此需要採用橫向擴充套件的方式,透過新增機器來滿足大型網站服務的處理能力,比如:一臺機器不能滿足,則增加兩臺或者多臺機器,共同承擔訪問壓力。

如下圖所示:

負載均衡器作為一箇中間層,接收來自客戶端的請求,並根據特定的演算法和策略將請求分發給後端的多個資源(如伺服器、計算節點或儲存裝置)。客戶端可以直接將請求傳送給負載均衡器,或透過域名解析、DNS等方式間接連線到負載均衡器。

四、負載均衡演算法
負載均衡演算法,主要分為如下5類:

1.Round Robin-輪詢
輪詢,顧名思義,把請求按順序分配給每個伺服器,然後重複執行這個順序,進行請求分配。

假設有3臺伺服器,分別為A,B,C,當客戶端有請求過來時,請求會按照A——>B——>C——>A——>B——>C...這種輪訓的順序分配給各個伺服器。

原理:

伺服器列表:維護一個伺服器列表,有伺服器加入/剔除時,相應的更新伺服器列表;
伺服器遊標:記錄需要處理下一個請求的伺服器;
請求分發:新的請求到達,選擇當前伺服器來處理該請求,然後伺服器遊標+1;
迴圈:不斷重複步驟三,以確保每個伺服器都有機會處理請求;
2.Weighted Round Robin - 加權輪詢
在輪詢的基礎上根據硬體配置不同,按權重分發到不同的伺服器,適合場景:跟配置高、負載低的機器分配更高的權重,使其能處理更多的請求。

3.最少連線數
記錄每個伺服器正在處理的請求數,把新的請求分發到最少連線的伺服器上,因為要維護內部狀態不推薦。

原理
維護一個所有伺服器和連線數的字典(Map);
當新的請求到達時,負載均衡器會檢查伺服器列表中當前連線數最少的伺服器;
請求將被分配給具有最少連線數的伺服器,處理請求後該伺服器的連線數+1;
如果有多臺伺服器具有相同的最小連線數,演算法可以使用其他標準來選擇其中一臺,如加權等

優缺點
優點:

動態負載均衡:它根據伺服器的當前負載情況來做出決策,這使得它能夠有效地分配請求給當前連線數最少的伺服器,從而確保了伺服器資源的最佳利用。
適應性強:這個演算法適用於伺服器效能不均勻的情況,因為它關注的是連線數,而不是伺服器的硬體配置或效能評估。
避免過載:透過將新請求分配給連線數最少的伺服器,”最小連線數”演算法有助於防止某些伺服器被過度載入,從而提高了系統的穩定性和效能。
自動恢復:如果某臺伺服器由於故障或重啟而導致連線數清零,該演算法會自動開始將新請求分配給該伺服器,以實現自動恢復。
缺點:

連線數不一定代表負載:”最小連線數”演算法假設連線數與伺服器的負載成正比,但這並不總是準確。有時候,某臺伺服器的連線數可能很高,但仍然能夠處理更多的請求,而另一臺連線數較低的伺服器可能已經達到了其效能極限。
不適用於長連線:如果伺服器上有大量長期活躍的連線,例如WebSocket連線,該演算法可能不太適用,因為長連線不同於短暫的HTTP請求,連線數的統計可能會產生誤導。
無法解決伺服器效能差異:雖然”最小連線數”演算法可以平衡連線數,但它無法解決伺服器硬體效能差異的問題。在這種情況下,可能需要其他負載均衡演算法,如加權輪詢,來更好地適應效能差異。

4.IP/URL Hash-IP/URL雜湊
IP/URL 雜湊演算法是一種根據客戶端 IP 地址或 URL 來分配請求的負載均衡演算法,這樣相同的IP或者URL就會負載到相同的伺服器上。

原理
將客戶端 IP 地址或 URL 雜湊到伺服器列表中,
然後將請求分配給雜湊值對應的伺服器。
優缺點
優點:

穩定性:IP/URL Hash 演算法可以確保相同的客戶端請求總是被分發到相同的伺服器上。這可以提高應用程式的穩定性,因為客戶端的會話資料在同一伺服器上保持一致。
適用於會話保持:當應用程式需要在多次請求之間保持會話狀態時,IP/URL Hash 演算法非常有用。客戶端在一次請求中選擇的伺服器會在後續請求中保持一致,確保會話資料不會丟失。
負載均衡:IP/URL Hash 演算法可以將特定的客戶端請求均勻地分配到多個伺服器上,從而實現基本的負載均衡,避免了某些伺服器被過度請求。
缺點:

不適用於動態環境:IP/URL Hash 演算法基於客戶端的 IP 地址或 URL,一旦客戶端 IP 或請求的 URL 發生變化,請求可能會被分配到不同的伺服器上,導致會話資料丟失或不一致。
不考慮伺服器負載:IP/URL Hash 演算法不考慮伺服器的當前負載情況。如果某個伺服器的負載過高,IP/URL Hash 無法動態地將請求分發到負載較低的伺服器上。
適用場景
靜態環境:在靜態環境中,即客戶端的 IP 地址或請求的 URL 不經常變化的情況下,IP/URL Hash 演算法可以提供穩定的負載均衡。

少數伺服器的負載均衡:當伺服器數量相對較少且不太容易動態擴充套件時,IP/URL Hash 演算法可以用於基本的負載均衡。

5.Least Response Time - 最短響應時間
最短響應時間就是指:處理請求的響應時間最少的伺服器,獲取的請求就越多。直白講就是速度快,就乾的多。

適用場景
負載均衡的所有伺服器,處理能力相差比較大。比如:有3臺伺服器,伺服器A(4C8G,4個CPU,8G記憶體),伺服器B(2C4G,2個CPU,4G記憶體),伺服器C(1C2G,1個CPU,2G記憶體), 那麼就可以採用這種演算法,這樣可以根據伺服器的處理來實現動態負載。

交通控制系統:在城市交通控制系統中,需要及時響應交通訊號、路況和車輛檢測等資訊。最短響應時間演算法可以幫助確保交通訊號及時適應交通流量的變化。

優缺點
優點:可以充分發揮各個伺服器的效能,提高伺服器的利用率。

缺點:飢餓問題。比如,伺服器A的效能最好,處理速度最快,那麼所有的請求都會被分配到伺服器A,這樣伺服器B和伺服器C就會一直處於飢餓狀態,無法處理請求。這樣也就會產生不公平。

五、負載均衡的分類

負載均衡主要分為:二層、三層、四層、以及七層負載均衡。

1.二層負載均衡(mac)
根據OSI模型分的二層負載,一般是用虛擬mac地址方式,外部對虛擬MAC地址請求,負載均衡接收後分配後端實際的MAC地址響應)。

2.三層負載均衡(ip)
一般採用虛擬IP地址方式,外部對虛擬的ip地址請求,負載均衡接收後分配後端實際的IP地址響應。

3.四層負載均衡(tcp)
四層負載均衡就是基於IP 埠的負載均衡,在三次負載均衡的基礎上,用ip port接收請求,再轉發到對應機器。

實現四層負載均衡的軟體有:

F5:硬體負載均衡器,功能很好,但是成本很高。
lvs:重量級的四層負載軟體
nginx:輕量級的四層負載軟體,帶快取功能,正規表示式較靈活
haproxy:模擬四層轉發,較靈活
4.七層負載均衡(http)
七層的負載均衡,就是基於虛擬的URL或主機IP的負載均衡,根據虛擬的url或IP,主機名接收請求,再轉向相應的處理伺服器。

實現七層負載均衡的軟體有:

haproxy:天生負載均衡技能,全面支援七層代理,會話保持,標記,路徑轉移;
nginx:只在http協議和mail協議上功能比較好,效能與haproxy差不多;
apache:功能較差
Mysql proxy:功能尚可。
總的來說,一般是lvs做4層負載;nginx做7層負載。

六、負載均衡應用場景
負載均衡技術可以應用於多種場景,包括但不限於以下幾個方面:

1.Web應用負載均衡
在Web應用中,負載均衡可以將請求分發到多個Web伺服器上,以提高併發處理能力和吞吐量,適用於高訪問量的網站、電子商務平臺等場景。

2.資料庫負載均衡
對於資料庫叢集,負載均衡可以將資料庫請求分發到多個資料庫節點上,實現資料的分佈和負載的均衡,這有助於提高資料庫的處理能力、可靠性和可伸縮性。

3.應用服務負載均衡
在分散式應用中,負載均衡可以將請求分發給多個應用伺服器例項,以平衡工作負載和提高系統的效能,這適用於微服務架構、分散式計算、訊息佇列等場景。

4.高效能運算負載均衡
在科學計算、大資料處理和高效能運算領域,負載均衡技術可以將計算任務分發到多個計算節點上,實現任務的並行處理和加速,它適用於叢集計算、分散式儲存、資料分析等場景。

相關文章