LVS詳解(實施級)

LVS使用詳解

一、LVS概述

LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統。本項目在1998年5月由章文嵩博士成立,是中國國內最早出現的自由軟件項目之一。LVS是開源負載均衡的代表性軟件,它工作在內核級別,具備極好的性能和生產環境可用性。普通雙CPU,8G服務器,在DR模式下即可承載高達數萬甚至數十萬的併發連接數。

LVS是四層負載均衡軟件,與nginx和haproxy等七層負載均衡不同的是,它只能實現數據包的轉發和四層一下內容的修改,無法實現反向代理或者修改七層訪問請求。現在LVS已經是 Linux標準內核的一部分,在Linux2.4內核以前,使用LVS時必須要重新編譯內核以支持LVS功能模塊,但是從Linux2.4內核以後,已經完全內置了LVS的各個功能模塊,無需給內核打任何補丁,可以直接使用LVS提供的各種功能。

二、LVS的結構及特點

簡單來說,LVS的結構主要分爲兩層,前端用於接收並調度用戶請求,我們稱之爲Load Balance。用戶請求在經過LB調度後,會被轉發到不同的工作服務器上,這些真正提供服務的服務器被稱爲Real Server。在大部分場景下,Real Server間可能還需要共享存儲,這個可以被稱爲第三層,總體來說結構如下:

                             wKiom1hSh5iQlgzsAADLB575Ljo163.png-wh_50

下面針對LVS的各層次進行說明:

1、  LB層。(Load Blance)

位於整個集羣系統的最前端,有一臺或者多臺負載調度器(LB)組成,LVS模塊就安裝在LB上,而LB的主要作用類似於一個路由器,它含有完成LVS功能所設定的路由轉發表,通過這些轉發表把用戶的請求分發到後端不同的Real Server上。

2、  RS層。(Real Server)

由一組實際運行應用服務的機器組成,Real Server可以是WEB服務器、MAIL服務器、FTP服務器、DNS服務器、視頻服務器中的一個或者多個,每個Real Server之間通過高速的LAN或分佈在各地的WAN相連接。

3、  共享存儲層。(Shared Storage)

爲所有Real Server提供共享存儲空間和內容一致性的存儲區域,在物理上,一般有磁盤陣列設備組成,爲了提供內容的一致性,一般可以通過NFS網絡文件系統共享數據,但是NFS在繁忙的業務系統中,性能並不是很好,此時可以採用集羣文件系統,例如Red hat的GFS文件系統,oracle提供的OCFS2文件系統等。

三、LVS中涉及的概念

         VIP:虛擬IP,用戶所能看到的唯一IP

         RIP:真實IP,也就是Real Server的IP,真正提供數據服務的IP。

         1、負載均衡機制

                   (1)VS/NAT模式

                            類似於網絡中常用到的DNAT功能,它修改請求報文的目的IP地址並轉發至指定Real Server。它的數據流程如下                            wKioL1hSh-KC9AxMAABQ_Iisryc302.png

 

                   (2)VS/DR模式

                            在DR模式中,與NAT模式不同的是,它並不修改請求報文的目的IP,而是修改報文的目的MAC,然後將報文直接轉送至Real Server。響應數據包不再被送回LB,而是由RS直接發送回客戶端。

wKioL1hSiCygrmg7AABRXnaDFBo950.png

                   (3)VS/TUN模式

                            TUN模式與DR模式有很多相同之處,唯一不同點在於,請求報文在LB處並不是修改MAC,而是再包裹一層IP頭,轉發到RealServer。響應數據包不再被送回LB,而是由RS直接發送回客戶端。


 wKiom1hSiGfhjmDTAABPjrewkBY428.png

         2、負載調度算法

                   LVS總共有10種調度算法,分爲兩大類,分別爲靜態算法和動態算法。

                   靜態算法:

(1)       輪詢(rr,Round Robin)

這種算法LB並不考慮其它因素,而是按照列表中RS的順序,依次派發用戶請求(如RS1-->RS2-->RS3-->RS1這種順序)。它是純粹的1:1調度,用戶的請求會被平均分配到每臺RealServer。

(2)       加權輪詢(wrr,Weighted Round Robin)

