每個程序員都應該知道的六種負載均衡算法
一個大型網絡平臺能輕松面對數百萬請求而不產生崩潰,負載均衡器(Load Balancer)是絕對的關鍵組件。
負載均衡器會在多個服務器之間分配工作流,也就是將用戶請求轉發到不同的機器上,可以確保服務的高可用性、響應速度和可擴展性。那么問題來了,負載均衡器的背后會有很多服務器,那么這些服務器之間要如何分配請求呢?顯然這就涉及到了負載均衡算法,而了解核心的負載均衡算法可以讓我們更好地設計和優化應用程序,以及故障排除。
負載均衡算法分為兩大類:靜態和動態。
下面我們就來介紹這每一種算法的區別,并深入討論它的工作原理和優缺點。
Round Robin(輪詢法)
靜態負載均衡算法只負責將請求轉發到服務器,而不會考慮服務器的實時條件和性能指標,所以它的優勢是簡單,缺點是適應性和精確性較差。而 Round Robin 在概念上是最簡單的靜態負載均衡算法,它會將請求均勻地轉發給每一個服務器。
每來一個請求,就按照順序轉發給每一個服務器,比如請求 1 轉發給 A,請求 2 轉發給 B,請求 3 轉發給 C。然后請求 4 再轉發給 A,不斷循環往復,就是將請求均勻分配到每個服務器上。當然我們這里只用三臺服務器舉例,更多的服務器也是同樣的轉發方式。
Round Robin 這種算法易于實現和理解,如果你的服務器配置都是一樣的,那么 Round Robin 也是一個不錯的負載均衡算法,雖然它比較簡單。但現實情況是,不同服務器的處理能力可能不一致,那么此時 Round Robin 算法就會有幾率導致處理能力較弱的服務器出現過載,因此你需要對服務器的資源進行監控。
Sticky Round Robin(粘性輪詢法)
Sticky Round Robin 是 Round Robin 的擴展,它會將來自同一用戶的連續請求發送到同一臺服務器。
因為同一個用戶的請求會轉發到相同的服務器,那么就可以將相關數據提前保存起來,從而提升性能。但由于新來的用戶是隨機分配的,會容易出現負載不均衡的情況。
Weighted Round Robin(加權輪詢法)
Weighted Round Robin 允許操作者為不同的服務器分配不同的權重或優先級,權重較高的服務器將按照比例接收更多的請求。
服務器 A、B、C 的權重比值為 3: 1: 1,所以假設有 5 個請求,服務器 A 要處理 3 個,服務器 B、C 分別處理 1 個。加權輪詢法允許我們考慮服務器的異構能力,但缺點是必須手動配置權重,這在動態變化的場景中不夠靈活。
IP/URL Hash
除了 Round Robin 系列算法之外,我們還可以對客戶端的 IP 地址或請求的 URL 進行哈希,然后來決定請求要被映射到哪一臺服務器中。
如果哈希函數選擇得當,那么請求可以被均勻分發,然而選擇一個好的哈希函數是具有挑戰性的。
Least Connections(最少連接算法)
說完了靜態負載均衡算法,我們再來看看動態負載均衡算法。相比靜態,動態均衡算法在分發請求時會考慮到服務器的性能指標以及當前所剩資源,從而動態調整。
Least Connections 算法會將每個新的請求轉發到當前活躍連接數最少的服務器,顯然這就需要負載均衡器實時跟蹤每個后端服務器上的活躍連接數。
如果再來一個新請求,它會被轉發給服務器 A。因此最小連接算法可以靈活地對請求進行分配,以確保每臺機器都能最大程度的處理請求,不會出現資源閑置。但如果連接不均勻地堆積,負載可能不經意地集中在某些服務器上。
Least Time(最少響應時間算法)
Least Time 和 Least Connections 類似,只不過它是將請求轉發到延遲最低或者響應速度最快的服務器,負載均衡器需要持續評估每個服務器的延遲,并最終決定將請求轉發到哪一個服務器上。
這種方法具有高度自適應性和反應迅速的特點,但它需要持續地監測后端服務器的延遲,這會帶來顯著的開銷并增加復雜性。并且它也沒有考慮每個服務器已經有多少個正在處理的請求,它只是將請求轉發給延遲最低的服務器。
以上就是常見的 6 種負載均衡算法,總的來說,簡單的靜態算法和更自適應的動態算法之間存在明顯的權衡,我們需要考慮特定的性能目標、能力和約束來選擇負載均衡策略。
像輪詢這樣的靜態算法很適合無狀態的應用程序,而動態算法則有助于優化大型復雜應用的響應時間和可用性,至于具體選擇哪種算法則取決于當前的業務。