天天看點

揭開 LVS 神秘的面紗揭開 LVS 神秘的面紗

揭開 LVS 神秘的面紗

一 前言

作為一名具備多年經驗的老運維,LVS 的名聲可謂如雷貫耳,一直都在尋找一個機會系統化地收集整理相關資料。時至今日,終于有時間詳細地學習和了解 LVS 相關的知識。

LVS 是linux virtual server的簡寫,意為:Linux虛拟伺服器,這是一個由章文嵩博士在1998年5月發起的一個自由軟體項目。Linux 2.4 以後的核心版本,已經內建了 LVS 的各個功能子產品,我們可以直接使用LVS提供的各種功能。

二 認識 LVS

LVS叢集的特點可以歸結如下:

  • 功能

有實作三種IP負載均衡技術和八種連接配接排程算法的IPVS軟體。在IPVS内部實作上,采用了高效的Hash函數和垃圾回收機制,能正确處理所排程封包相關的ICMP消息(有些商品化的系統反而不能)。虛拟服務的設定數目沒有限制,每個虛拟服務有自己的伺服器集。它支援持久的虛拟服務(如HTTP Cookie和HTTPS等需要該功能的支援),并提供詳盡的統計資料,如連接配接的處理速率和封包的流量等。針對大規模拒絕服務(Deny of Service)攻擊,實作了三種防衛政策。

有基于内容請求分發的應用層交換軟體KTCPVS,它也是在Linux核心中實作。有相關的叢集管理軟體對資源進行監測,能及時将故障屏蔽,實作系統的高可用性。主、從排程器能周期性地進行狀态同步,進而實作更高的可用性。

  • 适用性

後端伺服器可運作任何支援TCP/IP的作業系統,包括Linux,各種Unix(如FreeBSD、Sun Solaris、HP Unix等),Mac/OS和Windows NT/2000等。

負載排程器能夠支援絕大多數的TCP和UDP協定:

協定 内容
TCP HTTP,FTP,PROXY,SMTP,POP3,IMAP4,DNS,LDAP,HTTPS,SSMTP等
UDP DNS,NTP,ICP,視訊、音頻流播放協定等

無需對客戶機和伺服器作任何修改,可适用大多數Internet服務。

  • 性能

LVS伺服器叢集系統具有良好的伸縮性,可支援幾百萬個并發連接配接。配置100M網卡,采用VS/TUN或VS/DR排程技術,叢集系統的吞吐量可高達1Gbits/s;如配置千兆網卡,則系統的最大吞吐量可接近10Gbits/s。

  • 可靠性

LVS伺服器叢集軟體已經在很多大型的、關鍵性的站點得到很好的應用,是以它的可靠性在真實應用得到很好的證明。有很多排程器運作一年多,未作一次重新開機動。

  • 軟體許可證

LVS叢集軟體是按GPL(GNU Public License)許可證發行的自由軟體,這意味着你可以得到軟體的源代碼,有權對其進行修改,但必須保證你的修改也是以GPL方式發行。

根據 LVS 工作模式的不同,LVS 工作模式分為三種:NAT 模式、TUN 模式、DR模式。

三 了解三種模式

3.1 Virtual Server via Network Address Translation(VS/NAT)

通過網絡位址轉換,排程器重寫請求封包的目标位址,根據預設的排程算法,将請求分派給後端的真實伺服器;真實伺服器的響應封包通過排程器時,封包的源位址被重寫,再傳回給客戶,完成整個負載排程過程。架構參考下圖:

揭開 LVS 神秘的面紗揭開 LVS 神秘的面紗

3.2 Virtual Server via IP Tunneling(VS/TUN)

采用NAT技術時,由于請求和響應封包都必須經過排程器位址重寫,當客戶請求越來越多時,排程器的處理能力将成為瓶頸。為了解決這個問題,排程器把請求封包通過IP隧道轉發至真實伺服器,而真實伺服器将響應直接傳回給客戶,是以排程器隻處理請求封包。由于一般網絡服務應答比請求封包大許多,采用 VS/TUN技術後,叢集系統的最大吞吐量可以提高10倍。架構參考下圖:

揭開 LVS 神秘的面紗揭開 LVS 神秘的面紗

3.3 Virtual Server via Direct Routing(VS/DR)

VS/DR通過改寫請求封包的MAC位址,将請求發送到真實伺服器,而真實伺服器将響應直接傳回給客戶。同VS/TUN技術一樣,VS/DR技術可極大地 提高叢集系統的伸縮性。這種方法沒有IP隧道的開銷,對叢集中的真實伺服器也沒有必須支援IP隧道協定的要求,但是要求排程器與真實伺服器都有一塊網卡連在同一實體網段上。架構參考下圖:

揭開 LVS 神秘的面紗揭開 LVS 神秘的面紗

四 每種模式的優缺點

4.1 NAT 模式

優點:

  • 伺服器可以運作任何支援TCP/IP的作業系統,它隻需要一個IP位址配置在排程器上,伺服器組可以用私有的IP位址。
  • 采用内部 IP,服務節點隐蔽,安全性較好。
  • 原理、配置簡單,容易了解。

缺點:

  • 伸縮能力有限, 當伺服器結點數目升到20時,排程器本身有可能成為系統的新瓶頸,因為在NAT中請求和響應封包都需要通過負載排程器。

4.2 TUN 模式

  • 可以排程百台以上的伺服器(同等規模的伺服器),而它不會成為系統的瓶頸。可以用來建構高性能的超級伺服器。
  • TUN技術對伺服器有要求,即所有的伺服器必須支援“IP Tunneling”或者“IP Encapsulation”協定。
  • 節點暴露,安全性不如 NAT 模式。

4.3 DR 模式

  • 跟 TUN 模式相比,這種方法沒有IP隧道的開銷。
  • 要求負載排程器與實際伺服器都有一塊網卡連在同一實體網段上,伺服器網絡裝置(或者裝置别名)不作ARP響應,或者能将封包重定向(Redirect)到本地的Socket端口上。

整合一下,得到下表:

模式 優點 缺點
NAT
  1. 伺服器可以運作任何支援TCP/IP的作業系統。
  1. 伸縮能力有限。當伺服器結點數目升到20時,排程器本身有可能成為系統的新瓶頸,因為在NAT中請求和響應封包都需要通過負載排程器。
TUN
DR

五 八種負載排程算法

針對不同的網絡服務需求和伺服器配置,IPVS排程器實作了如下八種負載排程算法:

  • 輪詢(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)從靜态配置設定的散清單找出對應的伺服器,若該伺服器是可用的且未超載,将請求發送到該伺服器,否則傳回空。

六 總結

本文大量引用了章博士原文,并在此基礎之上作了一些延申與總結,旨在學習、交流,也為将來自己查閱資料時節約時間。由于時間倉促,難免疏漏,望諸位多多指教。

七 參考資料

7.1

Linux伺服器叢集系統(一)

7.2

Linux伺服器叢集系統(二)

7.3

Linux伺服器叢集系統(三)

7.4

Linux伺服器叢集系統(四)