爲每臺RealServer設置一個權重值,用以區分不同性能服務器對請求的處理能力。LB會根據權重的比值進行請求的轉發,比如RS1、RS2、RS3的權重分別爲2、1、1,那麼LB會以2:1:1的比例平均分配用戶請求。可以認爲當請求到達時,將以RS1àRS1àRS2àRS3àRS1àRS1這種順序進行分配。

(3)       目標地址哈希(Destination Hashing)

destination hash,目的地址哈希。只要對同一個目的IP的請求,就會被轉向同一個Real Server。它主要應用在Cache服務器環境中,但是具體是怎麼應用的還是不清楚。比如,如何定義LVS的VIP

(4)       源地址哈希(Source Hashing)

source hash,源地址哈希。只要來自同一個客戶端的請求,就會被轉向同一個Real Server。這是Client級的負載。他會在director中保存一個哈希表,當有新請求進來時,首先對源IP進行哈希,然後跟哈希表進行對比,如果存在條目,則直接轉發。

動態算法:

  1. 1.       最少鏈接(lc,Least Connections)

通過計算當前後端每個real server的活動連接數和非活動連接數的總數,然後進行對比。

計算公式爲“active*256+inactive

將選用值最小的服務器。

  1. 2.       加權最少鏈接(wlc,Weighted Least Connections)

相比於lc,計算公式發生變化:

(active*256+inactive)/weight

  1. 3.       sed最小期望延遲

相比於wlc,計算公式又發生變化:

(active+1)/weight

它的效果是,最先到來的請求將被分配到權值最大的服務器上。

  1. 4.       nq不排隊算法

相比於sed,如果有臺realserver的連接數=0就直接分配過去,不需要在進行sed運算,在沒有連接數爲0的Rs時,將繼續使用sed算法。

 

  1. 5.       局部性最少鏈接(Locality-Based Least Connections)

LBLC調度算法先根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於其一半的工作負載,則用“最少鏈接”的原則選出一個可用的服務器,將請求發送到該服務器。

  1. 6.       帶複製的基於局部性最少鏈接(Locality-Based Least Connections with Replication)

它與LBLC算法的不同之處是它要維護從一個目標IP地址到一組服務器的映射,而 LBLC算法維護從一個目標IP地址到一臺服務器的映射。對於一個“熱門”站點的服務請求,一臺Cache 服務器可能會忙不過來處理這些請求。這時,LBLC調度算法會從所有的Cache服務器中按“最小連接”原則選出一臺Cache服務器,映射該“熱門”站點到這臺Cache服務器,很快這臺Cache服務器也會超載,就會重複上述過程選出新的Cache服務器。這樣,可能會導致該“熱門”站點的映像會出現在所有的Cache服務器上,降低了Cache服務器的使用效率。

LBLCR調度算法將“熱門”站點映射到一組Cache服務器(服務器集合),當該“熱門”站點的請求負載增加時,會增加集合裏的Cache服務器,來處理不斷增長的負載;當該“熱門”站點的請求負載降低時,會減少集合裏的Cache服務器數目。這樣,該“熱門”站點的映像不太可能出現在所有的Cache服務器上,從而提供Cache集羣系統的使用效率。LBLCR算法先根據請求的目標IP地址找出該目標IP地址對應的服務器組;按“最小連接”原則從該服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器;若服務器超載;則按“最小連接”原則從整個集羣中選出一臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低複製的程度。

在規劃架構時,根據不同的需要選取不同的調度算法。如果不做設置,默認爲wlc。

四、LVS的配置詳解

4.1、NAT模式配置

NAT模式是最簡單的配置模式,適合於較小規模集羣中使用,RS的數量在10臺以下。它無需對RS做任何修改,RS的操作系統可以爲任何類型,只需要將RS的網關指向LB即可。NAT模式可以支持不同端口間的映射,比如vip的80到RIP的8080端口映射,具有較強的靈活性。

wKiom1hSiMbxPrHfAABJNNhAtsg059.jpg

LB的環境

eth0=42.202.144.14

eth1=192.168.1.1

eth0:0(VIP)=42.202.144.15(如果沒有多餘的IP,42.202.144.14也可以)

 

RS的環境

eth0:192.168.1.x

gateway:192.168.1.1

 

LB基礎環境配置

1、   關閉LB的icmp_redirect數據包的發送

