LVS 負載均衡

LVSLinux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統。本項目在1998年5月由章文嵩博士成立,是中國國內最早出現的自由軟件項目之一。負載均衡集羣是 load balance 集羣的簡寫,翻譯成中文就是負載均衡集羣。常用的負載均衡開源軟件有nginx、lvs、haproxy,商業的硬件負載均衡設備F5、Netscale。

  • 使用集羣技術和Linux操作系統實現一個高性能、高可用的服務器.
  • 很好的可伸縮性(Scalability)
  • 很好的可靠性(Reliability)
  • 很好的可管理性(Manageability)
  • 開源,免費
  • 在網上能找到一些相關技術資源
  • 具有軟件負載均衡的一些優點

可伸縮網絡服務的幾種結構,它們都需要一個前端的負載調度器(或者多個進行主從備份)。我們先分析實現虛擬網絡服務的主要技術,指出IP負載均衡技術是在負載調度器的實現技術中效率最高的。在已有的IP負載均衡技術中,主要有通過網絡地址轉換(Network Address Translation)將一組服務器構成一個高性能的、高可用的虛擬服務器,我們稱之爲VS/NAT技術(Virtual Server via Network Address Translation)。在分析VS/NAT的缺點和網絡服務的非對稱性的基礎上,我們提出了通過IP隧道實現虛擬服務器的方法VS/TUN (Virtual Server via IP Tunneling),和通過直接路由實現虛擬服務器的方法VS/DR(Virtual Server via Direct Routing),它們可以極大地提高系統的伸縮性。VS/NAT、VS/TUN和VS/DR技術是LVS集羣中實現的三種IP負載均衡技術

LVS技術

  • 技術簡介

LVS集羣採用IP負載均衡技術和基於內容請求分發技術。調度器具有很好的吞吐率,將請求均衡地轉移到不同的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。整個服務器集羣的結構對客戶是透明的,而且無需修改客戶端和服務器端的程序。爲此,在設計時需要考慮系統的透明性、可伸縮性、高可用性和易管理性。

一般來說,LVS集羣採用三層結構,其主要組成部分爲:

A、負載調度器(load balancer),它是整個集羣對外面的前端機,負責將客戶的請求發送到一組服務器上執行,而客戶認爲服務是來自一個IP地址(我們可稱之爲虛擬IP地址)上的。

B、服務器池(server pool),是一組真正執行客戶請求的服務器,執行的服務有WEB、MAIL、FTP和DNS等。

C、共享存儲(shared storage),它爲服務器池提供一個共享的存儲區,這樣很容易使得服務器池擁有相同的內容,提供相同的服務。

  • 調度器

調度器是服務器集羣系統的唯一入口點(Single Entry Point),它可以採用IP負載均衡技術、基於內容請求分發技術或者兩者相結合。在IP負載均衡技術中,需要服務器池擁有相同的內容提供相同的服務。當客戶請求到達時,調度器只根據服務器負載情況和設定的調度算法從服務器池中選出一個服務器,將該請求轉發到選出的服務器,並記錄這個調度;當這個請求的其他報文到達,也會被轉發到前面選出的服務器。在基於內容請求分發技術中,服務器可以提供不同的服務,當客戶請求到達時,調度器可根據請求的內容選擇服務器執行請求。因爲所有的操作都是在Linux操作系統核心空間中完成的,它的調度開銷很小,所以它具有很高的吞吐率。服務器池的結點數目是可變的。當整個系統收到的負載超過所有結點的處理能力時,可以在服務器池中增加服務器來滿足不斷增長的請求負載。

對大多數網絡服務來說,請求間不存在很強的相關性,請求可以在不同的節點上並行執行,所以整個系統的性能基本上可以隨着服務器池的結點數目增加而線性增長。 共享存儲通常是數據庫、網絡文件系統或者分佈式文件系統。服務器結點需要動態更新的數據一般存儲在數據庫系統中,同時數據庫會保證併發訪問時數據的一致性。靜態的數據可以存儲在網絡文件系統(如NFS/CIFS)中,但網絡文件系統的伸縮能力有限,一般來說,NFS/CIFS服務器只能支持3~6個繁忙的服務器結點。對於規模較大的集羣系統,可以考慮用分佈式文件系統,如AFS、GFS、Coda和Intermezzo等。分佈式文件系統可爲各服務器提供共享的存儲區,它們訪問分佈式文件系統就像訪問本地文件系統一樣,同時分佈式文件系統可提供良好的伸縮性和可用性。

