1、前言
前面学习了lvs集群的类型、应用和配置,那么接着我们来学习下lvs的FWM和持久连接。
2、Lvs之FWM
FWM,firewall mark是借助于防火墙标记来分类报文,而后Lvs根据此防火墙标记来将相应报文归类到指定的集群服务中。使用Lvs的FWM可将多个不同的应用使用同一个集群服务来进行调度。
报文的firewall mark是在报文进入到director进行PREROUTING时打上的指定标记,随后lvs就根据此mark标记来进行调度,下图为Lvs在director如何处理报文的流程图:
在Director 上搭标记的访问为使用下述命令在iptables的mangle表中匹配指定的报文,并添加相应的mark:
# iptables -t mangle -A PREROUTING -d $vip -p $proto --dport $port -j MARK --set-mark MARK_NUM
随后再使用下述命令标记定义的集群服务:
# ipvsadm -A -f MARK_NUM [options]
下面我们来以实例演示下Lvs的FWM用法:
在RS1、RS2 上其启用http、httpsweb服务,结合FWM和lvs在director上将80和443端口服务统一调度同一个集群服务上。
a)配置RS
安装nginx:
[root@RS1 ~]# yum install -y nginx
此处需要事先自签https的证书,此处不再详细描述,可参考https://www.jianshu.com/p/5b8fa3b82d33 进行证书签发生成。
编辑https配置文件:
[root@RS1 ~]# vim /etc/nginx/conf.d/https.conf
server {
listen 443 ssl;
ssl on;
ssl_certificate /etc/nginx/nginx.crt;
ssl_certificate_key /etc/nginx/nginx.key;
ssl_session_timeout 5m;
}
编辑生成nginx页面:
[root@RS1 ~]# vim /usr/share/nginx/html/nginx.htm
This is RS1 10.10.10.11
关闭firewalld:
[root@RS1 ~]# systemctl stop firewalld
重复上述步骤配置RS2。
b)配置director
配置iptables标记相应的报文:
[root@director ~]# iptables -t mangle -I PREROUTING -d 192.168.0.99 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 3
配置ipvs规则:
[root@director ~]# ipvsadm -A -f 3 -s rr
[root@director ~]# ipvsadm -a -f 3 -r 10.10.10.11 -m
[root@director ~]# ipvsadm -a -f 3 -r 10.10.10.12 -m
开启路由转发功能:
[root@director ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
[root@director ~]# iptables -F
在客户端验证结果:
[root@client ~]# for i in {1..10};do curl http://192.168.0.99/nginx.html;done
This is RS2 10.10.10.12
This is RS1 10.10.10.11
This is RS2 10.10.10.12
This is RS1 10.10.10.11
This is RS2 10.10.10.12
This is RS1 10.10.10.11
This is RS2 10.10.10.12
This is RS1 10.10.10.11
This is RS2 10.10.10.12
This is RS1 10.10.10.11
[root@client ~]# for i in {1..10};do curl -k https://192.168.0.99/nginx.html;done
This is RS2 10.10.10.12
This is RS1 10.10.10.11
This is RS2 10.10.10.12
This is RS1 10.10.10.11
This is RS2 10.10.10.12
This is RS1 10.10.10.11
This is RS2 10.10.10.12
This is RS1 10.10.10.11
This is RS2 10.10.10.12
This is RS1 10.10.10.11
成功把相应的标记报文分配到指定的集群服务中进行请求响应。至此,管理员只需要在director上定义好标记的iptables规则,即可把响应的请求服务调度到指定的集群服务上。
3、Lvs之持久连接
Lvs的持久连接的作用是指,无论使用哪一种调度方法,都能保证在指定的时间范围内,将来来自于同一个IP的请求始终被调度到同一个RS服务器上。
Lvs的持久连接的配置命令格式为:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
其中-p表示启动持久连接功能,同时也可设置持久连接的超时时长,默认超时时长为300s。
Lvs的持久连接按照配置的规则类型的不同可分为:
每端口持久PPC:每个端口对应定义为一个集群服务,每集群服务单独调度;
每防火墙标记持久PFWM:基于防火墙标记定义集群服务;可实现将多个端口上的应用统一调度,即所谓的port Affinity;
每客户端持久PCC:基于0端口定义集群服务,即将客户端对所有应用的请求统统调度至后端主机,必须定义为持久模式;
上述每个类型的配置格式如下:
- 端口持久PPC:
[root@director ~]# ipvsadm -A -t 192.168.0.99:80 -s rr -p
- 防火墙标记持久PFWM:
[root@director ~]# ipvsadm -A -f 3 -s rr -p
客户端持久PCC:
#注意0端口和-p选项需同时使用
[root@director ~]# ipvsadm -A -t 192.168.0.99:0 -s rr -p
接着我们在上面FWM的实例的director上启动持久连接测试其对应的效果:
修改director上的ipvs规则:
[root@director ~]# ipvsadm -E -f 3 -s rr -p 60
[root@director ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
#持久连接功能以生效,并设置timeout为60s
FWM 3 rr persistent 60
-> 10.10.10.11:0 Masq 1 0 0
-> 10.10.10.12:0 Masq 1 0 0
接着在客户端上再次测试访问:
[root@client ~]# for i in {1..10};do curl http://192.168.0.99/nginx.html;done
This is RS2 10.10.10.12
This is RS2 10.10.10.12
This is RS2 10.10.10.12
This is RS2 10.10.10.12
This is RS2 10.10.10.12
This is RS2 10.10.10.12
This is RS2 10.10.10.12
This is RS2 10.10.10.12
This is RS2 10.10.10.12
This is RS2 10.10.10.12
[root@client ~]# for i in {1..10};do curl -k https://192.168.0.99/nginx.html;done
This is RS2 10.10.10.12
This is RS2 10.10.10.12
This is RS2 10.10.10.12
This is RS2 10.10.10.12
This is RS2 10.10.10.12
This is RS2 10.10.10.12
This is RS2 10.10.10.12
This is RS2 10.10.10.12
This is RS2 10.10.10.12
This is RS2 10.10.10.12
此次测试的请求都被分配到了同一个RS,说明持久连接已经生效。