1. 程式人生 > >LVS虛擬服務器的實現方式

LVS虛擬服務器的實現方式

1.3 一個 nec times write sim alac 維護 活動

一、LVS相關實驗介紹

IP 負載均衡技術是在負載調度器的實現技術中效率最高的,LVS 的 IP 負載技術被廣泛地應用各種不同的大型企業集群中,帶來穩定、可靠的服務。

實驗涉及的知識點

  • 負載均衡解決方法
  • VS/NAT 實現虛擬服務器
  • VS/DR 實現虛擬服務器
  • VS/TUN 實現虛擬服務器

二、負載均衡的解決方法

在以軟件實現的負載均衡的方式有:

  • 基於應用層負載均衡
  • 基於 IP 層負載均衡

其中基於應用層負載均衡:多臺服務器通過高速的互聯網絡連接成一個集群系統,在前端有一個基於應用層的負載調度器。當用戶訪問請求到達調度器時,請求會提交給做負載均衡調度的應用程序,分析請求,根據各個服務器的負載情況,選出一臺服務器,重寫請求並向選出的服務器訪問,取得結果後,再返回給用戶。

典型的代表有 Nginx 以及 Apache 的 Rewrite 模塊。

應用層的負載均衡實現這樣強大的功能也會付出一定的代價:

  • 系統處理開銷較大,致使系統的伸縮性有限。
  • 基於應用層的負載均衡調度器對於不同的應用,需要寫不同的調度器。

而基於 IP 層負載均衡:用戶通過虛擬 IP 地址(Virtual IP Address)訪問服務時,訪問請求的報文會到達負載調度器,由它進行負載均衡調度,從一組真實服務器選出一個,將報文處理並轉發給選定服務器的地址。實服務器的回應報文經過負載調度器時,將報文的源地址和源端口改為 Virtual IP Address 和相應的端口,再把報文發給用戶。

而 IP 的負載技術有以下三種模式:

  • 通過 NAT 實現虛擬服務器(VS/NAT)
  • 通過 IP 隧道實現虛擬服務器(VS/TUN)
  • 通過直接路由實現虛擬服務器(VS/DR)

並且在調度器上配置了 8 種調度算法:

  • 輪叫(Round Robin):調度器通過"輪叫"調度算法將外部請求按順序輪流分配到集群中的真實服務器上,它均等地對待每一臺服務器,而不管服務器上實際的連接數和系統負載。

  • 加權輪叫(Weighted Round Robin):調度器通過"加權輪叫"調度算法根據真實服務器的不同處理能力來調度訪問請求。這樣可以保證處理能力強的服務器處理更多的訪問流量。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。

  • 最少鏈接(Least Connections):調度器通過"最少連接"調度算法動態地將網絡請求調度到已建立的鏈接數最少的服務器上。如果集群系統的真實服務器具有相近的系統性能,采用"最小連接"調度算法可以較好地均衡負載。

  • 加權最少鏈接(Weighted Least Connections):在集群系統中的服務器性能差異較大的情況下,調度器采用"加權最少鏈接"調度算法優化負載均衡性能,具有較高權值的服務器將承受較大比例的活動連接負載。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。

  • 基於局部性的最少鏈接(Locality-Based Least Connections):"基於局部性的最少鏈接" 調度算法是針對目標IP地址的負載均衡,目前主要用於Cache集群系統。該算法根據請求的目標 IP 地址找出該目標 IP 地址最近使用的服務器,若該服務器 是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於一半的工作負載,則用"最少鏈接"的原則選出一個可用的服務 器,將請求發送到該服務器。

  • 帶復制的基於局部性最少鏈接(Locality-Based Least Connections with Replication):"帶復制的基於局部性最少鏈接"調度算法也是針對目標 IP 地址的負載均衡,目前主要用於 Cache 集群系統。它與 LBLC 算法的不同之處是它要維護從一個 目標 IP 地址到一組服務器的映射,而 LBLC 算法維護從一個目標 IP 地址到一臺服務器的映射。該算法根據請求的目標 IP 地址找出該目標 IP 地址對應的服務器組,按"最小連接"原則從服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器,若服務器超載;則按"最小連接"原則從這個集群中選出一 臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低復制的 程度。

  • 目標地址散列(Destination Hashing):"目標地址散列"調度算法根據請求的目標IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。

  • 源地址散列(Source Hashing):"源地址散列"調度算法根據請求的源IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。

三、LVS/NAT實現虛擬服務器

由於 IPv4IP 地址空間的日益緊張和安全方面的原因,很多網絡使用保留 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)實現的虛擬服務器是這樣的一個結構,主要經過這樣的一些步驟:

技術分享圖片

  1. 客戶端通過 Internet 向服務器發起請求,而請求的 IP 地址指向的是調度器上對外公布的 IP 地址;(因為它並不是真正處理請求的服務器 IP 地址,所以稱之為 虛擬 IP 地址,簡稱為 VIP,Virtual IP Address)
  2. 請求報文到達調度器(Load Balancer),調度器根據調度算法從一組真實的服務器(因為他們是真正處理用戶請求的服務器,所以稱為真實服務器,Real server。其 IP 地址也被稱為真實 IP,簡稱為 RIP)中選出一臺當前負載不高的服務器。然後將客戶端的請求報文中的目標地址(Load Balancer 的 VIP)和端口通過 iptablesNAT 改寫為選定服務器的 IP 地址和服務的端口。最後將修改後的報文發送給選出的服務器。同時,調度器在連接Hash 表中記錄這個連接;當這個連接的下一個報文到達時,從連接 Hash 表中可以得到原選定服務器的地址和端口,進行同樣的改寫操作,並將報文傳給原選定的服務器。
  3. Real Server 接收到報文之後,作出了相應的處理,然後將響應的報文發送給 Load Balancer
  4. Load Balancer 接收到響應的報文時,將報文的源地址和源端口改為 Virtual IP Address和相應的端口,再把報文發給用戶。