LVS的八種調度算法

  1. 輪叫調度 rr :這種算法是最簡單的,就是按依次循環的方式將請求調度到不同的服務器上,該算法最大的特點就是簡單。輪詢算法假設所有的服務器處理請求的能力都是一樣的,調度器會將所有的請求平均分配給每個真實服務器,不管後端 RS 配置和處理能力,非常均衡地分發下去。
  2.  加權輪叫 wrr :這種算法比 rr 的算法多了一個權重的概念,可以給 RS 設置權重,權重越高,那麼分發的請求數越多,權重的取值範圍 0 – 100。主要是對rr算法的一種優化和補充, LVS 會考慮每臺服務器的性能,並給每臺服務器添加要給權值,如果服務器A的權值爲1,服務器B的權值爲2,則調度到服務器B的請求會是服務器A的2倍。權值越高的服務器,處理的請求越多。
  3. 最少鏈接 lc :這個算法會根據後端 RS 的連接數來決定把請求分發給誰,比如 RS1 連接數比 RS2 連接數少,那麼請求就優先發給 RS1
  4. 加權最少鏈接 wlc :這個算法比 lc 多了一個權重的概念。
  5. 基於局部性的最少連接調度算法 lblc:這個算法是請求數據包的目標 IP 地址的一種調度算法,該算法先根據請求的目標 IP 地址尋找最近的該目標 IP 地址所有使用的服務器,如果這臺服務器依然可用,並且有能力處理該請求,調度器會盡量選擇相同的服務器,否則會繼續選擇其它可行的服務器
  6. 複雜的基於局部性最少的連接算法 lblcr :記錄的不是要給目標 IP 與一臺服務器之間的連接記錄,它會維護一個目標 IP 到一組服務器之間的映射關係,防止單點服務器負載過高。
  7. 目標地址散列調度算法 dh :該算法是根據目標 IP 地址通過散列函數將目標 IP 與服務器建立映射關係,出現服務器不可用或負載過高的情況下,發往該目標 IP 的請求會固定發給該服務器。
  8. 源地址散列調度算法 sh :與目標地址散列調度算法類似,但它是根據源地址散列算法進行靜態分配固定的服務器資源。
  • 分佈式鎖管理器

此外,當不同服務器上的應用程序同時讀寫訪問分佈式文件系統上同一資源時,應用程序的訪問衝突需要消解才能使得資源處於一致狀態。這需要一個分佈式鎖管理器(Distributed Lock Manager),它可能是分佈式文件系統內部提供的,也可能是外部的。開發者在寫應用程序時,可以使用分佈式鎖管理器來保證應用程序在不同結點上併發訪問的一致性。

負載調度器、服務器池和共享存儲系統通過高速網絡相連接,如100Mbps交換網絡、Myrinet和Gigabit網絡等。使用高速的網絡,主要爲避免當系統規模擴大時互聯網絡成爲整個系統的瓶頸。

  • 監視器

Graphic Monitor是爲系統管理員提供整個集羣系統的監視器,它可以監視系統的狀態。Graphic Monitor是基於瀏覽器的,所以無論管理員在本地還是異地都可以監測系統的狀況。爲了安全的原因,瀏覽器要通過HTTPS(Secure HTTP)協議和身份認證後,才能進行系統監測,並進行系統的配置和管理。

  • LVS 由2部分程序組成, ipvs 和 ipvsadm。

    ipvs(ip virtual server):工作在內核空間,叫ipvs,是真正生效實現調度的代碼。
    pvsadm:工作在用戶空間,負責爲ipvs內核框架編寫規則,定義誰是集羣服務,誰是後端真實的服務器(Real Server)

  • DS:Director Server。指的是前端負載均衡器節點。
  • RS:Real Server。後端真實的工作服務器。
  • VIP:向外部直接面向用戶請求,作爲用戶請求的目標的IP地址。
  • DIP:Director Server IP,主要用於和內部主機通訊的IP地址。
  • RIP:Real Server IP,後端服務器的IP地址。
  • CIP:Client IP,訪問客戶端的IP地址。