echo"0" >/proc/sys/net/ipv4/conf/all/send_redirects
cat       /proc/sys/net/ipv4/conf/all/send_redirects
echo"0" >/proc/sys/net/ipv4/conf/default/send_redirects
cat      /proc/sys/net/ipv4/conf/default/send_redirects
echo"0" >/proc/sys/net/ipv4/conf/eth1/send_redirects
cat       /proc/sys/net/ipv4/conf/eth1/send_redirects


2、   開啓內核路由轉發

echo"1" >/proc/sys/net/ipv4/ip_forward


3、   配置VIP

ifconfig eth1:142.202.144.15 netmask 255.255.255.255 up


 

lvs配置(以http服務爲例)

首先清空lvs的規則條目

ipvsadm -C


(1)    爲lvs指定監聽的VIP

ipvsadm -A -t42.202.144.15:80 -s wlc


(2)    爲lvs指定提供服務器的RS

ipvsadm -a -t 192.168.1.2:80 -m -w 1
ipvsadm -a -t 192.168.1.3:80 -m -w 1
ipvsadm -a -t 192.168.1.4:80 -m -w 1


至此,nat模式配置完成。

 

4.2、DR模式配置

         DR模式在大規模集羣中使用,RS的數量在100臺以內。DR模式需要RS的操作系統支持,需要修改RS的系統參數。由於RS的數據包迴應方式的原因,DR模式不支持端口映射功能,VIP所指定的服務端口,必須和RIP的服務端口相同。DR模式的原理是修改請求數據包的目的MAC地址,所以RS和LB必須在同一個廣播域纔可以生效。

wKiom1hSiLXw7UChAABsxkRF710453.jpg

LB的環境

eth0=42.202.144.14

eth0:0(VIP)=42.202.144.15(如果沒有多餘的地址,VIP使用42.202.144.14也可以,RS上lo:0的地址將相應修改。)

 

RS的環境

eth0=42.202.144.1x

lo:0=42.202.144.15

gateway=42.202.144.1

 

LB基礎環境配置

1、   關閉路由轉發

cat 0 > /proc/sys/net/ipv4/ip_forward


2、   配置VIP地址

ifconfig eth0:0 42.202.144.15 netmask 255.255.255.255 up


RS基礎環境配置

1、   修改arp宣告等級,防止lo:0上的vip地址在網絡啓動時被宣告出去。

cat 2 > /proc/sys/net/ipv4/conf/all/arp_announce
cat 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce


2、   修改arp響應等級,方式lo:0的vip在從eth0口收到arp時產生迴應。

cat 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
cat 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore


3、關閉數據包合法性校驗(如果VIP在lo上,可以不關閉。在TUN模式下必須關閉)

cat 0 > /proc/sys/net/ipv4/conf/all/rp_filter
cat 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter


3、   配置VIP

ifconfig lo:0 42.202.144.15 netmask 255.255.255.255 up

(注意必須是32位掩碼,具體原因請參照arp)

ipvsadm規則配置

ipvsadm-A -t 42.202.144.15:80 -s wlc
ipvsadm-a -t 42.202.144.11 -g -w 1
ipvsadm-a -t 42.202.144.12 -g -w 1
ipvsadm-a -t 42.202.144.13 -g -w 1


至此,DR模式配置結束

3、  TUN模式配置

TUN模式中,RS和LB可以不在同一個廣播域,甚至不在同一個物理位置,RS可以跨國界。TUN模式與DR模式的原理雖然不同,但是它們的配置方式有很多相同之處,比如RS上的配置,TUN仍然不支持端口映射。不過在生產環境,這種模式並不常用,因爲不同運營商之間對網絡的配置不盡相同,有些運營商會檢查RS迴應包的源IP是否合法。從RS上發出的以VIP爲源IP的迴應包有可能被阻攔,比如,VIP在聯通網內,RS在電信網內。這裏還是使用DR模式的拓撲圖,其實RS可以和LB不在同一個網內。

wKiom1hSiNjRq7uXAABrCzNMg_8773.png

LB的環境:

eth0=42.202.144.14

eth0:0(VIP)=42.202.144.15(如果沒有多餘的地址,VIP使用42.202.144.14也可以,RS上lo:0的地址將相應修改。)

 

RS的環境:

eth0=42.202.144.1x

