负载平衡

**負載平衡**（英語：load balancing）是一種電腦技術，用來在多個電腦（電腦叢集）、網路連接、CPU、磁碟驅動器或其他資源中分配負載，以達到最佳化資源使用、最大化吞吐率、最小化回應時間、同時避免過載的目的。
使用帶有負載平衡的多個伺服器組件，取代單一的組件，可以通過冗餘提高可靠性。負載平衡服務通常是由專用軟體和硬體來完成。
主要作用是將大量作業合理地分攤到多個操作單元上進行執行，用於解決網際網路架構中的高並行和高可用的問題。

## 基於網際網路的服務

負載平衡最重要的一個應用是利用多台伺服器提供單一服務，這種方案有時也被稱為伺服器農場。通常，負載平衡主要應用於 Web 網站，大型的 Internet Relay Chat 網路，高流量的檔案下載網站，NNTP（Network News Transfer Protocol）服務和 DNS 服務。現在負載平衡器也開始支援資料庫服務，稱之為資料庫負載平衡器。

對於網際網路服務，負載平衡器通常是一個軟體程式，這個程式偵聽一個外部埠，網際網路使用者可以通過這個埠來存取服務，而作為負載平衡器的軟體會將使用者的請求轉發給後台內網伺服器，內網伺服器將請求的回應返回給負載平衡器，負載平衡器再將回應傳送到使用者，這樣就向網際網路使用者隱藏了內網結構，阻止了使用者直接存取後台（內網）伺服器，使得伺服器更加安全，可以阻止對核心網路棧和執行在其它埠服務的攻擊。

當所有後台伺服器出現故障時，有些負載平衡器會提供一些特殊的功能來處理這種情況。例如轉發請求到一個備用的負載平衡器、顯示一條關於服務中斷的訊息等。負載平衡器使得 IT 團隊可以顯著提高容錯能力。它可以自動提供大量的容量以處理任何應用程式流量的增加或減少。

### DNS 輪詢

DNS 輪詢（或 DNS 的迴圈機制），是指一種負載分發，負載平衡或者容錯性地提供多個冗餘的 IP 服務主機的技術。

### Scheduling 演算法

當前，負載平衡器有各種各樣的工作排程演算法（用於決定將前端使用者請求傳送到哪一個後台伺服器），最簡單的是隨機選擇和輪詢。更為進階的負載平衡器會考慮其它更多的相關因素，如後台伺服器的負載，回應時間，執行狀態，活動連接數，地理位置，處理能力，或最近分配的流量。

### 架構

高效能系統通常會使用多層負載平衡。另外專用的硬體負載平衡器以及純軟體負載平衡器，包括開源的，例如 Apache Web 伺服器的 mod proxy balancer 擴充，nginx，Varnish 和 Pound 反向代理和負載平衡器。使用 Gearman 將合適的計算任務分發給多台電腦，如此大量的任務就可以更快的完成了。

對於一個多層次架構體系，在負載平衡器或網路分發器後面有兩種設計，術語稱之為 Bowties 和 Stovepipes。Stovepipe 設計中，事務是從頂部分發的，然後從一個固定通道通過一系列硬體和軟體裝置，到達最終目的地。如果使用 Bowties 設計，在每一層中事務處理有多條路徑可供選擇。在事務處理的網路結構中可能會是 Stovepipes，也可以是 Bowties，或者根據每一層的實際需求採用雜貨構架。

 

#### 持續性

負載平衡器需要處理的一個重要問題是：如何儲存使用者對談？如果對談資訊儲存在後台伺服器，使用者接下來的請求可能會被分配到不同的後台伺服器，此時使用者對談就無法繼續。負載平衡器可以快取使用者對談，然後將使用者請求分發到不同的後台伺服器。但是這將帶來負載平衡器的負載問題。

理想下，在負載平衡後面的伺服器叢集（Server cluster）不應該儲存對談（session-aware），如此一來，一個使用者不管什麼時候連接任何一個後端伺服器都不會收到影響。常用的方案是通過一個**磁碟資料庫（傳統資料庫）** 或者一個**記憶體資料庫**（如： Memcached），實例可參考：Django 快取框架。 將對談資訊存到磁碟資料庫的這個方案由於會增加資料庫的負載，所以這個方案對效能的提高並不好。磁碟資料庫最好是用來儲存對談時間比較長的對談資料。

為了避免資料庫出現單點故障，並且提高其擴充性，資料庫通常會複製到多台伺服器上，通過負載平衡器來分發請求到資料庫伺服器上。微軟 ASP.NET 中的狀態伺服器技術就是一個典型的對談資料庫的例子。叢集中的所有伺服器都將它們的對談資訊儲存到狀態伺服器上，同時它們可以向狀態伺服器查詢對談資料。

