LVS 的轉發主要通過修改 IP 地址(NAT 模式,分為源地址修改 SNAT 和目標地址修改 DNAT)、修改目標 MAC(DR 模式)來實現。
那么為什么 LVS 是在第四層做負載均衡?
首先 LVS 不像 HAProxy 等七層軟負載面向的是 HTTP 包,所以七層負載可以做的 URL 解析等工作,LVS 無法完成。其次,某次用戶訪問是與服務端建立連接后交換數據包實現的,如果在第三層網絡層做負載均衡,那么將失去「連接」的語義。軟負載面向的對象應該是 一個已經建立連接的用戶,而不是一個孤零零的 IP 包。后面會看到,實際上 LVS 的機器代替真實的服務器與用戶通過 TCP 三次握手建立了連接,所以 LVS 是需要關心「連接」級別的狀態的。
LVS 的工作模式主要有 4 種:
- DR
- NAT
- TUNNEL
- Full-NAT
1.DR

請求由 LVS 接受,由真實提供服務的服務器(RealServer, RS)直接返回給用戶,返回的時候不經過 LVS。
DR 模式下需要 LVS 和綁定同一個 VIP(RS 通過將 VIP 綁定在 loopback 實現)。
一個請求過來時,LVS 只需要將網絡幀的 MAC 地址修改為某一臺 RS 的 MAC,該包就會被轉發到相應的 RS 處理,注意此時的源 IP 和目標 IP 都沒變,LVS 只是做了一下移花接木。
RS 收到 LVS 轉發來的包,鏈路層發現 MAC 是自己的,到上面的網絡層,發現 IP 也是自己的,于是這個包被合法地接受,RS 感知不到前面有 LVS 的存在。
而當 RS 返回響應時,只要直接向源 IP(即用戶的 IP)返回即可,不再經過 LVS。
DR 模式是性能最好的一種模式。
2.NAT

NAT(Network Address Translation)是一種外網和內網地址映射的技術。
NAT 模式下,網絡報的進出都要經過 LVS 的處理。LVS 需要作為 RS 的網關。
當包到達 LVS 時,LVS 做目標地址轉換(DNAT),將目標 IP 改為 RS 的 IP。RS 接收到包以后,仿佛是客戶端直接發給它的一樣。
RS 處理完,返回響應時,源 IP 是 RS IP,目標 IP 是客戶端的 IP。
這時 RS 的包通過網關(LVS)中轉,LVS 會做源地址轉換(SNAT),將包的源地址改為 VIP,這樣,這個包對客戶端看起來就仿佛是 LVS 直接返回給它的。客戶端無法感知到后端 RS 的存在。
3.Full-NAT
無論是 DR 還是 NAT 模式,不可避免的都有一個問題:LVS 和 RS 必須在同一個 VLAN 下,否則 LVS 無法作為 RS 的網關。這引發的兩個問題是:
1、同一個 VLAN 的限制導致運維不方便,跨 VLAN 的 RS 無法接入。
2、LVS 的水平擴展受到制約。當 RS 水平擴容時,總有一天其上的單點 LVS 會成為瓶頸。
Full-NAT 由此而生,解決的是 LVS 和 RS 跨 VLAN 的問題,而跨 VLAN 問題解決后,LVS 和 RS 不再存在 VLAN 上的從屬關系,可以做到多個 LVS 對應多個 RS,解決水平擴容的問題。
Full-NAT 相比 NAT 的主要改進是,在 SNAT/DNAT 的基礎上,加上另一種轉換,轉換過程如下:

