現(xiàn)在我們知道,負載均衡就是一種計算機網(wǎng)絡(luò)技術(shù),用來在多個計算機(計算機集群)、網(wǎng)絡(luò)連接、CPU、磁碟驅(qū)動器或其他資源中分配負載,以達到最佳化資源使用、最大化吞吐率、最小化響應(yīng)時間、同時避免過載的目的。那么,這種計算機技術(shù)的實現(xiàn)方式有多種。大致可以分為以下幾種,其中最常用的是四層和七層負載均衡:
二層負載均衡
負載均衡服務(wù)器對外依然提供一個VIP(虛IP),集群中不同的機器采用相同IP地址,但是機器的MAC地址不一樣。當負載均衡服務(wù)器接受到請求之后,通過改寫報文的目標MAC地址的方式將請求轉(zhuǎn)發(fā)到目標機器實現(xiàn)負載均衡。
三層負載均衡
和二層負載均衡類似,負載均衡服務(wù)器對外依然提供一個VIP(虛IP),但是集群中不同的機器采用不同的IP地址。當負載均衡服務(wù)器接受到請求之后,根據(jù)不同的負載均衡算法,通過IP將請求轉(zhuǎn)發(fā)至不同的真實服務(wù)器。
四層負載均衡
四層負載均衡工作在OSI模型的傳輸層,由于在傳輸層,只有TCP/UDP協(xié)議,這兩種協(xié)議中除了包含源IP、目標IP以外,還包含源端口號及目的端口號。四層負載均衡服務(wù)器在接受到客戶端請求后,以后通過修改數(shù)據(jù)包的地址信息(IP 端口號)將流量轉(zhuǎn)發(fā)到應(yīng)用服務(wù)器。
七層負載均衡
七層負載均衡工作在OSI模型的應(yīng)用層,應(yīng)用層協(xié)議較多,常用http、radius、dns等。七層負載就可以基于這些協(xié)議來負載。這些應(yīng)用層協(xié)議中會包含很多有意義的內(nèi)容。比如同一個Web服務(wù)器的負載均衡,除了根據(jù)IP加端口進行負載外,還可根據(jù)七層的URL、瀏覽器類別、語言來決定是否要進行負載均衡。
對于一般的應(yīng)用來說,有了Nginx就夠了。Nginx可以用于七層負載均衡。但是對于一些大的網(wǎng)站,一般會采用DNS 四層負載 七層負載的方式進行多層次負載均衡。
所謂四層即運輸層,就是基于 IP 端口的負載均衡;
七層即應(yīng)用層,就是基于 URL 等應(yīng)用層信息的負載均衡;
同理,還有基于 MAC 地址的二層負載均衡和基于 IP 地址的三層負載均衡。
換句換說,
二層負載均衡會通過一個虛擬 MAC 地址接收請求,然后再分配到真實的 MAC 地址;
三層負載均衡會通過一個虛擬 IP 地址接收請求,然后再分配到真實的 IP 地址;
四層通過虛擬 IP 端口接收請求,然后再分配到真實的服務(wù)器;
七層通過虛擬的 URL 或主機名接收請求,然后再分配到真實的服務(wù)器。
所謂的四到七層負載均衡,就是在對后臺的服務(wù)器進行負載均衡時,依據(jù)四層的信息或七層的信息來決定怎么樣轉(zhuǎn)發(fā)流量。
比如四層的負載均衡,就是通過發(fā)布三層的 IP 地址(VIP),然后加四層的端口號,來決定哪些流量需要做負載均衡,
對需要處理的流量進行 NAT 處理,轉(zhuǎn)發(fā)至后臺服務(wù)器,并記錄下這個 TCP 或者 UDP 的流量是由哪臺服務(wù)器處理的,
后續(xù)這個連接的所有流量都同樣轉(zhuǎn)發(fā)到同一臺服務(wù)器處理。
七層的負載均衡,就是在四層的基礎(chǔ)上(沒有四層是絕對不可能有七層的),再考慮應(yīng)用層的特征, 比如同一個 Web 服務(wù)器的負載均衡,除了根據(jù) VIP 加 80 端口辨別是否需要處理的流量, 還可根據(jù)七層的 URL、瀏覽器類別、語言來決定是否要進行負載均衡。
舉個例子,如果你的 Web 服務(wù)器分成兩組,一組是中文語言的,一組是英文語言的,
那么七層負載均衡就可以當用戶來訪問你的域名時,自動辨別用戶語言,然后選擇對應(yīng)的語言服務(wù)器組進行負載均衡處理。
負載均衡器通常稱為四層交換機或七層交換機。
四層交換機主要分析 IP 層及 TCP/UDP 層,實現(xiàn)四層流量負載均衡。
七層交換機除了支持四層負載均衡以外,還有分析應(yīng)用層的信息,如 HTTP 協(xié)議 URI 或 Cookie 信息。
負載均衡分為 L4 Switch(四層交換),即在 OSI 第 4 層工作,就是 TCP 層啦。
此種 Load Balancer 不理解應(yīng)用協(xié)議(如 HTTP/FTP/MySQL 等等)。例子:LVS,F(xiàn)5。
另一種叫做 L7 Switch(七層交換),OSI 的最高層,應(yīng)用層。
此時,該 Load Balancer 能理解應(yīng)用協(xié)議。例子: HAProxy,MySQL Proxy。
注意:上面的很多 Load Balancer 既可以做四層交換,也可以做七層交換。
當前可以看到對于 F5, Array 等硬件負載均衡設(shè)備本身也是支持 7 層負載均衡的,
同時在 4 層負載均衡的時候我們還可以設(shè)置是否進行會話保持等高級特性。
要明白 4 層負載均衡本質(zhì)是轉(zhuǎn)發(fā),而 7 層負載本質(zhì)是內(nèi)容交換和代理,具體說明如下:
所謂四層負載均衡,也就是主要通過報文中的目標地址和端口,再加上負載均衡設(shè)備設(shè)置的服務(wù)器選擇方式,決定最終選擇的內(nèi)部服務(wù)器。
以常見的 TCP 為例,負載均衡設(shè)備在接收到第一個來自客戶端的 SYN 請求時,即通過上述方式選擇一個最佳的服務(wù)器, 并對報文中的目標 IP 地址進行修改(改為后端服務(wù)器 IP),直接轉(zhuǎn)發(fā)給該服務(wù)器。 TCP 的連接建立,即三次握手是客戶端和服務(wù)器直接建立的,負載均衡設(shè)備只是起到一個類似路由器的轉(zhuǎn)發(fā)動作。
在某些部署情況下,為保證服務(wù)器回包可以正確返回給負載均衡設(shè)備,在轉(zhuǎn)發(fā)報文的同時可能還會對報文原來的源地址進行修改。
所謂七層負載均衡,也稱為“內(nèi)容交換”,也就是主要通過報文中的真正有意義的應(yīng)用層內(nèi)容,
再加上負載均衡設(shè)備設(shè)置的服務(wù)器選擇方式,決定最終選擇的內(nèi)部服務(wù)器。
以常見的 TCP 為例,負載均衡設(shè)備如果要根據(jù)真正的應(yīng)用層內(nèi)容再選擇服務(wù)器,
只能先代理最終的服務(wù)器和客戶端建立連接(TCP 三次握手)后,才可能接收到客戶端發(fā)送的真正應(yīng)用層內(nèi)容的報文, 然后再根據(jù)該報文中的特定字段,再加上負載均衡設(shè)備設(shè)置的服務(wù)器選擇方式,決定最終選擇的內(nèi)部服務(wù)器。
負載均衡設(shè)備在這種情況下,更類似于一個代理服務(wù)器。負載均衡和前端的客戶端以及后端的服務(wù)器會分別建立 TCP 連接。
所以從這個技術(shù)原理上來看,七層負載均衡明顯地對負載均衡設(shè)備的要求更高,處理七層的能力也必然會低于四層模式的部署方式。
七層應(yīng)用負載均衡的好處,是使得整個網(wǎng)絡(luò)更“智能化”, 例如訪問一個網(wǎng)站的用戶流量,可以通過七層的方式,
將對圖片類的請求轉(zhuǎn)發(fā)到特定的圖片服務(wù)器并可以使用緩存技術(shù);將對文字類的請求可以轉(zhuǎn)發(fā)到特定的文字服務(wù)器并可以使用壓縮技術(shù)。
當然這只是七層應(yīng)用的一個小案例,從技術(shù)原理上,這種方式可以對客戶端的請求和服務(wù)器的響應(yīng)進行任意意義上的修改,極大的提升了應(yīng)用系統(tǒng)在網(wǎng)絡(luò)層的靈活性。 很多在后臺(例如 Nginx 或者 Apache )上部署的功能可以前移到負載均衡設(shè)備上,例如客戶請求中的 Header 重寫,服務(wù)器響應(yīng)中的關(guān)鍵字過濾或者內(nèi)容插入等功能。
另外一個常常被提到功能就是安全性。網(wǎng)絡(luò)中最常見的 SYN Flood 攻擊,即黑客控制眾多源客戶端,使用虛假 IP 地址對同一目標發(fā)送 SYN 攻擊,
通常這種攻擊會大量發(fā)送 SYN 報文,耗盡服務(wù)器上的相關(guān)資源,以達到 Denial of Service(DoS) 的目的。
從技術(shù)原理上也可以看出,四層模式下這些 SYN 攻擊都會被轉(zhuǎn)發(fā)到后端的服務(wù)器上;
而七層模式下這些 SYN 攻擊自然在負載均衡設(shè)備上就截止,不會影響后臺服務(wù)器的正常運營。
另外負載均衡設(shè)備可以在七層層面設(shè)定多種策略,過濾特定報文,例如 SQL Injection 等應(yīng)用層面的特定攻擊手段,從應(yīng)用層面進一步提高系統(tǒng)整體安全。
現(xiàn)在的 7 層負載均衡,主要還是著重于應(yīng)用廣泛的 HTTP 協(xié)議,所以其應(yīng)用范圍主要是眾多的網(wǎng)站或者內(nèi)部信息平臺等基于 B/S 開發(fā)的系統(tǒng)。
4 層負載均衡則對應(yīng)其他 TCP 應(yīng)用,例如基于 C/S 開發(fā)的 ERP 等系統(tǒng)。
是否真的必要,七層應(yīng)用的確可以提高流量智能化,同時必不可免的帶來設(shè)備配置復(fù)雜,負載均衡壓力增高以及故障排查上的復(fù)雜性等問題。
在設(shè)計系統(tǒng)時需要考慮四層七層同時應(yīng)用的混雜情況。
是否真的可以提高安全性。例如 SYN Flood 攻擊,七層模式的確將這些流量從服務(wù)器屏蔽,但負載均衡設(shè)備本身要有強大的抗 DDoS 能力,
否則即使服務(wù)器正常而作為中樞調(diào)度的負載均衡設(shè)備故障也會導(dǎo)致整個應(yīng)用的崩潰。
是否有足夠的靈活度。七層應(yīng)用的優(yōu)勢是可以讓整個應(yīng)用的流量智能化,但是負載均衡設(shè)備需要提供完善的七層功能,滿足客戶根據(jù)不同情況的基于應(yīng)用的調(diào)度。
最簡單的一個考核就是能否取代后臺 Nginx 或者 Apache 等服務(wù)器上的調(diào)度功能。
能夠提供一個七層應(yīng)用開發(fā)接口的負載均衡設(shè)備,可以讓客戶根據(jù)需求任意設(shè)定功能,才真正有可能提供強大的靈活性和智能性。
Nginx/LVS/HAProxy是目前使用最廣泛的三種負載均衡軟件。
LVS(Linux Virtual Server),也就是Linux虛擬服務(wù)器, 是一個由章文嵩博士發(fā)起的自由軟件項目。使用LVS技術(shù)要達到的目標是:通過LVS提供的負載均衡技術(shù)和Linux操作系統(tǒng)實現(xiàn)一個高性能、高可用的服務(wù)器群集,它具有良好可靠性、可擴展性和可操作性。從而以低廉的成本實現(xiàn)最優(yōu)的服務(wù)性能。
LVS主要用來做四層負載均衡。
Nginx(發(fā)音同engine x)是一個網(wǎng)頁服務(wù)器,它能反向代理HTTP, HTTPS, SMTP, POP3, IMAP的協(xié)議鏈接,以及一個負載均衡器和一個HTTP緩存。
Nginx主要用來做七層負載均衡。
HAProxy是一個使用C語言編寫的自由及開放源代碼軟件,其提供高可用性、負載均衡,以及基于TCP和HTTP的應(yīng)用程序代理。
Haproxy主要用來做七層負載均衡。
上面介紹負載均衡技術(shù)的時候提到過,負載均衡服務(wù)器在決定將請求轉(zhuǎn)發(fā)到具體哪臺真實服務(wù)器的時候,是通過負載均衡算法來實現(xiàn)的。負載均衡算法可以分為兩類:靜態(tài)負載均衡算法和動態(tài)負載均衡算法。
靜態(tài)負載均衡算法包括:輪詢,比率,優(yōu)先權(quán)
動態(tài)負載均衡算法包括: 最少連接數(shù),最快響應(yīng)速度,觀察方法,預(yù)測法,動態(tài)性能分配,動態(tài)服務(wù)器補充,服務(wù)質(zhì)量,服務(wù)類型,規(guī)則模式。
輪詢(Round Robin):順序循環(huán)將請求一次順序循環(huán)地連接每個服務(wù)器。當其中某個服務(wù)器發(fā)生第二到第7 層的故障,BIG-IP 就把其從順序循環(huán)隊列中拿出,不參加下一次的輪詢,直到其恢復(fù)正常。
比率(Ratio):給每個服務(wù)器分配一個加權(quán)值為比例,根椐這個比例,把用戶的請求分配到每個服務(wù)器。當其中某個服務(wù)器發(fā)生第二到第7 層的故障,BIG-IP 就把其從服務(wù)器隊列中拿出,不參加下一次的用戶請求的分配, 直到其恢復(fù)正常。
優(yōu)先權(quán)(Priority):給所有服務(wù)器分組,給每個組定義優(yōu)先權(quán),BIG-IP 用戶的請求,分配給優(yōu)先級最高的服務(wù)器組(在同一組內(nèi),采用輪詢或比率算法,分配用戶的請求);當最高優(yōu)先級中所有服務(wù)器出現(xiàn)故障,BIG-IP 才將請求送給次優(yōu)先級的服務(wù)器組。這種方式,實際為用戶提供一種熱備份的方式。
最少的連接方式(Least Connection):傳遞新的連接給那些進行最少連接處理的服務(wù)器。當其中某個服務(wù)器發(fā)生第二到第7 層的故障,BIG-IP 就把其從服務(wù)器隊列中拿出,不參加下一次的用戶請求的分配, 直到其恢復(fù)正常。
最快模式(Fastest):傳遞連接給那些響應(yīng)最快的服務(wù)器。當其中某個服務(wù)器發(fā)生第二到第7 層的故障,BIG-IP 就把其從服務(wù)器隊列中拿出,不參加下一次的用戶請求的分配,直到其恢復(fù)正常。
觀察模式(Observed):連接數(shù)目和響應(yīng)時間以這兩項的最佳平衡為依據(jù)為新的請求選擇服務(wù)器。當其中某個服務(wù)器發(fā)生第二到第7 層的故障,BIG-IP就把其從服務(wù)器隊列中拿出,不參加下一次的用戶請求的分配,直到其恢復(fù)正常。
預(yù)測模式(Predictive):BIG-IP利用收集到的服務(wù)器當前的性能指標,進行預(yù)測分析,選擇一臺服務(wù)器在下一個時間片內(nèi),其性能將達到最佳的服務(wù)器相應(yīng)用戶的請求。(被BIG-IP 進行檢測)
動態(tài)性能分配(Dynamic Ratio-APM):BIG-IP 收集到的應(yīng)用程序和應(yīng)用服務(wù)器的各項性能參數(shù),動態(tài)調(diào)整流量分配。
動態(tài)服務(wù)器補充(Dynamic Server Act.):當主服務(wù)器群中因故障導(dǎo)致數(shù)量減少時,動態(tài)地將備份服務(wù)器補充至主服務(wù)器群。
服務(wù)質(zhì)量(QoS):按不同的優(yōu)先級對數(shù)據(jù)流進行分配。
服務(wù)類型(ToS): 按不同的服務(wù)類型(在Type of Field中標識)負載均衡對數(shù)據(jù)流進行分配。
規(guī)則模式:針對不同的數(shù)據(jù)流設(shè)置導(dǎo)向規(guī)則,用戶可自行。
文章參考鏈接:hollischuang.com/archives/1844;jaminzhang.github.io/lb/L4-L7-Load-Balancer-Difference/
聯(lián)系客服