另一個簡單的解決方案是，將一個指定的使用者的的今後的所有請求都會傳送到同一個後台伺服器 —— 這種方案也被稱為「粘性（sticky）對談」或者「持續化（persistence）」。但該方案的不足之處在於：無法容錯 (**故障轉移**)，假如後台伺服器故障，該使用者的所有的對談的存取，自然地對談本身也將遺失。即便是資料庫伺服器也發生該情況。雖然 Web 服務（Web Service）不存在狀態和粘性（sticky），但是使用者和資料庫存是繫結的（存在粘性）。

第二個方案是依據使用者名稱，客戶端 IP 來分配提供服務的伺服器，也可以隨機分配。因為客戶可能是通過 DHCP，NAT 或者 Web 代理來連接 Internet 的，其 IP 位址可能經常變換，這使得這個方案的服務品質無法保障。隨機分配由負載平衡器將對談資訊儲存儲存。如果負載平衡器被替換或故障，這些資訊可能會遺失；另外（負載平衡器）負載較高的時候，為保證分配表空間不會被耗盡，逾時的分配資訊必須被刪除。隨機分配方法也要求客戶會維持對談狀態，如果客戶瀏覽器禁用了 cookies 的功能，就會引起問題。優秀的負載平衡器會使用多種持續（對談保持）技術，以避免其中某些不可以用時引起故障。

幸運的是有一種更有效的方法，通常客戶瀏覽器可以儲存使用者的每個對談資訊。例如使用瀏覽器 cookie，對資料加密並加上一個時間戳就可以保證安全了；URL 重寫。將對談資訊儲存在客戶端通常是首選方案，因為這樣負載平衡器就可以靈活的選擇後台伺服器來處理使用者請求。然而這種方法不適應於一些較複雜的電子商務，因為電子商務中對談資料較大，而且需要伺服器需要經常重新處理對談資訊；與此同時，URL 重寫由於使用者可以改變對談流資料而存在安全問題；加密客戶端 cookies 也一直存在著安全方面的爭議，因為 HTTP 很容易遭到中間人攻擊，除非所有的對談都通過 HTTPS，否則無法保證安全性。

 

#### 負載平衡器的特性

