負載平衡

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

含有2台伺服器、N台使用者終端機的一個負載平衡電腦叢集

基於互聯網的服務

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

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

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

DNS輪循

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

Scheduling演算法

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

架構

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

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


持續性

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

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

為了避免資料庫出現單點故障,並且提高其擴充性,資料庫通常會複製到多台伺服器上,通過負載平衡器來分發請求到資料庫伺服器上。微軟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壓縮。使用gzipDeflate等演算法壓縮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系統使用的熱備份功能跟這是類似的作用。

參考文獻

  1. ^ Load Balancing for Disaster Recovery. Dell.com. [2007-11-12]. (原始內容存檔於2012-12-19). 
  2. ^ Django 缓存框架. (原始內容存檔於2021-05-04).