在包從 LVS 轉到 RS 的過程中,源地址從客戶端 IP 被替換成了 LVS 的內網 IP。
內網 IP 之間可以通過多個交換機跨 VLAN 通信。
當 RS 處理完接受到的包,返回時,會將這個包返回給 LVS 的內網 IP,這一步也不受限于 VLAN。
LVS 收到包后,在 NAT 模式修改源地址的基礎上,再把 RS 發來的包中的目標地址從 LVS 內網 IP 改為客戶端的 IP。
Full-NAT 主要的思想是把網關和其下機器的通信,改為了普通的網絡通信,從而解決了跨 VLAN 的問題。采用這種方式,LVS 和 RS 的部署在 VLAN 上將不再有任何限制,大大提高了運維部署的便利性。
服務系統集群LVS(Linux Virtual Server)學習筆記
首先向LVS創始人張文嵩先生致以敬意,感謝您,使我們這些后生才能接觸到此款優秀應用
此文主要對lvs負載均衡學習的總結,一為記錄,二為鞏固,主要介紹lvs的一些基礎知識。
前提:負載均衡(LB Cluster)負載均衡實現方法有兩種:硬件實現和軟件實現;硬件比較常見的有: 1) F5 Big-IP;2)Citrix Netscaler;3)A TEN軟件比較常見的有: 1)LVS(Linux Virtual Server);2)nginx;3)HAProxy;4)ATS(Apache Traffic Server)
一、LVS基礎
1.1 什么是lvs
LVS是Linux Virtual Server的縮寫,顧名思義是一個虛擬的服務器集群系統,項目在1998年5月由張文嵩博士成立,在linux 2.6版本后,LVS被收錄到內核中。
1.2 lvs能拿來干什么
LVS作為一個調度器,能把用戶的大量并發請求負載均衡至后端服務器,使得網站在高并發下還能提供服務,而不至于癱瘓。LVS技術要達到的目標是:通過LVS提供的負載均衡技術和Linux操作系統實現一個高性能、高可用的服務器群集,它具有良好可靠性、可擴展性和可操作性。從而以低廉的成本實現最優的服務性能。 LVS自從1998年開始,發展到現在已經是一個比較成熟的技術項目了。可以利用LVS技術實現高可伸縮的、高可用的網絡服務,例如WWW服務、Cache服務、DNS服務、FTP服務、MAIL服務、視頻/音頻點播服務等等,有許多比較著名網站和組織都在使用LVS架設的集群系統,例如:Linux的門戶網站(www.linux.com)、向RealPlayer提供音頻視頻服務而聞名的Real公司(www.real.com)、全球最大的開源網站(sourceforge.net)等。
1.3 lvs的工作模式
LVS是四層負載均衡,也就是說建立在OSI模型的第四層——傳輸層之上,傳輸層上有我們熟悉的TCP/UDP,LVS支持TCP/UDP的負載均衡。因為LVS是四層負載均衡,因此它相對于其它高層負載均衡的解決辦法,比如DNS域名輪流解析、應用層負載的調度、客戶端的調度等,它的效率是非常高的。
LVS的IP負載均衡技術是通過IPVS模塊來實現的,IPVS是LVS集群系統的核心軟件,它的主要作用是:安裝在Director Server上,同時在Director Server上虛擬出一個IP地址,用戶必須通過這個虛擬的IP地址訪問服務。這個虛擬IP一般稱為LVS的VIP,即Virtual IP。訪問的請求首先經過VIP到達負載調度器,然后由負載調度器從Real Server列表中選取一個服務節點響應用戶的請求。 當用戶的請求到達負載調度器后,調度器如何將請求發送到提供服務的Real Server節點,而Real Server節點如何返回數據給用戶,是IPVS實現的重點技術,IPVS實現負載均衡機制有幾種,分別是NAT、DR、TUN及FULLNAT。
1.3.1 lvs-nat工作模式
? ? ?NAT(Network Address Translation 網絡地址轉換)是一種外網和內外地址映射的技術,內網可以是私有網址,外網可以使用NAT方法修改數據報頭,讓外網與內網能夠互相通信。NAT模式下,網絡數據報的進出都要經過LVS的處理。LVS需要作為RS(真實服務器)的網關。當包到達LVS時,LVS做目標地址轉換(DNAT),將目標IP改為RS的IP。RS接收到包以后,仿佛是客戶端直接發給它的一樣。RS處理完,返回響應時,源IP是RS IP,目標IP是客戶端的IP。這時RS的包通過網關(LVS)中轉,LVS會做源地址轉換(SNAT),將包的源地址改為VIP,這樣,這個包對客戶端看起來就仿佛是LVS直接返回給它的。客戶端無法感知到后端RS的存在。
(1)RIP和DIP必須在同一個IP網絡,且應該使用私網地址;RS的網關要指向DIP;
(2)請求報文和響應報文都必須經由Director轉發;Director易于成為系統瓶頸;
(3)支持端口映射,可修改請求報文的目標PORT;
(4)vs必須是Linux系統,rs可以是任意系統;
缺點:在整個過程中,所有輸入輸出的流量都要經過LVS 調度服務器。顯然,LVS 調度服務器的網絡I/O壓力將會非常大,因此很容易成為瓶頸,特別是對于請求流量很小,而響應流量很大的Web類應用來說尤為如此。
優點:?NAT模式的優點在于配置及管理簡單,由于了使用NAT技術,LVS 調度器及應用服務器可以在不同網段中,網絡架構更靈活,應用服務器只需要進行簡單的網絡設定即可加入集群。
1.3.2 lvs-dr工作模式(最為常用)
DR(Direct Routing 直接路由模式)此模式時LVS 調度器只接收客戶發來的請求并將請求轉發給后端服務器,后端服務器處理請求后直接把內容直接響應給客戶,而不用再次經過LVS調度器。LVS只需要將網絡幀的MAC地址修改為某一臺后端服務器RS的MAC,該包就會被轉發到相應的RS處理,注意此時的源IP和目標IP都沒變。RS收到LVS轉發來的包時,鏈路層發現MAC是自己的,到上面的網絡層,發現IP也是自己的,于是這個包被合法地接受,RS感知不到前面有LVS的存在。而當RS返回響應時,只要直接向源IP(即用戶的IP)返回即可,不再經過LVS。
注意:(1) 確保前端路由器將目標IP為VIP的請求報文發往Director:(a) 在前端網關做靜態綁定;(b) 在RS上使用arptables;(c) 在RS上修改內核參數以限制arp通告及應答級別;arp_announcearp_ignore(2) RS的RIP可以使用私網地址,也可以是公網地址;RIP與DIP在同一IP網絡;RIP的網關不能指向DIP,以確保響應報文不會經由Director;(3) RS跟Director要在同一個物理網絡;(4) 請求報文要經由Director,但響應不能經由Director,而是由RS直接發往Client;(5) 此模式不支持端口映射;
缺點:唯一的缺陷在于它要求LVS 調度器及所有應用服務器在同一個網段中,因此不能實現集群的跨網段應用。
優點:可見在處理過程中LVS Route只處理請求的直接路由轉發,所有響應結果由各個應用服務器自行處理,并對用戶進行回復,網絡流量將集中在LVS調度器之上。
1.3.3 lvs-tun 工作模式
TUN(virtual server via ip tunneling IP 隧道)調度器把請求的報文通過IP隧道轉發到真實的服務器。真實的服務器將響應處理后的數據直接返回給客戶端。這樣調度器就只處理請求入站報文。此轉發方式不修改請求報文的IP首部(源IP為CIP,目標IP為VIP),而在原IP報文之外再封裝一個IP首部(源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS;RS直接響應給客戶端(源IP是VIP,目標IP是CIP),由于一般網絡服務應答數據比請求報文大很多,采用lvs-tun模式后,集群系統的最大吞吐量可以提高10倍
注意:(1) DIP, VIP, RIP都應該是公網地址;(2) RS的網關不能,也不可能指向DIP;(3) 請求報文要經由Director,但響應不能經由Director;(4) 此模式不支持端口映射;(5) RS的操作系統得支持隧道功能
缺點:由于后端服務器RS處理數據后響應發送給用戶,此時需要租借大量IP(特別是后端服務器使用較多的情況下)。
優點:實現lvs-tun模式時,LVS 調度器將TCP/IP請求進行重新封裝并轉發給后端服務器,由目標應用服務器直接回復用戶。應用服務器之間是通過IP 隧道來進行轉發,故兩者可以存在于不同的網段中。
1.3.4 lvs-fullnat模式(此類型默認不支持)
此模式類似DNAT,它通過同時修改請求報文的源IP地址和目標IP地址進行轉發
注意:(1) VIP是公網地址,RIP和DIP是私網地址,且通常不在同一IP網絡;因此,RIP的網關一般不會指向DIP;(2) RS收到的請求報文源地址是DIP,因此,只需響應給DIP;但Director還要將其發往Client;(3) 請求和響應報文都經由Director;(4) 支持端口映射;
1.4 LVS 的調度算法
根據其調度時是否考慮各RS當前的負載狀態,可分為靜態方法和動態方法兩種。
靜態方法: 僅根據算法本身進行調度;RR:roundrobin,輪詢調度,即簡單在各主機間輪流調度;WRR:Weighted RR,加權輪詢調度,根據各主機的權重進行輪詢;SH:Source Hashing,實現session sticy,源IP地址hash;將來自于同一個IP地址的請求始終發往第一次挑中的RS,從而實現會話綁定;DH:Destination Hashing;目標地址哈希,將發往同一個目標地址的請求始終轉發至第一次挑中的RS,典型使用場景是正向代理緩存場景中的負載均衡;動態方法:主要根據每RS當前的負載狀態及調度算法進行調度;Overhead=LC:least connections最小連接調度,;lvs根據Overhead=activeconns*256+inactiveconns計算服務器的負載狀態,每次選擇overhead最小的服務器WLC:Weighted LC 加權最小連接調度;lvs根據Overhead=(activeconns*256+inactiveconns)/weight來計算服務器負載,每次選擇overhead最小的服務器,它是lvs的默認調度算法;SED:Shortest Expection Delay最短期望延遲,它不對 inactive 狀態的連接進行計算,根據Overhead=(activeconns+1)*256/weight計算服務器負載,選擇 overhead 最小的服務器進行調度NQ:Never Queue當有空閑服務器時,直接調度至空閑服務器,當沒有空閑服務器時,使用 SED 算法進行調度LBLC:Locality-Based LC,動態的DH算法,基于局部性最少連接,相當于 dh + wlc,正常請求下使用 dh 算法進行調度,如果服務器超載,則使用 wlc 算法調度至其他服務器;LBLCR:LBLC with Replication,帶復制功能的LBLC,與 LBLC 不同的是 LVS 將請求 IP 映射至一個服務池中,使用 dh 算法調度請求至對應的服務池中,使用 lc 算法選擇服務池中的節點,當服務池中的所有節點超載,使用 lc 算法從所有后端 Realserver 中選擇一個添加至服務吃中。
1.5 ipvsadm lvs負載均衡管理命令
核心功能:集群服務管理(lvs調度器):增、刪、改;集群服務的RS管理:增、刪、改;查看;管理集群服務:增、改、刪;增、改:ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]刪:ipvsadm -D -t|u|f service-addressservice-address:-t|u|f:-t: TCP協議的端口,VIP:TCP_PORT-u: TCP協議的端口,VIP:UDP_PORT-f:firewall MARK,是一個數字;[-s scheduler]:指定集群的調度算法,默認為wlc;例子:# ipvsadm -A -t 172.16.33.116:80 -s rr管理集群上的RS:增、改、刪;增、改:ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]刪:ipvsadm -d -t|u|f service-address -r server-addressserver-address:rip[:port]選項:lvs類型:-g: gateway, dr類型-i: ipip, tun類型-m: masquerade, nat類型 -w weight:權重;例子:# ipvsadm -a -t 172.16.33.117:80 -r 192.168.100.1 -m# ipvsadm -a -t 172.16.33.118:80 -r 192.168.100.2 -m清空定義的所有內容:ipvsadm -C查看:ipvsadm -L|l [options]--numeric, -n:numeric output of addresses and ports --exact:expand numbers (display exact values)--connection, -c:output of current IPVS connections--stats:output of statistics information--rate :output of rate information保存和重載:ipvsadm -S = ipvsadm-saveipvsadm -R = ipvsadm-restore