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間可能還需要共享存儲,這個可以被稱爲第三層,總體來說結構如下:
下面針對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。它的數據流程如下
(2)VS/DR模式
在DR模式中,與NAT模式不同的是,它並不修改請求報文的目的IP,而是修改報文的目的MAC,然後將報文直接轉送至Real Server。響應數據包不再被送回LB,而是由RS直接發送回客戶端。
(3)VS/TUN模式
TUN模式與DR模式有很多相同之處,唯一不同點在於,請求報文在LB處並不是修改MAC,而是再包裹一層IP頭,轉發到RealServer。響應數據包不再被送回LB,而是由RS直接發送回客戶端。
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. 最少鏈接(lc,Least Connections)
通過計算當前後端每個real server的活動連接數和非活動連接數的總數,然後進行對比。
計算公式爲“active*256+inactive”
將選用值最小的服務器。
2. 加權最少鏈接(wlc,Weighted Least Connections)
相比於lc,計算公式發生變化:
(active*256+inactive)/weight
3. sed最小期望延遲
相比於wlc,計算公式又發生變化:
(active+1)/weight
它的效果是,最先到來的請求將被分配到權值最大的服務器上。
4. nq不排隊算法
相比於sed,如果有臺realserver的連接數=0就直接分配過去,不需要在進行sed運算,在沒有連接數爲0的Rs時,將繼續使用sed算法。
5. 局部性最少鏈接(Locality-Based Least Connections)
LBLC調度算法先根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於其一半的工作負載,則用“最少鏈接”的原則選出一個可用的服務器,將請求發送到該服務器。
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端口映射,具有較強的靈活性。
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必須在同一個廣播域纔可以生效。
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不在同一個網內。
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------------------
六、其他案例