LVS 三種工作模式的解析

  • 基於NAT的LVS模式負載均衡

      NAT(Network Address Translation)即網絡地址轉換,其作用是通過數據報頭的修改,使得位於企業內部的私有IP地址可以訪問外網,以及外部用用戶可以訪問位於公司內部的私有IP主機。VS/NAT工作模式拓撲結構如圖2所示,LVS負載調度器可以使用兩塊網卡配置不同的IP地址,eth0設置爲私鑰IP與內部網絡通過交換設備相互連接,eth1設備爲外網IP與外部網絡聯通。

       第一步,用戶通過互聯網DNS服務器解析到公司負載均衡設備上面的外網地址,相對於真實服務器而言,LVS外網IP又稱VIP(Virtual IP Address),用戶通過訪問VIP,即可連接後端的真實服務器(Real Server),而這一切對用戶而言都是透明的,用戶以爲自己訪問的就是真實服務器,但他並不知道自己訪問的VIP僅僅是一個調度器,也不清楚後端的真實服務器到底在哪裏、有多少真實服務器。

第二步,用戶將請求發送至124.126.147.168,此時LVS將根據預設的算法選擇後端的一臺真實服務器(192.168.0.1~192.168.0.3),將數據請求包轉發給真實服務器,並且在轉發之前LVS會修改數據包中的目標地址以及目標端口,目標地址與目標端口將被修改爲選出的真實服務器IP地址以及相應的端口。

第三步,真實的服務器將響應數據包返回給LVS調度器,調度器在得到響應的數據包後會將源地址和源端口修改爲VIP及調度器相應的端口,修改完成後,由調度器將響應數據包發送回終端用戶,另外,由於LVS調度器有一個連接Hash表,該表中會記錄連接請求及轉發信息,當同一個連接的下一個數據包發送給調度器時,從該Hash表中可以直接找到之前的連接記錄,並根據記錄信息選出相同的真實服務器及端口信息。

  • 基於TUN的LVS負載均衡

       在LVS(NAT)模式的集羣環境中,由於所有的數據請求及響應的數據包都需要經過LVS調度器轉發,如果後端服務器的數量大於10臺,則調度器就會成爲整個集羣環境的瓶頸。我們知道,數據請求包往往遠小於響應數據包的大小。因爲響應數據包中包含有客戶需要的具體數據,所以LVS(TUN)的思路就是將請求與響應數據分離,讓調度器僅處理數據請求,而讓真實服務器響應數據包直接返回給客戶端。VS/TUN工作模式拓撲結構如圖3所示。其中,IP隧道(IP tunning)是一種數據包封裝技術,它可以將原始數據包封裝並添加新的包頭(內容包括新的源地址及端口、目標地址及端口),從而實現將一個目標爲調度器的VIP地址的數據包封裝,通過隧道轉發給後端的真實服務器(Real Server),通過將客戶端發往調度器的原始數據包封裝,並在其基礎上添加新的數據包頭(修改目標地址爲調度器選擇出來的真實服務器的IP地址及對應端口),LVS(TUN)模式要求真實服務器可以直接與外部網絡連接,真實服務器在收到請求數據包後直接給客戶端主機響應數據。

  • 基於DR的LVS負載均衡

