• 三臺機器,系統:centos7.3
• 分發器,也叫調度器(簡寫爲dr)
• 172.16.22.220php
• rs1
• 172.16.22.221html
• rs2
• 172.16.22.222nginx
• vip
• 172.16.22.219web
ipvsadm的安裝略算法
drshell
vim /usr/local/sbin/lvs_dr.sh #!/bin/bash echo 1 > /proc/sys/net/ipv4/ip_forward ipv=/usr/sbin/ipvsadm vip=172.16.22.219 rs1=172.16.22.221 rs2=172.16.22.222 #注意這裏的網卡名字 ifconfig eth0:2 $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip dev eth0:2 $ipv -C $ipv -A -t $vip:80 -s wrr $ipv -a -t $vip:80 -r $rs1:80 -g -w 1 $ipv -a -t $vip:80 -r $rs2:80 -g -w 1
chmod +x !$ #對腳本添加執行權限 !$ #運行腳本
(1)ARP響應行爲和ARP解析行爲內核參數:
1)arp_annouce定義通告級別
0:默認級別,將本地的任何接口上的配置的地址都在網絡中通告
1:儘可能避免向本主機上的其餘網卡進行網絡通訊,特殊狀況下其餘接口也能夠
2:老是使用最佳網絡地址接口(僅使用定義的網卡接口在同網絡通訊)
2)arp_ignore定義響應級別(0-8九個級別),響應時忽略方式
0:都全都響應
1:只對從本接口進入的請求響應,且本接口地址是個網絡地址
… …
註釋:通常使用arp_annouce=2,arp_ignore=1vim
vim /usr/local/sbin/lvs_rs.sh
#!/bin/bash vip=172.16.22.219 #把vip綁定在lo上,是爲了實現rs直接把結果返回給客戶端 ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip lo:0 #如下操做爲更改arp內核參數,目的是爲了讓rs順利發送mac地址給客戶端 #參考文檔www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html 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
chmod +x !$ #對腳本添加執行權限
!$
#運行腳本
運行剛纔創建的shell腳本,dr,rs1,rs2都要運行各自的腳步centos
curl -I 172.16.22.219
~ Aiker$ curl -I 172.16.22.219 HTTP/1.1 200 OK Server: nginx Date: Wed, 28 Mar 2018 14:42:09 GMT Content-Type: text/html Content-Length: 1326 Last-Modified: Wed, 26 Apr 2017 08:03:46 GMT Connection: keep-alive Vary: Accept-Encoding ETag: "59005462-52e" Accept-Ranges: bytes ~ Aiker$ curl -I 172.16.22.219 HTTP/1.1 301 Moved Permanently Server: nginx Date: Wed, 28 Mar 2018 14:42:14 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive X-Powered-By: PHP/5.6.34 location: forum.php [root@test220 ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.22.219:80 wrr -> 172.16.22.221:80 Route 1 2 0 -> 172.16.22.222:80 Route 1 2 0 [root@test220 ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.22.219:80 wrr -> 172.16.22.221:80 Route 1 5 0 -> 172.16.22.222:80 Route 1 6 0
經過防火牆標記來定義lvs
1.FWM防火牆標記功能
防火牆標記能夠實現多個集羣服務綁定爲同一個,實現統一調度;將共享一組RS的集羣服務統一進行定義
FWM基於iptables的mangle表實現防禦牆標記功能,定義標記作策略路由bash
2.FWM定義集羣的方式
(1)在director上netfilter的mangle表的PREROUTING定義用於"打標"的規則服務器
[root@test220~]#iptables -t mangle -A PREROUTING -d $vip -p $protocol --dport $port -j MARK--set-mark #
$vip:VIP地址
$protocol:協議
$port:協議端口
(2)基於FWM定義集羣服務:
[root@test220~]#ipvsadm -A -f # -s scheduler
3.實例演示
[root@test220~]# iptables -t mangle -A PREROUTING -d 172.16.22.219 -p tcp --dport 80 -j MARK--set-mark 5 [root@test220~]# ipvsadm -A -f 5 -s rr [root@test220~]# ipvsadm -a -f 5 -r 172.16.22.221 -g [root@test220~]# ipvsadm -a -f 5 -r 172.16.22.222 -g
1.lvs persistence功能
不管ipvs使用何種scheduler,其都可以實如今指定時間範圍內始終未來自同一個ip地址的請求發往同一個RS;實現方式和lvs調度的十種算法無關,經過lvs持久鏈接模板(hash表)實現,當超過自定義的可持節鏈接時長候再根據LVS算法自己進行調度。
ipvsadm命令中-p選項實現,在-p後不指定具體數字(單位:秒),默認爲300,到時候會自動延長2分鐘,對於web自己就是15秒
2.模式
(1)每端口持久(PPC)
客戶端對同一服務端口發起請求,會基於該服務的端口實現請求在一段時間內對同一RS服務器持久鏈接;
例如:有兩臺主機作爲RS服務器作http和hssh的兩種服務的集羣,僅http作每端口持久,Client請求會實現綁定在,可是22號端口請求不會綁定在同一臺RS
(2)每客戶端持久(PCC):定義tcp或udp協議的0號端口爲集羣服務端口
director會將用戶的任何請求都識別爲集羣服務,並向RS進行調度;同一客戶端的請求任何端口都發往同一臺第一次選定的RS服務器
(3)每防火牆標記持久(PFWMC)
將兩個或兩個以上服務經過防火牆打標綁定在一塊兒,這些服務的請求實現同時定向與同一臺RS服務器,服務綁定同一RS
lvs-dr模式下以rr算法綁定http和https服務
[root@test220~]# iptables -t mangle -A PREROUTING -d 172.16.22.220 -p tcp --dport 80 -j MARK--set-mark 99 [root@test220~]# iptables -t mangle -A PREROUTING -d 172.16.22.220 -p tcp --dport 443 -j MARK--set-mark 99 [root@test220~]# ipvsadm -A -f 99 -s rr -p [root@test220~]# ipvsadm -a -f 99 -r 172.16.22.221 -g [root@test220~]# ipvsadm -a -f 99 -r 172.16.22.222 -g
附錄:LVS-DR類型RS腳本示例
#!/bin/bash vip=172.16.22.219 interface="lo:0" case$1 in start) echo1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo2 > /proc/sys/net/ipv4/conf/all/arp_announce echo2 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig$interface $vip broadcast $vip netmask 255.255.255.255 up routeadd -host $vip dev $interface ;; stop) echo0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo0 > /proc/sys/net/ipv4/conf/all/arp_announce echo0 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig$interface down ;; status) ififconfig lo:0 |grep $vip &> /dev/null; then echo"ipvs is running." else echo"ipvs is stopped." fi ;; *) echo"Usage: `basename $0` {start|stop|status}" exit1 esac