6 種常見的負載均衡算法
負載均衡算法有很多,下面介紹 6 種常見的負載均衡算法。
靜態算法
- 輪詢(Round Robin)
將客戶端請求按照順序發送給不同的服務實例。通常要求服務實例是無狀態的。
如下圖所示:
第 1 個請求,先發給第 1 臺服務器 A
第 2 個請求,發給下一臺服務器,即第 2 臺服務器 B
第 3 個請求,發給下下一臺服務器,即第 3 臺服務器 C
第 4 個請求,由於 3 臺服務器都已經輪流發送了一遍,因此需要從頭開始,先發給第 1 臺服務器 A
以此類推...
- 粘性輪詢(Sticky Round Robin)
這是輪詢算法的改進版本。
如果 Alice 的第 1 個請求發送給了服務 A,那麼後續的請求也會繼續發送給服務 A。
同樣的,Bob 的第 1 個請求發送給了服務 B,那麼後續的請求也會繼續發送給服務 B。
- 加權輪詢(Weighted Round Robin)
可以爲每個服務設置權重。權重較高的服務將會處理比其他服務更多的請求。
如下圖所示,服務 A、B 和 C 的權重分別爲 0.8、0.1 和 0.1,那麼服務 A 將會接收並處理更多的請求。
可以看到,前 3 個請求都路由給了服務 A,而第 4 個請求路由給了服務 B。
- 哈希(Hash)
該算法根據傳入請求的 IP 或 URL 進行哈希函數運算,根據哈希運算的結果,將請求路由到相應的服務實例。
由於我們共有 3 臺服務器,因此將哈希結果對 3 取模之後,得到的取值範圍爲 0、1 和 2。
以 IP 作爲哈希的 Key 爲例:
對 Alice 的 IP 進行哈希取模處理之後,結果爲 0,因此 Alice 的請求都會路由到服務 A。
而對 Bob 的 IP 進行哈希取模處理之後,結果爲 2,因此 Bob 的請求都會路由到服務 C。
動態算法
- 最小連接數(Least Connections)
新的請求會被髮送到當前併發連接數最少的服務實例。
服務 A、服務 B 和服務 C,當前已建立的連接數分別是 1000、100 和 10。
顯然,服務 C 當前的連接數遠小於服務 A 和服務 B。因此,新的 4 個請求都路由給了服務 C。
- 最短響應時間(Least Response Time)
新的請求會被髮送到響應時間最快的服務實例。
服務 A、服務 B 和服務 C,當前的請求響應時間分別是 100ms、10ms 和 1ms。
顯然,服務 C 當前的響應時間是最快的。因此,新的 4 個請求都路由給了服務 C。
粘性輪詢(Sticky Round Robin)和 哈希(Hash)
從效果上來看,粘性輪詢算法和哈希算法似乎很相似。但其實,還是有很多差異的點。
例如:
-
粘性輪詢是輪詢算法的變種和改進版本,路由的規則還是通過輪詢來實現的。而哈希,則是根據指定的 Key(如 IP、URL)進行哈希取模,來確定路由的目標服務。
-
粘性輪詢通常需要維護存儲客戶端和服務實例之間的綁定關係,以使同一個客戶端總是能夠路由到同一個服務實例。
-
在需要擴容服務器時,粘性輪詢可以保證客戶端路由的服務器節點都是不變的,而哈希算法通常不可避免的部分客戶端是需要重新路由到新加入的節點的。
參考
https://bytebytego.com/
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/IZtBLxmdhaD5j3tHmVyYTA