負載均衡(Load Balance)是集羣技術(Cluster)的一種應用。負載均衡能夠將工做任務分攤到多個處理單元,從而提升併發處理能力。目前最多見的負載均衡應用是Web負載均衡。根據實現的原理不一樣,常見的web負載均衡技術包括:DNS輪詢、IP負載均衡和CDN。其中IP負載均衡可使用硬件設備或軟件方式來實現。html
服務器集羣(Cluster)使得多個服務器節點可以協同工做,根據目的的不一樣,服務器集羣能夠分爲:mysql
高性能集羣:將單個重負載的請求分散到多個節點進行處理,最後再將處理結果進行彙總linux
高可用集羣:提升冗餘單元,避免單點故障nginx
負載均衡集羣:將大量的併發請求分擔到多個處理節點。因爲單個處理節點的故障不影響整個服務,負載均衡集羣同時也實現了高可用性。git
通常提到的負載均衡(Load Balance),是指實現負載均衡集羣。負載均衡實現了橫向擴展(Scale Out),避免縱向的升級(Scale Up)換代。github
本文中的web負載均衡,特指可以分擔web請求(http,https等)的負載均衡技術。web
任何的負載均衡技術都要想辦法創建某種一對多的映射機制:一個請求的入口映射到多個處理請求的節點,從而實現分而治之(Divide and Conquer)。算法
這種映射機制使得多個物理存在對外體現爲一個虛擬的總體,對服務的請求者屏蔽了內部的結構。sql
採用不一樣的機制創建映射關係,能夠造成不一樣的負載均衡技術,常見的包括:後端
DNS輪詢
CDN
IP負載均衡
DNS輪詢是最簡單的負載均衡方式。以域名做爲訪問入口,經過配置多條DNS A記錄使得請求能夠分配到不一樣的服務器。
DNS輪詢沒有快速的健康檢查機制,並且只支持WRR的調度策略致使負載很難「均衡」,一般用於要求不高的場景。而且DNS輪詢方式直接將服務器的真實地址暴露給用戶,不利於服務器安全。
CDN(Content Delivery Network,內容分發網絡)。經過發佈機制將內容同步到大量的緩存節點,並在DNS服務器上進行擴展,找到裏用戶最近的緩存節點做爲服務提供節點。
由於很難自建大量的緩存節點,因此一般使用CDN運營商的服務。目前國內的服務商不多,並且按流量計費,價格也比較昂貴。
IP負載均衡是基於特定的TCP/IP技術實現的負載均衡。好比NAT、DR、Turning等。是最常用的方式。關於其原理,能夠參考下面另外一篇文章:lvs中的負載均衡方式。
IP負載均衡可使用硬件設備,也可使用軟件實現。硬件設備的主要產品是F5-BIG-IP-GTM(簡稱F5),軟件產品主要有LVS、HAProxy、NginX。其中LVS、HAProxy能夠工做在4-7層,NginX工做在7層。關於三者的簡單對比,能夠參考這裏。
硬件負載均衡設備能夠將核心部分作成芯片,性能和穩定性更好,並且商用產品的可管理性、文檔和服務都比較好。惟一的問題就是價格。
軟件負載均衡一般是開源軟件。自由度較高,但學習成本和管理成本會比較大。
F5的全稱是F5-BIG-IP-GTM,是最流行的硬件負載均衡設備,其併發能力達到百萬級。F5的主要特性包括:
多鏈路的負載均衡和冗餘
能夠接入多條ISP鏈路,在鏈路之間實現負載均衡和高可用。
防火牆負載均衡
F5具備異構防火牆的負載均衡與故障自動排除能力。
服務器負載均衡
這是F5最主要的功能,F5能夠配置針對全部的對外提供服務的服務器配置Virtual Server實現負載均衡、健康檢查、回話保持等。
高可用
F5設備自身的冗餘設計可以保證99.999%的正常運行時間,雙機F5的故障切換時間爲毫秒級。
使用F5能夠配置整個集羣的鏈路冗餘和服務器冗餘,提升可靠的健康檢查機制,以保證高可用。
安全性
與防火牆相似,F5採用缺省拒絕策略,能夠爲任何站點增長額外的安全保護,防護普通網絡***,包括DDoS、IP欺騙、SYN***、teartop和land***、ICMP***等。
易於管理
F5提供HTTPS、SSH、Telnet、SNMP等多種管理方式,包含詳盡的實時報告和歷史紀錄報告。同時還提供二次開發包(i-Control)。
其餘
F5還提供了SSL加速、軟件升級、IP地址過濾、帶寬控制等輔助功能。
LVS(Linux Virtual Server, Linux虛擬服務器),是章文嵩博士開發的開放軟件,目前已經集成到Linux內核中。
基於不一樣的網絡技術,LVS支持多種負載均衡機制。包括:VS/NAT(基於網絡地址轉換技術)、VS/TUN(基於IP隧道技術)和VS/DR(基於直接路由技術)。
此外,爲了適應不一樣的須要,淘寶開發了VS/FULLNAT,從本質上來講也是基於網絡地址轉換技術。最近還有一個基於VS/FULLNAT的DNAT模塊。
無論使用哪一種機制,LVS都不直接處理請求,而是將請求轉發到後面真正的服務器(Real Server)。不一樣的機制,決定了響應包如何返回到客戶端。
NAT(Network Address Translation,網絡地址轉換)也叫作網絡掩蔽或者IP掩蔽,是將IP 數據包頭中的IP 地址轉換爲另外一個IP 地址的過程。
NAT可以將私有(保留)地址轉化爲合法IP地址,一般用於一個公共IP地址和多個內部私有IP地址直接的映射,普遍應用於各類類型Internet接入方式和各類類型的網絡中。
經過使用NAT將目的地址轉換到多個服務器的方式,能夠實現負載均衡,同時可以隱藏並保護內部服務器,避免來自網絡外部的***。商用負載均衡設備如Cisco的LocalDirector、F5的Big/IP和Alteon的ACEDirector都是基於NAT方法。
VS/NAT(Virtual Server via Network Address Translation)是基於NAT技術實現負載均衡的方法。其架構以下圖所示:
客戶經過Virtual IP Address(虛擬服務的IP地址)訪問網絡服務時,請求報文到達調度器
調度器根據鏈接調度算法從一組真實服務器中選出一臺服務器,將報文的目標地址Virtual IP Address改寫成選定服務器的地址,報文的目標端口改寫成選定服務器的相應端口,最後將修改後的報文發送給選出的服務器。
真實的服務器處理請求,並將響應報文發到調度器。
調度器將報文的源地址和源端口改成Virtual IP Address和相應的端口
調度器將修改過的報文發給用戶
在VS/NAT的集羣系統中,請求和響應的數據報文都須要經過負載調度器,當真實服務器的數目在10臺和20臺之間時,負載調度器將成爲整個集羣系統的新瓶頸。大多數Internet服務都有這樣的特色:請求報文較短而響應報文每每包含大量的數據。若是能將請求和響應分開處理,即在負載調度器中只負責調度請求而響應直接返回給客戶,將極大地提升整個集羣系統的吞吐量。好比IP隧道技術。
IP Tunneling(IP隧道)技術,又稱爲IP封裝技術(IP encapsulation),是一種在網絡之間傳遞數據的方式。能夠將一個IP報文封裝到另外一個IP報文(多是不一樣的協議)中,並轉發到另外一個IP地址。IP隧道主要用於移動主機和虛擬私有網絡(Virtual Private Network),在其中隧道都是靜態創建的,隧道一端有一個IP地址,另外一端也有惟一的IP地址。
VS/TUN(Virtual Server via IP Tunneling)是基於隧道技術實現負載均衡的方法。其架構以下圖所示:
VS/TUN與VS/NAT的工做機制大致上相同,區別在於:
調度器轉發報文的時候進行了協議的二次封裝,真實的服務器接收到請求後先進行解包。過程以下圖所示:
響應報文從後端服務器直接返回給客戶,不須要通過調度器。
DR(Direct Routing, 直接路由), 路由器學習路由的方法之一。路由器對於本身的網絡接口所直連的網絡之間的通訊,能夠自動維護路由表,並且不須要進行路由計算。
直接路由一般用在一個三層交換機鏈接幾個VLAN的狀況,只要設置直接路由VLAN之間就能夠通訊,不須要設置其餘的路由方式。
VS/DR(Virtual Server via Direct Routing)是基於直接路由實現負載均衡的方法。其架構以下圖所示:
跟VS/TUN方法相同,VS/DR利用大多數Internet服務的非對稱特色,負載調度器中只負責調度請求,而服務器直接將響應返回給客戶,能夠極大地提升整個集羣系統的吞吐量。
VS/DR要求調度器和服務器組都必須在物理上有一個網卡經過不分段的局域網相連,即經過交換機或者高速的HUB相連,中間沒有隔有路由器。VIP地址爲調度器和服務器組共享,調度器配置的VIP地址是對外可見的,用於接收虛擬服務的請求報文;全部的服務器把VIP地址配置在各自的Non-ARP網絡設備上,它對外面是不可見的,只是用於處理目標地址爲VIP的網絡請求。
VS/DR的整個過程與VS/TUN很是相似,不一樣之處在於調度器不對請求包進行二次封裝,只是將目標MAC地址更改成通過調度算法選出的目標服務器的MAC地址。以下圖:
優勢
對後端服務器的操做系統無要求
只須要一個IP地址配置在調度器上,服務器組能夠用私有的IP地址。
支持端口映射
缺點
請求和響應報文都須要經過調度器,伸縮能力有限(10+)
要求服務器和調度器在同一個VLAN
須要將服務器的默認網關指向調度器
對於那些將IP地址或者端口號在報文數據中傳送的網絡服務,須要編寫相應的應用模塊來轉換報文數據中的IP地址或者端口號
優勢
不須要調度應答報文,性能高
服務器和調度器能夠不在同一個VLAN
支持廣域負載均衡
缺點
全部的服務器必須支持「IP Tunneling」協議,要安裝內核模塊(好比IPIP等),配置複雜
有創建IP隧道的開銷
服務器上直接綁定虛擬IP(Virtaul IP),風險很大
服務器須要聯通外網
不支持端口映射
優勢
與VS/TUN相比,沒有IP隧道的開銷,性能最好
缺點
要求調度器與服務器都有一塊網卡連在同一物理網段(同一個VLAN)上
要求服務器網絡設備(或者設備別名)不做ARP響應,或者能將報文重定向(Redirect)到本地的Socket端口上
服務器上直接綁定虛擬IP(Virtaul IP),風險很大
不支持端口映射
如上節所述,前面三種傳統的負載均衡機制各自存在一些不足。
VS/FULLNAT是爲了解決這些不足而新開發的一種轉發模式。VS/FULLNAT的特色是:
調度器和服務器能夠跨VLAN通訊,不須要配置在同一個網段
請求和應答報文都通過調度器,服務器不須要綁定虛擬IP
VS/FULLNAT這兩個特色能夠簡化網絡拓撲,下降運維成本和風險。
若是人少錢多,不在意性能的損耗願意多買服務器,同時但願最大程度較少運維的工做量,能夠選擇FULLNAT
很大衆的方式是用DR,沒有太多的優勢但也沒有太多的缺點
若是要搞廣域網負載均衡,那就用TUN吧
我的感受NAT不是爲了互聯網用的。小併發的實驗性應用或者用在非web場合,好比mysql集羣等。固然,若是須要端口映射,必須使用NAT方式