請求由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
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