這樣,客戶所看到的只是在 Virtual IP Address 上提供的服務,而服務器集群的結構對用戶是透明的。

下面,舉個例子來進一步說明 VS/NAT,如圖所示:

技術分享圖片

VS/NAT 的配置如下表所示,所有到 IP 地址為 205.100.106.2 和端口為 80 的流量都被負載均衡地調度的真實服務器172.16.1.3:80172.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 服務的時候,報文中可能有以下的源地址和目標地址:

SOURCEDEST
203.100.106.1:3456 205.100.106.2:80

報文到達調度器之後,調度器從調度列表中選出一臺服務器,例如是172.16.1.4:8080。該報文會被改寫為如下地址,並將它發送給選出的服務器。

SOURCEDEST
203.100.106.1:3456 172.16.1.4:8080

Real Server 收到修改後的報文之後,做出響應,然後將響應報文返回到調度器,報文如下:

SOURCEDEST
172.16.1.4:8080 203.100.106.1:3456

響應報文的源地址會被 Load Balacer 改寫為虛擬服務的地址,再將報文發送給客戶:

SOURCEDEST
205.100.106.2:80 203.100.106.1:3456

這樣,客戶認為是從202.103.106.5:80服務得到正確的響應,而不會知道該請求是 Real Server1 還是 Real Server2 處理的。

這便是 VS/NAT 的處理數據包的整個過程,它有這樣的一些特點:

  • 集群節點,也就是 Real ServerLoad 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 臺左右將是極限,並且效率往往不高。

四、LVS/DR實現虛擬服務器

VS/NAT 的集群系統中,請求和響應的數據報文都需要通過負載調度器,當真實服務器的數目在10臺和20臺之間時,負載調度器將成為整個集群系統的新瓶頸。大多數 Internet 服務都有這樣的特點:請求報文較短而響應報文往往包含大量的數據。

既然同時處理進出報文會大大地影響效率,增加機器的負載,那麽若是僅僅處理進來的報文,即在負載調度器中只負責調度請求,而出去的報文由 Real Server 直接發給客戶端這樣豈不是高效許多。

VS/DR(Virtual Server via Direct Routing)利用大多數 Internet 服務的非對稱特點,負載調度器中只負責調度請求,而服務器直接將響應返回給客戶,可以極大地提高整個集群 系統的吞吐量。

VS/DR 實現的虛擬服務器是這樣的一個結構,主要經過這樣的一些步驟:

技術分享圖片

  1. 客戶端通過 Internet 向服務器發起請求,而請求的 IP 地址指向的是調度器上對外公布的 IP 地址;
  2. 請求報文到達調度器(Load Balancer),調度器根據各個服務器的負載情況,動態地選擇一臺服務器,不修改也不封裝 IP 報文,而是將數據幀的 MAC 地址改為選出服務器的 MAC 地址,再將修改後 的數據幀在與服務器組的局域網上發送。因為數據幀的 MAC 地址是選出的服務器,所以服務器肯定可以收到這個數據幀;
  3. Real Server 接收到報文之後,發現報文的目標地址 VIP 是在本地的網絡設備上,服務器處理這個報文,然後根據路由表將響應報文直接返回給客戶。

技術分享圖片

VS/DR中,根據缺省的 TCP/IP 協議棧處理,請求報文的目標地址為 VIP,響應報文的源地址肯定也為VIP,所以響應報文不需要做任何修改,可以直接返回給客戶,客戶認為得到正常的服務,而不會知道是哪一臺服務器處理的。

這便是 VS/DR 的處理數據包的整個過程,它有這樣的一些特點:

  • 集群節點,也就是 Real ServerLoad Balacer 必須在同一個物理網絡中(若是不同網段的話結構將變得復雜)
  • RIP 通常是私有地址,也可以是公網地址,以便於遠程管理與監控。
  • Load Balancer 僅僅負責處理入站的請求,Real Server 將直接響應客戶端
  • Real Server 的網關不能指向 Load Balancer
  • 不支持端口映射:也就是 Real Server 的端口必須是與 Load Balancer 對外服務的一樣

五、LVS/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 隧道設備上。

技術分享圖片

它的連接調度和管理與 VS/NAT 中的一樣,只是它的報文轉發方法不同。調度器根據各個服務器的負載情況,動態地選擇一臺服務器, 將請求報文封裝在另一個 IP 報文中,再將封裝後的 IP 報文轉發給選出的服務器;服務器收到報文後,先將報文解封獲得原來目標地址為 VIP的報文,服務器發現VIP地址被配置在本地的 IP隧道設備上,所以就處理這個請求,然後根據路由表將響應報文直接返回給客戶。

這便是 VS/TUN 的處理數據包的整個過程,它有這樣的一些特點:

  • 集群節點,也就是 Real Server 與 Load Balacer 可以跨越公網
  • RIP 必須是公網地址。
  • Load Balancer 僅僅負責處理入站的請求,Real Server 將直接響應客戶端
  • Real Server 的網關不能指向 Load Balancer
  • 不支持端口映射:也就是 Real Server 的端口必須是與 Load Balancer 對外服務的一樣

這便是 LVS 所提供的 IP 負載均衡的三種技術,我們可以根據自己的情況做出不同的選擇。

LVS虛擬服務器的實現方式