tunl0=42.202.144.15

gateway=42.202.144.1

 

LB基礎環境配置

4、   關閉路由轉發

cat 0 >/proc/sys/net/ipv4/ip_forward


5、   配置VIP地址

ifconfig eth0:0 42.202.144.15netmask 255.255.255.255 up


RS基礎環境配置

4、   修改arp宣告等級,防止lo:0上的vip地址在網絡啓動時被宣告出去。

cat 2 > /proc/sys/net/ipv4/conf/all/arp_announce
cat 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce


5、   修改arp響應等級,方式lo:0的vip在從eth0口收到arp時產生迴應。

cat 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
cat 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore


4、   關閉數據包合法性校驗

cat 0 > /proc/sys/net/ipv4/conf/all/rp_filter
cat 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter


6、   配置VIP

ifconfig tunl0 42.202.144.15 netmask 255.255.255.255 up

(注意必須是32位掩碼,具體原因請參照arp)

ipvsadm規則配置

ipvsadm -A -t 42.202.144.15:80 -s wlc
ipvsadm -a -t 42.202.144.11 -i -w 1
ipvsadm -a -t 42.202.144.12 -i -w 1
ipvsadm -a -t 42.202.144.13 -i -w 1


至此,TUN模式配置結束

五、生產環境中lvs實施

1、確認內核是否支持lvs

[root@com1~]# modprobe -l|grep ipvs
kernel/net/netfilter/ipvs/ip_vs.ko
kernel/net/netfilter/ipvs/ip_vs_rr.ko
kernel/net/netfilter/ipvs/ip_vs_wrr.ko
kernel/net/netfilter/ipvs/ip_vs_lc.ko
kernel/net/netfilter/ipvs/ip_vs_wlc.ko
kernel/net/netfilter/ipvs/ip_vs_lblc.ko
kernel/net/netfilter/ipvs/ip_vs_lblcr.ko
kernel/net/netfilter/ipvs/ip_vs_dh.ko
kernel/net/netfilter/ipvs/ip_vs_sh.ko
kernel/net/netfilter/ipvs/ip_vs_sed.ko
kernel/net/netfilter/ipvs/ip_vs_nq.ko
kernel/net/netfilter/ipvs/ip_vs_ftp.ko


2、安裝軟件

如果可以使用在線安裝方式,請在線安裝。ipvsadm僅僅是一個規則制定工具,真正工作的是內核中的ip_vs模塊,所以ipvsadm工具的版本不重要。

yum install ipvsadm


 

如果沒有在線安裝方式,那麼只能下載源碼包編譯安裝。編譯時需要具備內核的源碼包,這個比較惡。如果這個解決不了也不要編譯了。

 

把這個搞定之後,直接在ipvsadm源碼目錄裏make即可。(沒測試)

3、集羣配置

         在實施環境中,肯定要用腳本來跑,快準狠。

(1)NAT配置腳本

LB配置:

#!/bin/sh
#------mini-HOWTO-setup-LVS-NAT-director----------
 
#set ip_forwardON for vs-nat director (1 on, 0 off).
cat /proc/sys/net/ipv4/ip_forward
echo "1" >/proc/sys/net/ipv4/ip_forward
echo "0" >/proc/sys/net/ipv4/conf/all/send_redirects
cat /proc/sys/net/ipv4/conf/all/send_redirects
echo "0" >/proc/sys/net/ipv4/conf/default/send_redirects
cat /proc/sys/net/ipv4/conf/default/send_redirects
echo "0" >/proc/sys/net/ipv4/conf/eth0/send_redirects
cat /proc/sys/net/ipv4/conf/eth0/send_redirects
/sbin/sysctl -p &> /dev/null
 
#setup VIP
/sbin/ifconfig eth0:0 42.202.144.15 netmask 255.255.255.255 up
 
#clear ipvsadmtables
/sbin/ipvsadm -C
 
#install LVS services with ipvsadm
#add telnet to VIP with rr sheduling
/sbin/ipvsadm -A -t 192.168.2.110:telnet -s rr
 
#first realserver
#forward telnet to realserver 42.202.144.11 using LVS-NAT (-m), with weight=1
/sbin/ipvsadm-a -t 42.202.144.15:telnet -r 42.202.144.11:telnet -m -w 1
#check that realserver is reachable from director
ping -c 1 192.168.1.11
 
