負載平衡(Load balancing)是一種計算機技術,用來在多個計算機(計算機集羣)、網絡鏈接、CPU、磁盤驅動器或其餘資源中分配負載,以達到最優化資源使用、最大化吞吐率、最小化響應時間、同時避免過載的目的。 使用帶有負載平衡的多個服務器組件,取代單一的組件,能夠經過冗餘提升可靠性。負載平衡服務一般是由專用軟件和硬件來完成。 主要做用是將大量做業合理地分攤到多個操做單元上進行執行,用於解決互聯網架構中的高併發和高可用的問題。前端
負載均衡最重要的一個應用是利用多臺服務器提供單一服務,這種方案有時也被稱爲服務器農場。一般,負載平衡主要應用於Web網站,大型的Internet Relay Chat網絡,高流量的文件下載網站,NNTP(Network News Transfer Protocol)服務和DNS服務。如今負載平衡器也開始支持數據庫服務,稱之爲數據庫負載平衡器。nginx
對於互聯網服務,負載平衡器一般是一個軟件程序,這個程序偵聽一個外部端口,互聯網用戶能夠經過這個端口來訪問服務,而做爲負載平衡器的軟件會將用戶的請求轉發給後臺內網服務器,內網服務器將請求的響應返回給負載平衡器,負載平衡器再將響應發送到用戶,這樣就向互聯網用戶隱藏了內網結構,阻止了用戶直接訪問後臺(內網)服務器,使得服務器更加安全,能夠阻止對核心網絡棧和運行在其它端口服務的攻擊。算法
當全部後臺服務器出現故障時,有些負載平衡器會提供一些特殊的功能來處理這種狀況。例如轉發請求到一個備用的負載平衡器、顯示一條關於服務中斷的消息等。負載平衡器使得IT團隊能夠顯著提升容錯能力。它能夠自動提供大量的容量以處理任何應用程序流量的增長或減小。數據庫
DNS輪循(或DNS的循環機制),是指一種負載分發,負載均衡或者容錯性地提供多個冗餘的IP服務主機的技術。編程
當前,負載均衡器有各類各樣的工做調度算法(用於決定將前端用戶請求發送到哪個後臺服務器),最簡單的是隨機選擇和輪循。更爲高級的負載均衡器會考慮其它更多的相關因素,如後臺服務器的負載,響應時間,運行狀態,活動鏈接數,地理位置,處理能力,或最近分配的流量。後端
高性能系統一般會使用多層負載均衡。另外專用的硬件負載均衡器以及純軟件負載均衡器,包括開源的,例如Apache Web服務器的mod proxy balancer擴展,nginx,Varnish和Pound反向代理和負載均衡器。使用Gearman將合適的計算任務分發給多臺計算機,如此大量的任務就能夠更快的完成了。瀏覽器
對於一個多層次架構體系,在負載均衡器或網絡分發器後面有兩種設計,術語稱之爲Bowties和Stovepipes。Stovepipe設計中,事務是從頂部分發的,而後從一個固定通道經過一系列硬件和軟件設備,到達最終目的地。若是使用Bowties設計,在每一層中事務處理有多條路徑可供選擇。在事務處理的網絡結構中可能會是Stovepipes,也能夠是Bowties,或者根據每一層的實際需求採用雜貨構架。緩存
負載均衡器須要處理的一個重要問題是:如何保存用戶會話?若是會話信息保存在後臺服務器,用戶接下來的請求可能會被分配到不一樣的後臺服務器,此時用戶會話就沒法繼續。負載均衡器能夠緩存用戶會話,而後將用戶請求分發到不一樣的後臺服務器。可是這將帶來負載均衡器的負載問題。安全
一個解決方案是將一個用戶會話中的全部請求都發送到同一個後臺服務器。即persistence或stickiness。這個方法的不足之處在於沒法容錯(故障轉移),若是後臺服務器故障,它提供的會話就會沒法獲取,任何依賴於它的會話都會丟失。這個問題一般與數據中心有關,儘管Web Service是非連接導向的,可是後端的資料庫先天上仍是連接導向的。服務器
第二個方案是依據用戶名,客戶端IP來分配提供服務的服務器,也能夠隨機分配。由於客戶多是經過DHCP,NAT或者Web代理來鏈接Internet的,其IP地址可能常常變換,這使得這個方案的服務質量沒法保障。隨機分配由負載均衡器將會話信息存儲保存。若是負載均衡器被替換或故障,這些信息可能會丟失;另外(負載均衡器)負載較高的時候,爲保證分配表空間不會被耗盡,超時的分配信息必須被刪除。隨機分配方法也要求客戶會維持會話狀態,若是客戶瀏覽器禁用了cookies的功能,就會引發問題。優秀的負載均衡器會使用多種持續(會話保持)技術,以免其中某些不能夠用時引發故障。
另一個方案是將每一會話信息保存到一個數據庫中。因爲這個方案會增長數據庫的負載,因此這個方案對性能的提升並很差。數據庫最好是用來存儲會話時間比較長的會話數據。爲了不數據庫出現單點故障,而且提升其擴展性,數據庫一般會複製到多臺服務器上,經過負載均衡器來分發請求到數據庫服務器上。微軟ASP.net中的狀態服務器技術就是一個典型的會話數據庫的例子。集羣中的全部服務器都將它們的會話信息保存到狀態服務器上,同時它們能夠向狀態服務器查詢會話數據。
幸運的是有一種更有效的方法,一般客戶瀏覽器能夠保存用戶的每一個會話信息。例如使用瀏覽器cookie,對數據加密並加上一個時間戳就能夠保證安全了;URL重寫。將會話信息存儲在客戶端一般是首選方案,由於這樣負載均衡器就能夠靈活的選擇後臺服務器來處理用戶請求。然而這種方法不適應於一些較複雜的電子商務,由於電子商務中會話數據較大,並且須要服務器須要常常從新處理會話信息;與此同時URL重寫因爲用戶能夠改變會話流數據而存在安全問題;加密客戶端cookies也一直存在着安全方面的爭議,除非全部的會話都經過HTTPS,可是HTTP很容易遭到中間人攻擊。
不管是軟件負載均衡器,仍是硬件負載均衡器都有一系列的特性:
不對稱負載調節。能夠對後臺服務器設置權重因子,權重因子用於控制服務器的請求處理量,進而控制服務器的負載。當後臺服務器的處理能力不是等同的時候,這是一種控制服務器負載的簡單方法。 優先引導。當出現故障的服務器達到某個閾值,或者服務器負載太高時,備用服務器必需能夠及時上線提供服務。 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壓縮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系統使用的熱備份功能跟這是相似的做用。