1. 程式人生 > >負載均衡的常見手段

負載均衡的常見手段

 

包括 CDN(內容交付網路)和雲提供商在內,多站點的大型網際網路系統可以選擇多種方式來均衡進入其網路的流量。在本文中,我們將描述常見的流量均衡設計,包括技術和權衡手段。

如果你是早期的雲端計算服務提供商,你可以使用一個單獨的客戶 web 伺服器,為它分配一個 IP 地址,並配置一個 DNS(域名系統)記錄來將它與一個易讀的名字關聯起來,之後通過 BGP(邊界閘道器協議)來傳播 IP 地址,這是種在網路間交換路由資訊的標準方式。

在冗餘的網路路徑上分發流量,在不可用的基礎設施周圍進行路由來提高可用性(會導致不對稱路由等現象),這些從本質上講並不是負載均衡。

簡單的 DNS 負載均衡

隨著客戶服務流量的增長,業務方希望獲得更高的可用性。你添加了另一個具有公網 IP 地址的 web 伺服器,並更新了 DNS 記錄來將使用者引導到這兩個 web 伺服器(希望稍微公平一些)。直到某一個 web 伺服器意外宕機前,這種方法都是可行的。假設你快速檢測到故障,可以通過更新 DNS 配置(手動方式或使用軟體)來停止引用損壞的伺服器。

遺憾的是,由於 DNS 記錄是有快取的,這些快取記錄可能會在客戶端或者 DNS 層次結構中的其他名稱伺服器中,在它們過期之前,大約有 50% 的請求仍然可能失敗。DNS 記錄的 TTL(time to live,生存時間)通常為幾分鐘或更長,因此這會對系統的可用性造成重大影響。

更糟糕的是一些客戶端完全忽略了 TTL,所以一些請求將在一段時間內被定向到已經宕機的 web 伺服器上。設定非常短的 DNS TTL 也不是什麼好主意;這意味著 DNS 服務的負載增加,延遲增加,因為客戶端不得不更加頻繁地執行 DNS 查詢。如果你的 DNS 服務不可用,那麼使用更短的 TTL 訪問服務將更快地降級,因為快取服務 IP 地址的客戶端更少。

增加網路負載均衡

為了解決這個問題,你可以新增一對冗餘的 4 層(Layer 4)網路均衡器,並在相同的虛擬 IP(VIP)地址提供服務。它們可以是硬體裝置,或者像 HAProxy 這樣的軟體均衡器。這意味著 DNS 記錄僅僅指向虛擬 IP 而不再做負載均衡。

1

4 層負載均衡器將來自使用者的連線均衡分佈在兩個 web 伺服器上

4 層均衡器將來自因特網的流量均衡地引導至後端伺服器。這通常是基於每個 IP 包的 5 元組的雜湊(一個數學函式)完成的:源 IP 地址和目標 IP 地址,以及埠加上協議(如 TCP 或 UDP)。這種方式快速、高效(並且仍然維持了 TCP 的基本屬性),並且不需要均衡器維護每個連線的狀態。

4 層均衡器可以進行健康檢查,並僅僅向那些通過檢查的 web 伺服器傳送流量。與 DNS 均衡不同的是,如果一個 web 伺服器崩潰,將流量重定向到另一個 web 伺服器上的延遲很小,儘管現有連線將被重置。

4 層均衡器可以做加權平均,處理不同容量的後端,它為運維人員提供了強大的能力和靈活性,同時在計算能力方面相對便宜。

走向多站點

系統繼續擴張。即使你的資料中心出現故障,你的客戶也希望能繼續保持運轉。你會構建一個新的資料中心,其中包含自己的一組後端服務和另一組 4 層均衡器,它們在與之前一樣的虛擬 IP 上提供服務。DNS 設定不變。這兩個站點的邊緣路由器都在傳播地址資訊,包括服務的虛擬 IP。根據終端使用者和系統之間的網路連線情況,以及它們的路由策略配置,傳送到虛擬 IP 的請求可以到達任一個站點。這被稱為 anycast(任播)。大多數情況下,這種方法都很有效。如果其中一個站點出現故障,你可以停止通過 BGP 傳播服務虛擬 IP,這樣流量就可以迅速轉移到另一個站點。

2

使用 anycast(任播)從多個站點提供服務

這個設定有幾個問題。最糟糕的是,你無法控制流量的走向或者限制傳送到某個特定站點的流量。通常,決定路由的網路協議和配置應該將使用者路由到最近的站點,不過就網路延遲而言,你並沒有明顯的方法來實現這個目標。

在多站點系統中控制入站請求

為了維持穩定性,你需要控制每個站點的流量,你可以為每個站點分配不同的虛擬 IP,並使用 DNS 的簡單迴圈或加權 迴圈 來均衡流量。

3

 

從多個站點提供服務:每個站點使用一個主虛擬 IP,二級站點備份,使用地理感知 DNS

現在產生了兩個新的問題。

首先,使用 DNS 均衡意味著你有快取記錄,這不太適用於那些需要迅速重定向流量的場景。

第二,每當使用者做一次新的 DNS 查詢,虛擬 IP 會將使用者連線到一個隨機的站點,而不一定是離使用者最近的那一個。如果你的服務站點分佈廣泛,根據使用者和服務站點之間的網路延遲,各個使用者感知到的系統響應效能會有較大波動。

讓每個站點不斷傳播虛擬 IP,併為所有其他站點(以及任何有問題的站點的虛擬 IP)提供服務,你可以通過這種方式解決第一個問題。一些網路技巧(比如從備份中傳播不那麼特殊的路由資訊)可以確保虛擬 IP 對應的主站只要是可用的,那麼它便是首選。這是通過 BGP 完成的,因此在更新 BGP 後的一到兩分鐘內,我們應該會看到流量的移動。

除了讓距離使用者最近的健康站點為其提供服務以外,並沒有一個更加優雅的選擇。很多大型網際網路服務嘗試使用 DNS 來向不同位置的使用者返回不同的結果,並在一定程度上取得了成功。不過這種方法總是有點 複雜和容易出錯,因為因特網的定址方案並不是按地理位置組織的,地址塊可以改變位置(例如,當公司重新組織其網路時),很多終端使用者仍然可以通過快取名稱伺服器獲得服務。

增加 7 層負載均衡

隨著時間的推移,你的客戶開始對一些更加高階的特性提出要求。

雖然 4 層負載均衡器可以高效地在多個 web 伺服器之間分配負載,但這種分配是隻在源 IP 地址和目標 IP 地址、協議和埠上進行的。4 層均衡器對請求的內容一無所知,所以也無法實現很多高階特性。相對而言,7 層(L7)負載均衡器知道請求的結構和內容,可以做得更多。

在 7 層均衡器中可以實現的一些特性包括快取、限流、錯誤注入和代價敏感的負載均衡(部分請求需要更多的服務端處理時間)。

它們還可以基於請求的屬性(例如 HTTP cookies)進行均衡、終止 SSL 連線,並幫助抵禦應用層拒絕服務(DoS)攻擊。7 層均衡器成本較高,不易擴容——它們為處理請求做了更多的計算,而且每個活動請求都會消耗一些系統資源。在一個或多個 7 層均衡器池前執行 4 層均衡器可以幫助解決擴充套件問題。

負載均衡是一個複雜的難題。除了本文描述的策略之外,還有不同的 負載均衡演算法、用於實現負載均衡器的高可用技術、客戶端負載均衡技術以及最近興起的服務網格。

隨著雲端計算的發展,核心的負載均衡模式也在不斷演進,大型 web 服務也將繼續改進負載均衡所能提供的控制和靈活性。