#second realserver
#forward telnet to realserver 192.168.1.12 using LVS-NAT (-m), with weight=1
/sbin/ipvsadm -a -t 42.202.144.15:telnet -r 42.202.144.12:telnet -m -w 1
#checking if realserver is reachable from director
ping -c 1 192.168.1.12
 
 
/sbin/ipvsadm


 

(2)DR模式配置腳本

         LB配置

#!/bin/bash
#---------------mini-rc.lvs_dr-director------------------------
#set ip_forward OFF forlvs-dr director (1 on, 0 off)
 
#add ethernet device androuting for VIP 192.168.1.110
/sbin/ifconfig eth0:0 42.202.144.15netmask 255.255.255.255 up
/sbin/route add -host 42.202.144.15dev eth0:0
 
 
#setup_ipvsadm_table
#clear ipvsadm table
/sbin/ipvsadm -C
#installing LVS serviceswith ipvsadm
#add telnet to VIP withround robin scheduling
/sbin/ipvsadm -A -t 42.202.144.15:telnet-s rr
 
#forward telnet torealserver using direct routing with weight 1
/sbin/ipvsadm -a -t 42.202.144.15:telnet-r 42.202.144.11 -g -w 1
#check realserverreachable from director
ping -c 1 42.202.144.11
 
#forward telnet torealserver using direct routing with weight 1
/sbin/ipvsadm -a -t 42.202.144.15:telnet-r 42.202.144.12 -g -w 1
#check realserverreachable from director
ping -c 1 42.202.144.12
 
#displaying ipvsadmsettings
/sbin/ipvsadm


 

 

RS配置

#!/bin/bash
#----------mini-rc.lvs_dr-realserver------------------
 
 
#install_realserver_vip
/sbin/ifconfig lo:0 42.202.144.15netmask 255.255.255.255 up
 
#installing route for VIP42.202.144.15 on device lo:0
/sbin/route add -host 42.202.144.15dev lo:0
 
#hiding interface lo:0,will not arp
 
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
echo 2 >/proc/sys/net/ipv4/conf/eth0(RIP所在的接口)/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 >/proc/sys/net/ipv4/conf/eth0/rp_filter
#----------mini-rc.lvs_dr-realserver------------------


 

(3)TUN模式配置腳本

LB配置

#!/bin/bash
#---------------mini-rc.lvs_dr-director------------------------
#set ip_forward OFF forlvs-dr director (1 on, 0 off)
 
#add ethernet device androuting for VIP 192.168.1.110
/sbin/ifconfig eth0:0 42.202.144.15netmask 255.255.255.255 up
/sbin/route add -host 42.202.144.15dev eth0:0
 
 
#setup_ipvsadm_table
#clear ipvsadm table
/sbin/ipvsadm -C
#installing LVS serviceswith ipvsadm
#add telnet to VIP withround robin scheduling
/sbin/ipvsadm -A -t 42.202.144.15:telnet-s rr
 
#forward telnet torealserver using direct routing with weight 1
/sbin/ipvsadm -a -t 42.202.144.15:telnet-r 42.202.144.11 -g -w 1
#check realserverreachable from director
ping -c 1 42.202.144.11
 
#forward telnet torealserver using direct routing with weight 1
/sbin/ipvsadm -a -t 42.202.144.15:telnet-r 42.202.144.12 -g -w 1
#check realserverreachable from director
ping -c 1 42.202.144.12
 
#displaying ipvsadmsettings
/sbin/ipvsadm


 

 

RS配置

#!/bin/bash
#----------mini-rc.lvs_dr-realserver------------------
#install_realserver_vip
/sbin/ifconfig tunl0 42.202.144.15netmask 255.255.255.255 up
 
#installing route for VIP42.202.144.15 on device lo:0
/sbin/route add -host 42.202.144.15dev tunl0
 
#hiding interface tunl0,will not arp
 
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 >/proc/sys/net/ipv4/conf/eth0(RIP所在的接口)/arp_announce
echo 0 >/proc/sys/net/ipv4/conf/all/rp_filter
echo 0 >/proc/sys/net/ipv4/conf/eth0/rp_filter
#----------mini-rc.lvs_dr-realserver------------------


 

六、其他案例


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