LVS負載均衡集羣詳解

LVS實現負載均衡集羣
 
一、首先介紹相關知識點
 
1、LVS系統結構
-->負載均衡層,這一層在整個集羣的最前端,它由一個或多個調度服務器(Director Server)組成,LVS軟件就運行在調度服務器上,它的作用是將客戶端的請求根據某種算法分發到各個應用服務器上。
-->應用服務器層,這一層由多個應用服務器(Real Server)組成,並且每個應用服務器提供相同的服務,它處理接受通過調度服務器分發的客戶端請求。
-->共享存儲層,這一層是爲了保持應用服務器的數據一致性而存在的。(本文不涉及此內容)
 
2、LVS負載均衡的類型
-->VS/NAT,通過網絡地址轉換的方式實現,在這種方式中調度服務器將改寫客戶端發送的請求報文中的目標IP地址和端口,將其改寫爲應用服務器的IP地址和服務端口,此時調度服務器充當一個類似與路由器使用DNAT靜態映射的功能,同樣應用服務器響應的數據包也是經過調度服務器轉換之後發送給客戶端,此種實現方式由於入站和出站數據包都要經過調度服務器,所以其工作效率並不高,往往也成爲整個LVS系統的瓶頸。
-->VS/TUN,通過IP隧道技術實現,IP隧道是將一個IP報文封裝到另一個IP報文中的技術,這可以使得目標爲一個IP地址的數據報文能被封裝和轉發到另一個IP地址,當調度服務器把請求分發給應用服務器後,由應用服務器直接返回數據給客戶端,而且調度服務器和應用服務器可以在不同網絡中。
-->VS/DR,通過直接路由方式實現,這種方式的連接調度和管理與VS/NAT和VS/TUN一樣,不過報文的轉發方法不同,它改變的是客戶端請求報文的目標MAC地址,所以調度服務器和應用服務器必須在同一物理網絡中,也就是處於同一廣播域中,這種和TUN一樣調度服務器只處於客戶端的請求可一極大降低調度服務器的負載。
 
3、三種方法的優缺點比較
        1>VS/NAT的優點:後端應用服務器可以運行在任何支持TCP/IP的操作系統,服務器組可以使用私有IP地址;缺點:當後端服務器節點數目增加到一定數量時,調度服務器本身將成爲系統的瓶頸
         2>VS/TUN的優點:這種模式下調度服務器只處理客戶端的請求報文,所以處理能力將大大提高;缺點:由於通過IP隧道技術實現,所以所有的服務器必須支持IP Tunneling或IP Encapsulation協議
         3>VS/DR的優點:與VS/TUN一樣,這種模式下調度服務器僅處理客戶端請求報文,且沒有IP隧道的開銷,所以其轉發效率是最高的;缺點:調度服務器和應用服務器必須在同一物理網絡中
           
4、LVS負載調度算法
1>靜態調度算法:
-->rr:輪詢:該算法會按客戶端的請求順序均勻分配到各個應用服務器,不考慮其他因素。
-->wrr:加權輪詢:根據應用服務器的能力強弱設置相應的權值,基於rr的基礎權值大的應用服務器將會被分配更多的客戶端請求。
-->dh:目標地址哈希:此算法應用於應用服務器爲緩存服務器的場合,該算法儘可能的把相同的請求或同一用戶的請求轉發到同一個緩存服務器,可以提高緩存命中率。
-->sh:源地址哈希:該算法類似於dh算法,但將請求的源地址作爲基準,儘可能的把關於同一用戶的請求轉發相同的服務器。
2>動態調度算法:
-->lc:最少連接:根據連接的多少來分配客戶端的請求,計算標準爲(活動連接x256+非活動連接),計算結果數值小的將接受下次訪問請求。
-->wlc:加權最少連接:增加了權重的計算,lc算法的計算標準除以權重,計算結束數值小的將接受下次訪問請求,是最常用的算法也是LVS默認的算法。
-->sed:最少期望延遲:同樣根據連接來計算,但忽略了非活動連接的影響,計算標準爲(活動連接+1)x256/權重,這種算法是爲了避免應用服務器能力強的而不會最先獲得客戶端的請求響應權。
-->nq:永不排隊:判斷標準與sed相同,但是在其基礎上如果有空閒的應用服務器則優先分配,這種算法是爲了在有限客戶端請求的情況下,權重小的應用服務器無法獲得客戶端請求的響應權,而過於空閒。
-->lblc:基於局部性的最少連接:該算法類似與dh算法,根據請求的目標IP地址找出改目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,則將請求發送給該服務器,若服務器不在線或者超載,則用“最少連接”原則選出一個可用的服務器並將請求發送到該服務器,主要用於Cache集羣系統。
-->lblcr:帶複製的基於局部性的最少連接:此種算法與lblc類似,但是它維護的是一組服務器而不是lblc算法那樣的一個服務器,該算法根據請求的目標IP地址找出該目標IP地址對應的服務器組,按“最少連接”原則從服務器組中選出一臺服務器,若該服務器沒有超載則將請求轉發到該服務器,若服務器超載,則按“最少連接”原則從整個集羣系統中選出一臺服務器加入到服務器組中,將請求轉發到該服務器,同時,當該服務器組中有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低複製程度,同樣主要用於Cache集羣系統。
說明:之所以分爲靜態調度算法和動態調度算法是因爲,靜態調度算法是按照固定的算法標準計算不考慮其他因素,如果服務器不在線或在已達負載上限則客戶端的請求將不會被轉發,而動態調度算法則都設置了一系列的條件,來動態的分配客戶端的請求,除非所有的應用服務器都不在線或都達到負載上限,否則客戶端的請求都將會得到轉發。
 