不論是軟體負載平衡器，還是硬體負載平衡器都有一系列的特性：

　
: * **不對稱負載調節**。可以對後台伺服器設定權重因子，權重因子用於控制伺服器的請求處理量，進而控制伺服器的負載。當後台伺服器的處理能力不是等同的時候，這是一種控制伺服器負載的簡單方法。
* **優先啟動**。當出現故障的伺服器達到某個閾值，或者伺服器負載過高時，備用伺服器必需可以及時上線提供服務。
* **SSL 截斷和加速**。依賴伺服器負載，處理加密資料或者通過 SSL 進行的授權請求會消耗 Web 伺服器的大量 CPU，隨著需求增加使用者會明顯感覺到回應時間變長。為了消除 Web 伺服器上這部分（處理加密）負載，負載平衡器可能會將 SSL 通訊截斷在負載平衡器上。有些硬體負載平衡器上包含有專門用於處理 SSL 的硬體。當負載平衡器截斷 SSL 連接請求，再將使用者請求轉發給後台前將 HTTPS 變為 HTTP。只要負載平衡器不超載，這個特性不會影響使用者體驗。這種方法的負面效應是，由於所有 SSL 都由負載平衡器一台裝置來處理，它會導致負載平衡器成為負載平衡體系的一個瓶頸。如果不使用這個特性，SSL 請求將會分發給各個 Web 伺服器處理。是否採用這一特性，需要分析比較兩者的資金投入情況，含有處理 SSL 特殊硬體的負載平衡器通常價格高昂，而 Web 伺服器一般比較廉價。增加少量的 Web 伺服器的花費可能明顯比升級負載平衡器要少。另外，一些伺服器廠商如 Oracle/Sun 也開始在它們的 CPU 中加入加密加速模組，例如 T2000。在負載平衡器上截斷 SSL 的另一個優點是允許負載平衡器可以對基於 HTTPS 請求資料進行負載平衡或內容交換。
* **DDOS 攻擊防護**。負載平衡器可以提供例如 SYN cookies 特性和延時繫結（在 TCP 握手完成之前，後台伺服器不會與使用者通訊）來減緩 SYN flood 攻擊，並且通常將工作從伺服器分載到更有效的平台。
* HTTP 壓縮。使用 gzip 和 Deflate 等演算法壓縮 HTTP 資料，以減少網路上的資料傳輸量。對於回應時間較長，傳輸距離較遠的使用者，這一特性對於縮短回應時間效果明顯。這個特性會耗費負載平衡器更多的 CPU，這一功能也可以由 Web 伺服器來完成。
* **TCP offload**。不同的廠商叫法可能不一樣。其主要思想是一樣的，通常每個使用者的每個請求都會使用一個不同的 TCP 連接，這個特性利用 HTTP/1.1 將來自多個使用者的多個請求合併為單個 TCP socket 再轉發給後台伺服器。
* **TCP 緩衝**。負載平衡器可以暫存後台伺服器對客戶的回應資料，再將它們轉發給那些回應時間較長網速較慢的客戶，如此後台 Web 伺服器就可以釋放相應的執行緒去處理其它任務如直接整個回應資料直接傳送給網速較快的使用者。
* **後台伺服器直接回應使用者**（Direct Server Return）。這是不對稱負載分布的一項功能，在不對稱負載分布中請求和回應通過不同的網路路徑。
* **（伺服器）健康檢查**。負載平衡器可以檢查後台伺服器應用層的健康狀況並從伺服器池中移除那些出現故障的伺服器。
* **HTTP 快取**。負載平衡器可以儲存靜態內容，當使用者請求它們時可以直接回應使用者而不必再向後台伺服器請求。
* **內容過濾**。有些負載平衡器可以按要求修改通過它的資料。
* **HTTP 安全**。有些負載平衡器可以隱藏 HTTP 出錯頁面，刪除 HTTP 回應頭中的伺服器標示資訊，加密 cookies 以防止使用者修改。
* **優先佇列**。也可稱之為流量控制。它可以對不同的內容設定不同的優先級。
* **內容感知開關**（Content-aware switching）。大多數負載平衡器可以基於使用者請求的 URL 傳送請求到不同的後台伺服器，無論內容是加密（HTTPS）還是沒有加密（HTTP）。
* **使用者授權**。對來自不同身分驗證源的使用者進行驗證，然後再允許他們存取一個網站。
* **可程式化的流量控制**。不只一種負載平衡器允許使用指令碼編程來客製化負載平衡方法、任意的流量控制以及其它功能。
* **防火牆功能**。由於安全的原因，不允許使用者直接存取後台伺服器。防火牆是由一系列規則構成，它們決定著哪些請求可以通過一個介面而哪些不被允許。
* **入侵阻止功能**。在防火牆保障網路層 / 傳輸層安全的基礎上，提供應用層安全防範。

## 在電信行業的應用

負載平衡對通訊鏈路的冗餘是非常有用的。例如，一家公司可能有多條網際網路接入線路以保證某一條故障時仍可以正常接入網際網路。

故障轉移的架構意味著一條連接正常使用，另外一條連接作為備用，當第一條出現故障時才會被啟用。

使用負載平衡器，兩條（多條）連接可以都投入使用。有一個裝置或者程式即時監視著所有連接的連通性，並且對正在傳送的包進行選路。同時使用多條連接可以增加頻寬。

許多電信公司在其內部網路或連接到外部網路（其它電信網路）都有多條線路可以使用。為避免某條鏈路出現網路堵塞，最小化連接其它網路的費用或者提高網路的可靠性，它們使用負載平衡將流量從一條鏈路轉移到另一條鏈路。IEEE 802.1aq - Shortest Path Bridging

　
: 更多資訊請檢視路由

負載平衡的另一個用途是監視網路活動。負載平衡器能用於將巨大的網路流量分割為幾個子流並使用網路剖析器，每個都讀取原始資料的一部分。這對於監視 10GbE, STM64 高速網路非常有用，在這些網路上由於資料量太大進行複雜的資料處理幾乎是不可能的。

在電子郵件伺服器的應用
Anti-spam Gateway 或 Anti-spam 伺服器端軟體
與備援關係
系統紀錄檔案的掃描 (log scan)

## 與故障轉移的關係

負載平衡經常被用於實現故障轉移 - 當一個或多個組件出現故障時能持續提供服務這些組件都在持續監視（例如：Web 伺服器通過請求一個已知頁面來監視是否正常工作）中，當一個組件沒有回應，負載平衡器就會發現並不再向其傳送資料。同樣當一個組件重新上線，負載平衡器會重新開始向其傳送資料。為了能夠如前所述正常工作，負載平衡體系中至少要有一個冗餘服務。採用一用一備方案（一個組件提供服務，一個備用，當主組件故障時備用組件將接管繼續提供服務）比故障轉移方案更加經濟，靈活。有些類型的 RAID 系統使用的熱備份功能跟這是類似的作用。

## 參考文獻