1、前言
前面学习了lvs集群的类型、应用和配置,那么接着我们来学习下lvs的FWM和持久连接。
2、Lvs之FWM
FWM,firewall mark是借助于防火墙标记来分类报文,而后Lvs根据此防火墙标记来将相应报文归类到指定的集群服务中。使用Lvs的FWM可将多个不同的应用使用同一个集群服务来进行调度。
报文的firewall mark是在报文进入到director进行PREROUTING时打上的指定标记,随后lvs就根据此mark标记来进行调度,下图为Lvs在director如何处理报文的流程图:
Lvs报文处理(图片来源网络)
在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
<h1>This is RS1 10.10.10.11</h1>
关闭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
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS1 10.10.10.11</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS1 10.10.10.11</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS1 10.10.10.11</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS1 10.10.10.11</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS1 10.10.10.11</h1>
[root@client ~]# for i in {1..10};do curl -k https://192.168.0.99/nginx.html;done
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS1 10.10.10.11</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS1 10.10.10.11</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS1 10.10.10.11</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS1 10.10.10.11</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS1 10.10.10.11</h1>
成功把相应的标记报文分配到指定的集群服务中进行请求响应。至此,管理员只需要在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
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS2 10.10.10.12</h1>
[root@client ~]# for i in {1..10};do curl -k https://192.168.0.99/nginx.html;done
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS2 10.10.10.12</h1>
<h1>This is RS2 10.10.10.12</h1>
此次测试的请求都被分配到了同一个RS,说明持久连接已经生效。
网友评论