搭建LVS負載均衡測試環境

dbasdk發表於2014-09-12
實現負載均衡有很多種方式
土豪直接F5,效能最好,價格最貴

沒錢也可以使用Apache,Nginx 工作在網路的第四層,雖然效能一般,但是很靈活,比如可以將80埠對映到真實伺服器的8080埠.
http://blog.itpub.net/29254281/viewspace-1070221/
    
還有一種選擇LVS ,它工作在網路的第三層,效能較好,非常穩定.
但是它不能實現埠的重新對映.因為在網路的第三層,並不清楚埠的資訊。

下面的實驗搭建了一個LVS負載均衡測試環境,採用DR的方式。

客戶端訪問LVS前置機
這個請求如下
源MAC(client mac) 目標MAC(DR mac) 源IP(client IP) 目標IP(DR IP,VIP)

LVS前置機會將報文改寫之後轉發真實的伺服器
改寫如下
源MAC(client mac) 目標MAX(真實伺服器MAC) 源IP(client IP) 目標IP(DR IP,VIP)

因為真實的伺服器將VIP繫結到了環回地址,所以會處理這個請求,並返回響應的報文.
網路層的源目對掉
源MAC(真實伺服器MAC) 目標MAC(client mac) 源IP(DR IP,VIP) 目標IP(client IP)

所以LVS DR的本質就是網路層的欺騙。

實驗採用VirtualBox虛擬機器,並且配置內部網路,關閉SELinux和防火牆


首先,在LVS DR前置機上安裝ipvsadm命令
yum install ipvsadm -y

然後配置兩臺真實伺服器(RealServer)的Http服務
yum install httpd -y
service httpd start
chkconfig httpd on
並分別改寫/var/www/html/index.html的內容為"real server 1"和"real server 2"

然後在兩臺真實伺服器上執行如下的指令碼
vim lvs_real.sh

#!/bin/bash  
# description: Config realserver lo and apply noarp  

SNS_VIP=192.168.16.199
source /etc/rc.d/init.d/functions
case "$1" in

start)
       ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
       /sbin/route add -host $SNS_VIP dev lo:0
       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
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"  
       ;;

stop)
       ifconfig lo:0 down
       route del $SNS_VIP >/dev/null 2>&1
       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
       echo "RealServer Stoped"  
       ;;

*)

       echo "Usage: $0 {start|stop}"  
       exit 1
esac
exit 0


最後,在DR前置機上執行如下指令碼
vim lvs_dr.sh

#!/bin/bash
VIP1=192.168.16.199
RIP1=192.168.16.3
RIP2=192.168.16.4

case "$1" in
start)
        echo " start LVS of DirectorServer"
        /sbin/ifconfig eth1:0 $VIP1 broadcast $VIP1 netmask 255.255.255.255 broadcast $VIP1 up
        /sbin/route add -host $VIP1 dev eth1:0
        echo "1" >/proc/sys/net/ipv4/ip_forward

        /sbin/ipvsadm -C
        /sbin/ipvsadm -A -t $VIP1:80 -s rr
        /sbin/ipvsadm -a -t $VIP1:80 -r $RIP1:80 -g -w 1
        /sbin/ipvsadm -a -t $VIP1:80 -r $RIP2:80 -g -w 1
        /sbin/ipvsadm
        ;;
stop)
        echo "close LVS Directorserver"
        echo "0" >/proc/sys/net/ipv4/ip_forward
        /sbin/ipvsadm -C
        /sbin/ifconfig eth1:0 down
        ;;
*)
        echo "Usage: $0 {start|stop}"
        exit 1
esac

通過client訪問LVS前置伺服器,可以看到已經實現了負載均衡的效果。


關於LVS的排程演算法,轉載自張逸群的部落格
http://www.zhangyiqun.net/56.html

1. 大鍋飯排程(Round-Robin Scheduling RR)
rr – 純輪詢方式,比較垃圾。把每項請求按順序在真正伺服器中分派。

2. 帶權重的大鍋飯排程(Weighted Round-Robin Scheduling WRR)
wrr -帶權重輪詢方式。把每項請求按順序在真正伺服器中迴圈分派,但是給能力較大的伺服器分派較多的作業。

3. 誰不幹活就給誰分配(Least-Connection LC)
lc – 根據最小連線數分派


4. 帶權重的誰不幹活就給誰分配(Weighted Least-Connections WLC 預設)

wlc – 帶權重的。機器配置好的權重高。


5. 基於地區的最少連線排程(Locality-Based Least-Connection
Scheduling LBLC)

lblc – 快取伺服器叢集。基於本地的最小連線。把請求傳遞到負載小的伺服器上。


6. 帶有複製排程的基於地區的最少連線排程(Locality-Based Least-Connection Scheduling with Replication Scheduling LBLCR)

lblcr – 帶複製排程的快取伺服器叢集。某頁面快取在伺服器A上,被訪問次數極高,而其他快取伺服器負載較低,監視是否訪問同一頁面,如果是訪問同一頁面則把請求分到其他伺服器。


7. 目標雜湊排程(Destination Hash Scheduling DH)

realserver中繫結兩個ip。ld判斷來者的ISP商,將其轉到相應的IP。


8. 源雜湊排程(Source Hash Scheduling SH)

源地址雜湊。基於client地址的來源區分。(用的很少)


9. 最短的期望的延遲(Shortest Expected Delay Scheduling SED)

基於wlc演算法。這個必須舉例來說了
ABC三臺機器分別權重123 ,連線數也分別是123。那麼如果使用WLC演算法的話一個新請求進入時它可能會分給ABC中的任意一個。使用sed演算法後會進行這樣一個運算
A:(1+1)/1
B:(1+2)/2
C:(1+3)/3
根據運算結果,把連線交給C 。


10.最少佇列排程(Never Queue Scheduling NQ)

無需佇列。如果有臺realserver的連線數=0就直接分配過去,不需要在進行sed運算。

遇到的問題..
這個實驗看著簡單,做了足足半個月,但是還有一些不明白的問題,可能和網路知識的匱乏有關係。

在DR前置機上不能通過VIP訪問真實的伺服器
在DR前置機上執行命令,報錯如下

檢視ipvsadm,連線狀態是SYN_RECV


一開始我使用了三臺虛擬機器,卡在這個地方很長時間。
後來偶然發現,用第四臺虛擬機器就可以正常訪問了..


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1267388/,如需轉載,請註明出處,否則將追究法律責任。

相關文章