LVS 所提供的 IP 負載均衡的三種技術
1.LVS和負載均衡簡介:
LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集群系統。
負載均衡就是有兩臺或者以上的服務器或者站點為我們提供服務,我們將來自客戶端的請求靠某種算法盡量平均分攤到這些集群中,從而避免一臺服務器因為負載太高而出現故障。簡而言之便是將所有的負載均分到多臺服務器中,即使其中某個出現故障,用戶也能正常訪問,得到服務。
廣泛使用的是用軟件的方式來實現負載均衡,實現效果不錯,并且不需要成本是很多企業選擇的方式。
以軟件實現的負載均衡有兩種方式:
- 基于應用層負載均衡
- 基于IP層負載均衡
文章主要就是介紹基于IP層負載均衡;
2.基于 IP 層負載均衡:
基于 IP 層負載均衡:用戶通過虛擬 IP 地址(Virtual IP Address)訪問服務時,訪問請求的報文會到達負載調度器,由它進行負載均衡調度,從一組真實服務器選出一個,將報文處理并轉發給選定服務器的地址。實服務器的回應報文經過負載調度器時,將報文的源地址和源端口改為 Virtual IP Address 和相應的端口,再把報文發給用戶。
而 IP 的負載技術有以下三種模式:
- 通過NAT實現虛擬服務器(VS/NAT)
- 通過IP隧道實現虛擬服務器(VS/TUN)
- 通過直接路由實現虛擬服務器(VS/DR)
3.VS/NAT 實現虛擬服務器
由于 IPv4 中 IP 地址空間的日益緊張和安全方面的原因,很多網絡使用保留 IP 地址(10.0.0.0/255.0.0.0、 172.16.0.0/255.128.0.0和192.168.0.0/255.255.0.0)。這些地址不在 Internet 上使用,而是專門為內部網絡預留的。
當內部網絡中的主機要訪問 Internet 或被 Internet 訪問時,就需要采用網絡地址轉換(Network Address Translation, 以下簡稱NAT),將內部地址轉化為 Internet 上可用的外部地址。
NAT 的工作原理是報文頭(目標地址、源地址和端口等)被正確改寫后,客戶相信 它們連接一個 IP 地址,而不同 IP 地址的服務器組也認為它們是與客戶直接相連的。由此,可以用 NAT 方法將不同 IP 地址的并行網絡服務變成在一個IP地址上的一個虛擬服務。
VS/NAT(Virtual Server via Network Address Translation)實現的虛擬服務器是這樣的一個結構,主要經過這樣的一些步驟:
LVS-NAT
- 客戶端通過 Internet 向服務器發起請求,而請求的 IP 地址指向的是調度器上對外公布的 IP 地址;(因為它并不是真正處理請求的服務器 IP 地址,所以稱之為 虛擬 IP 地址,簡稱為 VIP,Virtual IP Address)
- 請求報文到達調度器(Load Balancer),調度器根據調度算法從一組真實的服務器(因為他們是真正處理用戶請求的服務器,所以稱為真實服務器,Real server。其 IP 地址也被稱為真實 IP,簡稱為 RIP)中選出一臺當前負載不高的服務器。然后將客戶端的請求報文中的目標地址(Load Balancer 的 VIP)和端口通過 iptables 的 NAT 改寫為選定服務器的 IP 地址和服務的端口。最后將修改后的報文發送給選出的服務器。同時,調度器在連接Hash 表中記錄這個連接;當這個連接的下一個報文到達時,從連接Hash表中可以得到原選定服務器的地址和端口,進行同樣的改寫操作,并將報文傳給原選定的服務器。
- Real Server 接收到報文之后,做出了響應的處理,然后將響應的報文發送給 Load Balancer;
- Load Balancer 接收到響應的報文時,將報文的源地址和源端口改為Virtual IP Address和相應的端口,再把報文發給用戶。
這樣,客戶所看到的只是在 Virtual IP Address 上提供的服務,而服務器集群的結構對用戶是透明的。
下面,舉個例子來進一步說明VS/NAT,如圖所示:
NAT-eg
VS/NAT 的配置如下表所示,所有到IP地址為205.100.106.2和端口為80的流量都被負載均衡地調度的真實服務器172.16.1.3:80和 172.16.1.4:8080上。目標地址為205.100.106.2:21的報文被轉移到172.16.1.3:21上。而到其他端口的報文將被拒絕。
Protocol |
Virtual IP Address |
Port |
Real IP Address |
Port |
---|---|---|---|---|
TCP |
205.100.106.2 |
80 |
172.16.1.3 |
80 |
172.16.1.4 |
8080 |
|||
TCP |
205.100.106.2 |
21 |
172.16.1.3 |
21 |
當客戶端訪問Web服務的時候,報文中可能有以下的源地址和目標地址:
SOURCE |
DEST |
---|---|
203.100.106.1:3456 |
205.100.106.2:80 |
報文到達調度器之后,調度器從調度列表中選出一臺服務器,例如是172.16.1.4:8080。該報文會被改寫為如下地址,并將它發送給選出的服務器。
SOURCE |
DEST |
---|---|
203.100.106.1:3456 |
172.16.1.4:8080 |
Real Server 收到修改后的報文之后,做出響應,然后將響應報文返回到調度器,報文如下:
SOURCE |
DEST |
---|---|
172.16.1.4:8080 |
203.100.106.1:3456 |
響應報文的源地址會被 Load Balacer 改寫為虛擬服務的地址,再將報文發送給客戶:
SOURCE |
DEST |
---|---|
205.100.106.2:80 |
203.100.106.1:3456 |
這樣,客戶認為是從202.103.106.5:80服務得到正確的響應,而不會知道該請求是 Real Server1 還是 Real Server2 處理的。
這便是 VS/NAT 的處理數據包的整個過程,它有這樣的一些特點:
- 集群節點,也就是 Real Server 與 Load Balacer 必須在同一個 IP 網絡中
- Load Balancer 位于 Real Server 與客戶端之間,處理進出的所有通信
- RIP 通常是私有地址,僅用于各個集群節點之間的通信。
- Real Server 的網關必須指向 Load Balancer
- 支持端口映射:也就是Real Server 的端口可以自己設定,沒有必須是與 Load Balancer 一樣
VS/NAT 的優勢在于可以做到端口映射,但是 Load Balancer 將可能成為集群的瓶頸。因為所有的出入報文都需要 Load Balancer 處理,請求報文較小不是問題,但是響應報文往往較大,都需要 NAT 轉換的話,大流量的時候,Load Balancer 將會處理不過來。一般使用 VS/NAT 的話,處理 Real Server 數量達到 10~20 臺左右將是極限,并且效率往往不高。
4.VS/DR 實現虛擬服務器
在VS/NAT 的集群系統中,請求和響應的數據報文都需要通過負載調度器,當真實服務器的數目在10臺和20臺之間時,負載調度器將成為整個集群系統的新瓶頸。大多數 Internet服務都有這樣的特點:請求報文較短而響應報文往往包含大量的數據。
既然同時處理進出報文會大大的影響效率,增加機器的負載,那么若是僅僅處理進來的報文,即在負載調度器中只負責調度請求,而出去的報文由 Real Server 直接發給客戶端這樣豈不是高效許多。
VS/DR(Virtual Server via Direct Routing)利用大多數Internet服務的非對稱特點,負載調度器中只負責調度請求,而服務器直接將響應返回給客戶,可以極大地提高整個集群 系統的吞吐量。
VS/DR 實現的虛擬服務器是這樣的一個結構,主要經過這樣的一些步驟:
DR-sturct
- 客戶端通過 Internet 向服務器發起請求,而請求的 IP 地址指向的是調度器上對外公布的 IP 地址;
- 請求報文到達調度器(Load Balancer),調度器根據各個服務器的負載情況,動態地選擇一臺服務器,不修改也不封裝IP報文,而是將數據幀的MAC地址改為選出服務器的MAC地址,再將修改后 的數據幀在與服務器組的局域網上發送。因為數據幀的MAC地址是選出的服務器,所以服務器肯定可以收到這個數據幀;
- Real Server 接收到報文之后,發現報文的目標地址 VIP 是在本地的網絡設備上,服務器處理這個報文,然后根據路由表將響應報文直接返回給客戶。
change-MAC
在VS/DR中,根據缺省的TCP/IP協議棧處理,請求報文的目標地址為VIP,響應報文的源地址肯定也為VIP,所以響應報文不需要作任何修改,可以直接返回給客戶,客戶認為得到正常的服務,而不會知道是哪一臺服務器處理的。
這便是 VS/DR 的處理數據包的整個過程,它有這樣的一些特點:
- 集群節點,也就是 Real Server 與 Load Balacer 必須在同一個物理網絡中(若是不同網段的話結構將變得復雜)
- RIP 通常是私有地址,也可以是公網地址,以便于遠程管理與監控。
- Load Balancer 僅僅負責處理入站的請求,Real Server 將直接響應客戶端
- Real Server 的網關不能指向 Load Balancer
- 不支持端口映射:也就是Real Server 的端口必須是與 Load Balancer 對外服務的一樣
5.VS/TUN 實現虛擬服務器
VS/DR 限制 Real Server 與 Load Balancer 必須在同一個物理網絡中,那若是分散在各地豈不是無法使用?所以有了 VS/TUN(Virtual Server via IP Tunneling)的誕生。
IP隧道(IP tunneling)是將一個IP報文封裝在另一個IP報文的技術,這可以使得目標為一個IP地址的數據報文能被封裝和轉發到另一個IP地址。IP隧道技術亦稱為IP封裝技術(IP encapsulation)。IP隧道主要用于移動主機和虛擬私有網絡(Virtual Private Network),在其中隧道都是靜態建立的,隧道一端有一個IP地址,另一端也有唯一的IP地址。
我們利用IP隧道技術將請求報文封裝轉發給后端服務器,響應報文能從后端服務器直接返回給客戶。但在這里,后端服務器有一組而非一個,所以我們不可能靜態地建立一一對應的隧道,而是動態地選擇 一臺服務器,將請求報文封裝和轉發給選出的服務器。這樣,我們可以利用IP隧道的原理將一組服務器上的網絡服務組成在一個IP地址上的虛擬網絡服務。 VS/TUN的體系結構如圖所示,各個服務器將VIP地址配置在自己的IP隧道設備上。
Tunnel-sturct
它的連接調度和管理與VS/NAT中的一樣,只是它的報文轉發方法不同。調度器根據各個服務器的負載情況,動態地選擇一臺服務器, 將請求報文封裝在另一個 IP 報文中,再將封裝后的 IP 報文轉發給選出的服務器;服務器收到報文后,先將報文解封獲得原來目標地址為 VI P的報文,服務器發現VIP地址被配置在本地的 IP隧道設備上,所以就處理這個請求,然后根據路由表將響應報文直接返回給客戶。
這便是 VS/TUN 的處理數據包的整個過程,它有這樣的一些特點:
- 集群節點,也就是 Real Server 與 Load Balacer 可以跨越公網
- RIP 必須是公網地址。
- Load Balancer 僅僅負責處理入站的請求,Real Server 將直接響應客戶端
- Real Server 的網關不能指向 Load Balancer
- 不支持端口映射:也就是Real Server 的端口必須是與 Load Balancer 對外服務的一樣
這便是 LVS 所提供的 IP 負載均衡的三種技術,我們可以根據自己的情況做出不同的選擇。