結構如圖所示
環境準備:
RS1:192.168.27.144
RS1_VIP:10.0.0.100
RS2:192.168.27.145
RS2_VIP:10.0.0.100
VS-DIP:192.168.27.105
VS-VIP:10.0.0.100
此處的router也是Linux服務器:
router_eth0 192.168.27.200
router_eth0:1 10.0.0.200
router_eth1 172.20.0.200
1 配置CIP地址
vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
IPADDR=172.20.0.101
GATEWAY=172.20.0.200
2 配置router的IP地址:
vim /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=192.168.27.200
NETMASK=255.255.255.0
vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
IPADDR=172.20.0.200
cd /etc/sysconfig/network-scripts/
cp ifcfg-eth0 ifcfg-eth0:1
IPADDR=10.0.0.200 #複製後更改如下兩行;
PREFIX=8
3 配置VS服務器IP地址:
IPADDR=192.168.27.105
NETMASK=255.255.255.0
GATEWAY=192.168.27.200
編寫名稱爲lvs_dr_vs的腳本,內容如下
#!/bin/bash
vip='10.0.0.100'
iface='ens37:1'
mask='255.0.0.0'
port='80'
rs1='192.168.27.144'
rs2='192.168.27.145'
scheduler='wrr'
type='-g'
rpm -q ipvsadm &> /dev/null || yum -y install ipvsadm &> /dev/null
case $1 in
start)
ifconfig $iface $vip netmask $mask #broadcast $vip up
iptables -F
ipvsadm -A -t ${vip}:${port} -s $scheduler
ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 3
echo "The VS Server is Ready!"
;;
stop)
ipvsadm -C
ifconfig $iface down
echo "The VS Server is Canceled!"
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
bash lvs_dr_vs.sh start #執行腳本
4 配置RS服務器的地址以及腳本;
vim /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=192.168.27.144
NETMASK=255.255.255.0
GATEWAY=192.168.27.200
編寫名稱爲lvs_dr_vs.sh的腳本,內容如下
#!/bin/bash
vip=10.0.0.100
mask='255.0.0.0'
dev=lo:1
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $dev $vip netmask $mask #broadcast $vip up
#route add -host $vip dev $dev
echo "The RS Server is Ready!"
;;
stop)
ifconfig $dev down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "The RS Server is Canceled!"
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
bash lvs_dr_vs.sh start #執行腳本
5 第二臺RS服務器與第一臺一樣;
vim /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=192.168.27.145
NETMASK=255.255.255.0
GATEWAY=192.168.27.200
編寫名稱爲lvs_dr_vs的腳本,內容如下
#!/bin/bash
vip=10.0.0.100
mask='255.0.0.0'
dev=lo:1
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #忽略arp廣播,不給予迴應
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #儘量避免將接口信息向非直接連接網絡進行通告
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $dev $vip netmask $mask #broadcast $vip up
#route add -host $vip dev $dev
echo "The RS Server is Ready!"
;;
stop)
ifconfig $dev down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "The RS Server is Canceled!"
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
bash lvs_dr_vs.sh start #執行腳本
6 在客戶端訪問驗證即可;(默認支持長連接模式)
實現LVS-DR的https調度
1 在RS服務器分別操作
yum install mod_ssl #此處使用自定義證書,安裝這個包就附帶證書
2 安裝完成後重啓httpd服務
systemctl restart httpd #重啓後會發現多了一個443的端口
3 在VS服務器上操作,添加集羣443端口
ipvsadm -A -t 10.0.0.100:443 -s rr
ipvsadm -a -t 10.0.0.100:443 -r 192.168.27.144:443 -g #-g代表dr模式
ipvsadm -a -t 10.0.0.100:443 -r 192.168.27.145:443 -g
4 在CIP的服務器上面進行測試
curl -k https://10.0.0.100
5 此時在VS服務器上面就有兩個VS集羣策略,內容如下
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.100:80 wrr
-> 192.168.27.144:80 Route 1 0 0
-> 192.168.27.145:80 Route 3 0 0
TCP 10.0.0.100:443 rr
-> 192.168.27.144:443 Route 1 0 0
-> 192.168.27.145:443 Route 1 0 0
1 問題:http協議與https協議本質上就是一個服務,但lvs根據端口號區分,所以要分別訪問分別調度
解答:將80端口和443端口貼上同一個標籤,使用以下命令
1 在VS服務器上操作
iptables -t mangle -A PREROUTING -d 10.0.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 10
#-t:指定防火牆表,打標籤要指定mangle表
#-A:指定防火牆鏈,VS服務器要轉發請求
#-d:目標IP地址,此處爲VIP地址
#-p:指定協議類型
#-m multiport:表示啓用多端口擴展
#MARK --set-mark:使用標籤並且更改標籤值爲10
2 ipvsadm -A -f 10 -s rr
#-A:設置集羣環境
#-f:使用標籤模式
#10:標籤名稱
#-s:指定算法類型
ipvsadm -a -f 10 -r 192.168.27.144 -g
ipvsadm -a -f 10 -r 192.168.27.145 -g
3 ipvsadm -ln #查看策略會顯示以下內容
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 10 rr
-> 192.168.27.144:0 Route 1 0 0
-> 192.168.27.145:0 Route 1 0 0
2 問題:客戶端的第一次請求到達後端某一個RS服務器之後,在接下來的訪問中希望響應的服務器是第一次響應的那臺,或者在多長時間內響應的服務器始終唯一
解答:實現持久連接;(持久連接:在一定時間內,同一個客戶端發來的請求始終爲一臺服務器響應,與調度算法無關,默認360秒)
1 在VS服務器上操作,接着上面的問題繼續操作;
ipvsadm -E -f 10 -s rr -p [timeout]
#-p:開啓持久連接,後面也可以手動指定時間[timeout]
ipvsadm -ln #再次查看,就會多出"persistent 360"的字樣
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 10 rr persistent 360
-> 192.168.27.144:0 Route 1 0 0
-> 192.168.27.145:0 Route 1 0 0
2 每客戶端持久:端口寫0,無論什麼端口都往同一個地點調度
1 ipvsadm -A -t 10.0.0.100:0 -s rr -p
ipvsadm -a -t 10.0.0.100:0 -r 192.168.27.144 -g
ipvsadm -a -t 10.0.0.100:0 -r 192.168.27.145 -g