二、實例演示使用LVS,DR模型實現2臺web服務器的負載均衡
 
實驗環境拓撲如下圖:
 
拓撲分析:共有三臺服務器,一臺作爲Director放置在前端,客戶端的請求均被髮送至Director的VIP192.168.56.200,也就是本例中的eth1:0,其DIP爲192.168.56.103,另外兩臺爲Real Server負責處理從Director轉發來的客戶端請求,其地址分別爲192.168.56.101和192.168.56.102。
 
1、配置前的準備工作
-->Director端配置:
1>、配置網卡的子接口地址爲VIP,在本實驗中爲192.168.56.200
[root@director ~]# ifconfig eth1:0 192.168.56.200 up
使之永久生效也可以編輯配置文件:
[root@director ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1:0
添加如下內容:
DEVICE=eth1:0
ONBOOT=yes
IPADDR=192.168.56.200
NETMASK=255.255.255.0
       
        2>、添加路由條目使訪問eth1:0接口的數據包響應時都通過eth1:0發送
        [root@director ~]# route add -host 192.168.56.200 dev eth1:0
 
        3>、開啓路由轉發功能
        [root@director ~]# echo 1 > /proc/sys/net/ipv4/ip_forward  
 
-->Real Server端配置:
1>、配置參數禁止通過eth1網卡響應關於配置在其lo:0接口上的地址的arp請求,以避免出提示IP衝突的問題
[root@node1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@node1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@node1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@node1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
使之永久生效編輯配置文件:
[root@node1 ~]# vim /etc/sysctl.conf 
添加如下內容:
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@node1 ~]# sysctl -p //使配置生效
2>、添加lo:0接口並配置VIP
[root@node1 ~]# ifconfig lo:0 192.168.56.200 netmask 255.255.255.255 broadcast 192.168.56.200 up
使之永久生效可編輯配置文件:
[root@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
添加如下內容:
DEVICE=lo:0
IPADDR=192.168.56.200
NETMASK=255.255.255.255
BROADCAST=192.168.56.200
ONBOOT=yes
3>、添加路由條目使訪問lo:0接口的數據包響應時都通過lo:0發送
[root@node1 ~]# route add -host 192.168.56.200 dev lo:0
 
4>、安裝httpd並創建index.html文件
[root@node1 ~]# yum -y install httpd
[root@node1 ~]# echo node1 > /var/www/html/index.html
[root@node1 ~]# service httpd start
在node2節點上配置與node1相同的設置,但要把網頁文件index.html的內容該爲node2以方便測試。
說明:關於httpd的配置僅作測試使用詳細配置請參考其他文檔
 
2、安裝ipvsadm軟件包
[root@director ~]# rpm -ivh /media/cdrom/Cluster/ipvsadm-1.24-13.el5.i386.rpm 
 
3、通過ipvsadm配置
[root@director ~]# ipvsadm -A -t 192.168.56.200:80 -s rr //定義集羣服務爲80端口HTTP服務,並指定算法和VIP地址
[root@director ~]# ipvsadm -a -t 192.168.56.200:80 -r 192.168.56.101 -g //定義集羣節點並指定使用DR模型 
[root@director ~]# ipvsadm -a -t 192.168.56.200:80 -r 192.168.56.102 -g //定義集羣節點node2
 
4、測試負載均衡效果
通過瀏覽器訪問VIP地址測試效果
通過測試發現由於算法爲rr輪詢算法刷新頁面時會在node1和node2節點之間來回轉換。
 
三、配置持久連接
在一些特殊場合可能需要服務器來保存客戶端連接的session,如果按上邊的方法配置當客戶端刷新頁面時會由於連接被定向到另外一臺Real Server而造成session丟失,這個時候就需要調度器能夠讓這個連接一直被定向給同一臺Real Server,這就是持久連接,配置其實很簡單:
 
[root@director ~]# ipvsadm -E -t 192.168.56.200:80 -s rr -p 1800 //指定-E參數修改原來的定義集羣服務器的內容後加-p選項跟上保持連接的時間,這裏指定爲1800秒,例如當客戶端第一次訪問時被定向到node2節點,那麼在接下來的1800秒內這個客戶端發送的所有請求都會被定向到node2節點,如果在1800秒超時後客戶端沒有斷開連接則默認延遲2分鐘,如果2分鐘後客戶端還沒有斷開連接則繼續延遲2分鐘,直到斷開連接。
 
測試效果:
可以看到不管怎麼刷新一直訪問的node2節點。
 
四、配置持久防火牆標記連接
當httpd服務同時提供了http和https時即使使用了上邊的持久連接,你會發現當從http協議轉爲https時會被定向到另外一個節點,因爲上邊的持久連接只能根據端口來實現,這時持久防火牆標記連接就可以發揮作用了,配置依然很簡單:
 
[root@director ~]# iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 6
[root@director ~]# iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 6
以上兩條iptables規則把訪問80和443端口的數據包打上標記爲6
[root@director ~]# ipvsadm -C //清空原有的設置
[root@director ~]# ipvsadm -A -f 6 -s rr -p 1800
[root@director ~]# ipvsadm -a -f 6 -r 192.168.56.101 -g
[root@director ~]# ipvsadm -a -f 6 -r 192.168.56.102 -g
執行了以上命令後就可以使客戶端在由http轉向https時依然被定向爲同一臺Real Server。
 
五、ipvsadm命令相關參數和選項說明
-->集羣服務相關
-A:添加集羣服務
-t:後跟VIP地址加端口號,指定TCP協議
-u:後跟VIP地址加端口號,指定UDP協議
-f:後跟防火牆標記
-s:後跟算法,指定調度算法
-E:修改集羣服務,用法和-A一樣
-D:後跟-t|-u|-f IP:PORT,刪除已定義的集羣服務
-->Real Server相關
-a:添加Real Server
-t:後跟VIP地址加端口號,指定TCP協議
-u:後跟VIP地址加端口號,指定UDP協議
-r:後跟RIP,指定Real Server的IP地址
-w:後跟正整數,指定該節點權重
-g:定義使用DR模式(默認)
-i:定義使用TUN模式
-m:定義使用NAT模式
-e:修改已定義的Real Server,用法和-a一樣
-d:後跟-t|-u|-f VIP:PORT -r RIP,刪除已定義的Real Server
-->全局相關
-L:顯示ipvsadm的配置
-n:不解析主機和服務
--stats:顯示數據包和數據大小的總數
--rate:顯示數據包和數據大小的平均值
-S:保存配置至某文件中,也可使用ipvsadm-save命令
-R:將保存至文件中的配置應用起來,也可使用ipvsadm-restore命令
 
六、快速配置腳本
director腳本:
----------------------------------------------腳本內容開始----------------------------------------------
#!/bin/bash
VIP=192.168.56.200
RIP1=192.168.56.101
RIP2=192.168.56.102
# . /etc/init.d/functions
case $1 in
start)
    /sbin/ifconfig eth0:0 $VIP netmask 255.255.255.255 broadcast $VIP up
    /sbin/route add -host $VIP dev eth0:0
    /sbin/ipvsadm -C
    /sbin/ipvsadm -A -t $VIP:80 -s wlc
    /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1
    /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 1
    touch /var/lock/subsys/ipvsadm &> /dev/null
    echo "ipvsadm is running"
    ;;
stop)
    /sbin/ipvsadm -C
    /sbin/ipvsadm -Z
    /sbin/ifconfig eth0:0 down
    rm -rf /var/lock/subsys/ipvsadm &> /dev/null
    echo "ipvsadm is stoped"
    ;;
status)
    if [ -e /var/lock/subsys/ipvsadm ];then
       echo "ipvsadm is running"
    else
       echo "ipvsadm is stoped"
    fi
    ;;
*)
    echo "Usage: $0 {start|stop|status}"
    ;;
esac
----------------------------------------------------腳本內容結束--------------------------------------------
Real Server腳本:
----------------------------------------------------腳本內容開始--------------------------------------------
#!/bin/bash
#
VIP=192.168.56.200
case $1 in
start)
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
    /sbin/route add -host $VIP dev lo:0
    echo "Real Server is running"
    ;;
stop)
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    /sbin/ifconfig lo:0 down
    echo "Real Server is stoped"
    ;;
status)
    if /sbin/ifconfig lo:0 | grep addr &> /dev/null;then
       echo "Real Server is running"
    else
       echo "Real Server is stoped"
    fi
    ;;
*)
    echo "Usage:$0 {start|stop|status}"
    ;;
esac
------------------------------------------------------腳本內容結束--------------------------------------------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章