LVS的DR模式

DR模式:

請求由LVS接受,由真實提供服務的服務器(RealServer, RS)直接返回給用戶,返回的時候不通過LVS。html

DR模式下須要LVS和綁定同一個VIP(RS經過將VIP綁定在loopback實現)。linux

一個請求過來時,LVS只須要將網絡幀的MAC地址修改成某一臺RS的MAC,該包就會被轉發到相應的RS處理,注意此時的源IP和目標IP都沒變,LVS只是作了一下移花接木。c++

RS收到LVS轉發來的包,鏈路層發現MAC是本身的,到上面的網絡層,發現IP也是本身的,因而這個包被合法地接受,RS感知不到前面有LVS的存在。vim

而當RS返回響應時,只要直接向源IP(即用戶的IP)返回便可,再也不通過LVS。後端

DR模式是性能最好的一種模式。bash

 
 
1. ARP廣播會產生的問題
 
當客戶端發起訪問VIP 對應的域名的請求時,根據網絡通訊原理會產生ARP 廣播,由於 負載均衡器和真實的服務器在同一網絡而且VIP設置在集羣中的每一個節點上此時集羣內的真實服務器會嘗試回答來自客戶端計算機的查找VIP的ARP廣播,這就會產生問題,你們都說我是"VIP"
 
2. 爲了達到負載均衡的目的,必須想法辦讓真實服務器忽略來自客戶端計算機的ARP廣播請求
 
虛擬ip地址的廣播地址是它自己,子網掩碼是255.255.255.255。 爲何要這樣呢?由於有若干機器要使用同一個ip地址,
用自己作廣播地址和把子網掩碼設成4個255就不會形成ip地址衝突了,不然lvs將不能正常轉發訪問請求。
方法一:在真實服務器上設置lo 忽略ARP 廣播
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 
 
 若是VIP 是設置在真實服務器的非lo接口,那麼作以下設置
net.ipv4.conf.eth N.arp_ignore = 1 
net.ipv4.conf.eth N.arp_announce = 2 (N 爲網卡接口)
net.ipv4.conf.all.arp_ignore = 1 
net.ipv4.conf.all.arp_announce = 2 
 
方法二: 隱藏真實服務器上VIP 的網絡接口
 
#to activate the hidden feature 
 echo 1 > /proc/sys/net/ipv4/conf/all/hidden
#to make lo:0 not arp, put lo here 
 echo 1 > /proc/sys/net/ipv4/conf/<interface_name>/hidden
 
三、session
客戶端與服務端的通訊,一次請求可能包含多個TCP包,LVS必須保證同一鏈接的TCP包,必須被轉發到同一臺RS,不然就亂套了。爲了確保這一點,LVS內部維護着一個Session的Hash表,經過客戶端的某些信息能夠找到應該轉發到哪一臺RS上。
 
 
參考資料:http://www.cnblogs.com/likehua/archive/2014/06/19/3796849.html
--------------------------------------------------------------------------------
實例列舉:

DR模式中LVS主機與實際服務器都有一塊網卡連在同一物理網段上。服務器

IP分配網絡

VIP:10.10.3.170session

RIP1:10.10.3.140負載均衡

RIP2:10.10.3.141

一、安裝所需的依賴包

yum install -y wget make kernel-devel gcc gcc-c++ libnl* libpopt* popt-static

二、建立一個軟連接,防止後面編譯安裝ipvsadm時找不到系統內核

ln -s /usr/src/kernels/2.6.32-358.18.1.el6.x86_64/ /usr/src/linux

三、下載安裝ipvsadm

wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
tar zxvf ipvsadm-1.26.tar.gz
cd ipvsadm-1.26
make && make install

四、編寫並運行腳本(LVS服務器的腳本)

vi lvs.sh
複製代碼
#!/bin/bash

VIP=10.10.3.170
RIP1=10.10.3.140
RIP2=10.10.3.141

/etc/rc.d/init.d/functions

logger $0 called with $1
case "$1" in

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

#Clear IPVS table
/sbin/ipvsadm -C
#set LVS
/sbin/ipvsadm -A -t $VIP:80 -s rr
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g

#Run LVS
/sbin/ipvsadm
;;
stop)
echo "close LVS Directorserver"
echo "0" >/proc/sys/net/ipv4/ip_forward
/sbin/ipvsadm -C
/sbin/ifconfig eth0:0 down
;;
*)

echo "Usage: $0 {start|stop}"
exit 1
esac
複製代碼

注:/sbin/ipvsadm -A -t $VIP:80 -s rr (rr表明輪詢,還有分配方式)

/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g (-g表明DR模式,還有其餘模式)

五、給腳本加權限,並執行

chmod +x lvs.sh
chmod 755 /etc/rc.d/init.d/functions ./lvs.sh start

六、配置後端的WEB服務器腳本

vi realserver.sh
複製代碼
#!/bin/bash
# 2013-09-07 by kgdxpr
VIP=10.10.3.170
/etc/rc.d/init.d/functions
case "$1" in
start)
echo " start LVS of REALServer"
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
#受限廣播,它不被路由發送,但會被送到相同物理網絡段上的全部主機IP地址的網絡字段和主機字全爲1就是地址255.255.255.255
/sbin/route add -host $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 ;; stop) /sbin/ifconfig lo:0 down echo "close LVS Directorserver" 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 "Usage: $0 {start|stop}" exit 1 esac
複製代碼

 七、給腳本加權限,並執行 

chmod +x realserver.sh chmod 755 /etc/rc.d/init.d/functions
./realserver.sh start

--------------------------------------------------------------------------
Realserver VIP自動設置腳本:

#vim /etc/init.d/vipd

#!/bin/bash
# Script to start LVS DR virtual server.
# description: LVS DR virtual server
# chkconfig: 345 85 15
.  /etc/rc.d/init.d/functions
VIP1=10.1.1.18
VIP2=10.1.1.19
host=`/bin/hostname`
case "$1" in
start)
       # Start LVS-DR virtual server on this machine.
        /sbin/ifconfig lo down
        /sbin/ifconfig lo up
        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:1 $VIP1 broadcast $VIP1 netmask 255.255.255.255 up
        /sbin/ifconfig lo:2 $VIP2 broadcast $VIP2 netmask 255.255.255.255 up
        /sbin/route add -host $VIP1 dev lo:1
        /sbin/route add -host $VIP2 dev lo:2
;;
stop)
        # Stop LVS-DR virtual server loopback device(s).
        /sbin/ifconfig lo:1 down
        /sbin/ifconfig lo:2 down
        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
;;
status)
        # Status of LVS-DR virtual server.
        islothere1=`/sbin/ifconfig lo:1 | grep $VIP1`
        islothere2=`/sbin/ifconfig lo:2 | grep $VIP2`
        isrothere1=`netstat -rn | grep "lo" | grep $VIP1`
        isrothere2=`netstat -rn | grep "lo" | grep $VIP2`
        if [ ! "$islothere1" -o ! "$isrothere1" ];then
            echo "LVS-DR virtual server 10.1.1.18 Stopped."
        else
            echo "LVS-DR virtual server 10.1.1.18 Running."
        fi
        if [ ! "$islothere2" -o ! "$isrothere2" ];then
            echo "LVS-DR virtual server 10.1.1.19 Stopped."
        else
            echo "LVS-DR virtual server 10.1.1.19 Running."
        fi
;;
*)
            # Invalid entry.
            echo "$0: Usage: $0 {start|status|stop}"
            exit 1
;;
esac


#chkconfig --add vipd
View Code
相關文章
相關標籤/搜索