LVS DR模型詳解

spacer.gif013954373.png
DR模型的特點:
1.director必須與realserver位於同一個網絡。
2.realserver可以使用公網ip地址,便於遠程管理與配置。
3.director只負責處理入站請求。而響應報文則由realserver直接返回給client端。大大節省director的資源
4.不能做端口映射
整個工作原理如下:
客戶端通過路由器將請求交給director的VIP。director接收請求,將通過相應的算法將請求轉發給相應的realserver。在轉發的過程中,會修改請求包的目的mac地址,目的ip地址不變。realserver接收請求,並直接響應客戶端。這時,便出現一個問題:director此時與realserver位於同一個網絡中,當director直接將請求轉發給realserver時,realserver檢測到該請求包的目的ip是vip而並非自己,便會丟棄,而不會響應。。爲了解決這個問題,我們需要在所有realserver上都配上VIP。這時會出現第二個問題:director與realserver位於同一個網絡中,當出現多個vip時,通過arp廣播,整個網絡必然混亂,我們無法保證客戶端的請求一定會發往director。爲保證當客戶端請求抵達網絡時,只有director來響應請求。我們需要realserver忽略對vip的arp請求,並且在arp通告時,不通告vip地址。我們需要配置如下兩個內核參數:
arp_ignore
當一臺主機某個接口接收到arp請求時,這臺機上的ip地址是否通過該接口響應給對應請求的限制級別。簡單來說,當這臺主機有多塊網卡,或者有多個ip地址時,是否通過該接口將所有ip地址響應給對應的請求。
0:不作任何限制。將所有本機的ip地址都響應給對應請求。
1:當請求的ip就配置在本接口上時,才予以響應。換句話說,就是隻響應當前接口的ip地址。
arp_announce
當一臺主機加入到一個新的網絡。會發出ARP通告,向網絡中其他主機通告自己的ip地址及mac等信息。arp_anounce就用來限制通告的級別。當這臺主機有多塊網卡或者多個ip地址時,是否通過某一個接口將所有ip地址通告給該網絡中的主機。
0:不作任何限制。從任意接口通告所有ip地址。
1:儘可能避免通告非本接口上的ip。
2:只通知本接口的ip。非本接口的ip不予通告。
由此我們亦可知,在realserver上配置vip時顯然也不能配置的物理接口的虛接口上,而應該配置在loopback上。

配置示例:
1)實驗環境
lvs負載調度器:eth0:172.16.16.173/24,VIP eth0:0 172.16.16.172
web服務器池:節點1-節點2:172.16.16.177-178/24

2)配置負載調度器
a.配置虛擬IP地址(VIP)
ifconfig eth0:0 172.16.16.172 broadcast 172.16.16.172 netmask 255.255.255.0 up   #在eth0上配置並啓動VIP
route add -host 172.16.16.172 dev eth0:0   #特殊路由,當客戶端請求的ip爲vip時,則由eth0:0響應。


b.調整/proc響應參數
echo 1 > /proc/sys/net/ipv4/ip_forward    #開啓路由轉發

echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects

echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects

send_redirects:icmp發送重定向。經查閱相關資料,開啓此選項有一定的危險性,容易被人僞造icmp重定向包發起***。若當前director並非充當路由或網關,建議關閉。默認爲開啓,0爲關閉。


c.配置負載分配策略
service ipvsadm stop
ipvsadm -A -t 172.16.16.172:80 -s wlc
ipvsadm -a -t 172.16.16.172:80 -r 172.16.16.177 -g -w 1
ipvsadm -a -t 172.16.16.172:80 -r 172.16.16.178 -g -w 1
service ipvsadm save
chkconfig ipvsadm on


3)配置節點服務器
a.配置虛擬IP地址
ifconfig lo:0 172.16.16.172 broadcast 172.16.16.172 netmask 255.255.255.255 up
/sbin/route add -host 172.16.16.172 dev lo:0

b.調整/proc響應參數

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

echo 1 > /proc/sys/net/ipv4/conf/default/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/default/arp_announce

echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

此幾項配置即是用於限制arp請求及arp通告


c.安裝httpd,進行測試。


可將整個lvs dr模型下的director和realserver上的配置寫成腳本,如下:

director啓動腳本:

#/bin/bash
#
#LVS for VS/DR
. /etc/rc.d/init.d/functions
#
VIP=172.16.16.172
RIP1=172.16.16.177
RIP2=172.16.16.178
PORT=80
#
case $1 in
start)
#clear all iptables policy
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -Z
#configure VIP
/sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask=255.255.255.0
/sbin/route add -host $VIP dev eth0:1
#enalbe ip_forward
echo 1 > /proc/sys/net/ipv4/ip_forward

echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects

echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects


#clear all ipvsadm rules/services.
/sbin/ipvsadm -C
#Add an IP virtual service for VIP 172.16.16.172port 80
/sbin/ipvsadm -A -t $VIP:$PORT  -s wlc
/sbin/ipvsadm -a -t $VIP:$PORT -r $RIP1 -g -w 1
/sbin/ipvsadm -a -t $VIP:$PORT -r $RIP2 -g -w 1
/bin/touch /var/lock/subsys/ipvsadm > /dev/null
;;
stop)
#Reset ipvsadm
/sbin/ipvsadm -C
/sbin/ifconfig eth0:1 down
/bin/rm -f /var/lock/subsys/ipvsadm > /dev/null
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ];then
echo "ipvs is stopped..."
else
echo "ipvs is running..."
/sbin/ipvsadm -L -n
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
;;
esac

realserver啓動腳本:
case $1 in
start)
#start LVS-DR on this real server machine.
/sbin/ifconfig lo down
/sbin/ifconfig lo up
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.0 up
/sbin/route add -host $VIP dev lo:0
;;
stop)
#stop LVS-DR on this real server machine.
/sbin/ifconfig lo:0 down
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
;;
status)
#Sstatus of LVS-DR real server.
islothere=`/sbin/ifconfig lo:0 | grep $VIP`
isrothere=`netstat -rn | grep "lo:0" | grep $VIP`
if [ !"islothere" -o !"isrothere" ]; then
echo "LVS-DR real server Stopped."
else
echo "LVS-DR real server Running"
fi
;;
*)
# Invalid entry.
echo "Usage: $0 (start|stop|status)"
exit 1
;;
esac

以上爲第一種配置方法,也是官方的常規配置方法。
在第一種配置方法中,我們提到在所有realserver的loopback上配置vip來實現接收director端的請求轉發,然後通過修改內核參數來忽略arp應答與通告。那我作一個假設。假設我不在realserver上配置vip,我依然希望realserver能夠接收director轉發來的請求。前文我們提到,如果realserver不配置vip,默認會將director轉發過來的請求包丟棄。那麼除了在loopback端配置vip,還有沒有其他的辦法讓realserver接收來自director轉發的請求包?
這個時候我們需要用到iptables的重定向策略。我們不需要在realserver的loopback上配置vip,也不需要去修改內核參數來忽略arp的響應與通告。director上的配置同上並不發生改變,realserver的配置如下:
iptables -t nat -A PREROUTING -d 172.16.16.172 -p tcp --dport 80 -j REDIRECT
整個配置過程完成,是不是比上一種方法更爲簡單?


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章