在LVS(TUN)模式下,由於需要在LVS調度器與真實服務器之間創建隧道連接,這同樣會增加服務器的負擔。與LVS(TUN)類似,DR模式也叫直接路由模式,其體系結構如圖4所示,該模式中LVS依然僅承擔數據的入站請求以及根據算法選出合理的真實服務器,最終由後端真實服務器負責將響應數據包發送返回給客戶端。與隧道模式不同的是,直接路由模式(DR模式)要求調度器與後端服務器必須在同一個局域網內,VIP地址需要在調度器與後端所有的服務器間共享,因爲最終的真實服務器給客戶端迴應數據包時需要設置源IP爲VIP地址,目標IP爲客戶端IP,這樣客戶端訪問的是調度器的VIP地址,迴應的源地址也依然是該VIP地址(真實服務器上的VIP),客戶端是感覺不到後端服務器存在的。由於多臺計算機都設置了同樣一個VIP地址,所以在直接路由模式中要求調度器的VIP地址是對外可見的,客戶端需要將請求數據包發送到調度器主機,而所有的真實服務器的VIP地址必須配置在Non-ARP的網絡設備上,也就是該網絡設備並不會向外廣播自己的MAC及對應的IP地址,真實服務器的VIP對外界是不可見的,但真實服務器卻可以接受目標地址VIP的網絡請求,並在迴應數據包時將源地址設置爲該VIP地址。調度器根據算法在選出真實服務器後,在不修改數據報文的情況下,將數據幀的MAC地址修改爲選出的真實服務器的MAC地址,通過交換機將該數據幀發給真實服務器。整個過程中,真實服務器的VIP不需要對外界可見。


  • 下面開始搭建基於 DR 模式 的 LVS 負載均衡
  • 試驗環境簡介
  • VIP 172.16.1.168
  • Director Server CentOS 7.5 :  (eth0 192.168.1.2  eth1 172.16.1.1  vip eth1:0 172.16.1.168)

  • Real server1 CentOS 7.5 : (eth0 172.16.1.4  vip lo:0 172.16.1.168)

  • Real server2 CentOS 7.5 : (eth0 172.16.1.5  vip lo:0 172.16.1.168)


  • 首先在  Director 上使用 yum 方式安裝 ipvsadm
  • 在 CentOS 7 中 LVS 默認已經被編譯進內核中,主要分爲兩部分ipvs和ipvsadm,ipvs是LVS軟件核心,是運行在LB上的,基於ip層的負載均衡;ipvsadm 是用戶空間(DR)集羣管理工具。
  • 查看內核是否加載 LVS 模塊
  • lsmod | grep ip_vs
  • 安裝 ipvsadm
  • yum install -y ipvsadm
  • 要想起到負載均衡效果,所有請求報文必須發往 LVS 服務器(DS),然後 DS 根據指定算法分發到後端服務器上(RS),因此DS必須配置VIP地址,VIP是與公網client通信地址,這樣DS才能接受到請求報文進行分發。
  • 在LVS 服務器上添加一個地址爲 VIP 的虛擬網卡eth1:0
  • ifconfig eth1:0 172.16.1.168 netmask 255.255.255.255 up
  • 添加 IPVS 規則
  • ipvsadm -A -t 172.16.1.168:80 -s wrr
    ipvsadm -a -t 172.16.1.168:80 -r 172.16.1.4:80 -g -w 1
    ipvsadm -a -t 172.16.1.168:80 -r 172.16.1.5:80 -g -w 1
    ipvsadm-save -n > /etc/sysconfig/ipvsadm
    -A -t server1.2:http -s wrr
    -a -t server1.2:http -r 172.16.1.4:http -g -w 1
    -a -t server1.2:http -r 172.16.1.5:http -g -w 1
    systemctl start ipvsadm
  • 確認無誤啓動 LVS 服務
  • PS:規則文件會保存在 /etc/sysconfig/ipvsadm 文件中


  • 接着分別在  Real server (Rs)端設置
  • 將對應網卡設置爲只回應目標IP爲自身接口地址的ARP請求

echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore

將ARP請求的源IP設置爲eth0上的IP,也就是RIP

echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce

echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

  • 永久生效方式,編輯 /etc/sysctl.conf 在末尾添加
  • net.ipv4.conf.all.arp_ignore=1
    net.ipv4.conf.lo.arp_ignore=1
    net.ipv4.conf.all.arp_announce=2
    net.ipv4.conf.lo.arp_announce=2
  • 必須完成以上設置,然後添加IP地址爲 VIP 的虛擬網卡lo:0
  • ifconfig lo:0 172.16.1.168 netmask 255.255.255.255 up
  • 添加一條路由,目標IP爲VIP的數據包使用lo接口發送,這樣響應報文的源IP就會爲VIP

  • route add -host 172.16.1.168 dev lo:0

  • 使用 yum 方式安裝 nginx
  • yum -y install nginx
  • echo "<html><h1> 172.16.1.4 </h1></html>" > /usr/share/nginx/html/index.html 
  • systemctl start nginx

  • 兩臺 RS 都要做相同的設置

  • 打開瀏覽器 輸入 http://172.16.1.168,手動刷新查看結果(一直按住F5可以看到變化)


  • Linux 內核參數arp_ignore和arp_announce作用說明

    arp_ignore - INTEGER
    0:默認值,表示可使用本地任意接口上配置的任意地址進行arp應答;
    1:僅當請求的目標IP配置在本地主機接受到報文的接口上時,纔給予響應;
    2:僅當目的IP配置在收到報文的接口上,且arp請求的源IP和該接口同一網段,才響應arp請求;
    3:如ARP請求的IP作用域是主機則不響應,如果作用域是全局或者鏈路則響應ARP
    4-7:保留
    8:不應答所有本地IP
    arp_announce - INTEGER
    0:默認值,允許使用本機上所有接口的IP作ARP通告。
    1:儘量避免使用本地IP向非本網卡直接連接網絡進行ARP通告。
    2:必須避免使用本地IP向非本網卡直接連接網絡進行ARP通告

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章