• 三台机器,系统: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