实验简介
实验一:利用防火墙标记解决轮询错误
该实验针对 HTTP(80 端口)和 HTTPS(443 端口)独立配置 IPVS 轮询时出现的 "轮询重复 / 不一致" 问题进行优化。
- 问题场景:在 RS 上同时开启 HTTP/HTTPS 服务,且在 VS 节点分别为 80、443 端口配置独立 IPVS 轮询规则后,客户端同时访问 HTTP 和 HTTPS 时,请求可能被转发到同一台 RS,未实现跨协议的轮询负载。
- 解决思路:取消 80/443 端口的独立 IPVS 规则,改用 iptables 为 VIP 的 80/443 端口数据包统一打标记 6666;基于该标记配置全局 IPVS 轮询规则,将两类协议的数据包纳入同一调度体系。
- 效果验证:客户端同时 curl HTTP 和 HTTPS 地址时,请求被分别转发到不同 RS(如 RS2、RS1),解决了跨协议轮询不一致的问题。
实验二:利用持久连接实现会话粘滞
该实验核心是基于 IPVS(IP 虚拟服务器)配置会话粘滞,确保客户端请求持续定向到同一台后端真实服务器(RS)。
- 配置逻辑 :先通过 iptables 在 mangle 表中为目标 VIP(192.168.0.200)的 80/443 端口 TCP 数据包打上标记 6666;再基于该标记配置 IPVS 规则,采用 rr(轮询)调度策略,并通过
-p 1开启持久连接(会话粘滞),将标记数据包转发至 192.168.0.10/20 两台 RS。 - 效果验证 :客户端多次 curl 访问 VIP 时,请求始终被转发到同一台 RS(如 RS1),实现了会话粘滞;同时可通过
ipvsadm -Lnc观察连接状态,确认会话的持续性。
核心差异
- 实验一聚焦 "跨协议轮询一致性",通过统一防火墙标记整合 HTTP/HTTPS 调度,解决独立配置导致的轮询错误;
- 实验二聚焦 "会话粘滞",通过持久连接让同一客户端请求固定到一台 RS。
利用火墙标记解决轮询错误
1.在RS主机中同时开始http和https两种协议
[root@RS1 yxs]# dnf install mod_ssl -y
[root@RS1 yxs]# systemctl restart httpd
[root@RS2 yxs]# dnf install mod_ssl -y
[root@RS2 yxs]# systemctl restart httpd
2.在vsnode中添加https的轮询策略
[root@vsnode yxs]# ipvsadm -A -t 192.168.0.200:80 -s rr
[root@vsnode yxs]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20 -g
[root@vsnode yxs]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10 -g
[root@vsnode yxs]# ipvsadm -A -t 192.168.0.200:443 -s rr
[root@vsnode yxs]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:443 -g
[root@vsnode yxs]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g
[root@vsnode yxs]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.200:80 rr
-> 192.168.0.10:80 Route 1 0 0
-> 192.168.0.20:80 Route 1 0 0
TCP 192.168.0.200:443 rr
-> 192.168.0.10:443 Route 1 0 0
-> 192.168.0.20:443 Route 1 0 0
3.轮询错误展示
[root@client yxs]# curl 192.168.0.200;curl -k https://192.168.0.200
RS1 - 192.168.0.10
RS1 - 192.168.0.10
[root@client yxs]# curl 192.168.0.200;curl -k https://192.168.0.200
RS2 - 192.168.0.20
RS2 - 192.168.0.20
#当上述设定完成后http和https是独立的service,轮询会出现重复问题
4.解决方案
使用火墙标记访问vip的80和443的所有数据包,设定标记为6666,然后对此标记进行负载
[root@vsnode yxs]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666
[root@vsnode yxs]# ipvsadm -A -f 6666 -s rr
[root@vsnode yxs]# ipvsadm -a -f 6666 -r 192.168.0.10 -g
[root@vsnode yxs]# ipvsadm -a -f 6666 -r 192.168.0.20 -g
#测试:在客户端
[root@client yxs]# curl 192.168.0.200;curl -k https://192.168.0.200
RS2 - 192.168.0.20
RS1 - 192.168.0.10
利用持久连接实现会话粘滞
1.设定ipvs调度策略
[root@vsnode yxs]# ipvsadm -A -f 6666 -s rr -p 1
[root@vsnode yxs]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 6666 rr persistent 1
-> 192.168.0.10:0 Route 1 0 0
-> 192.168.0.20:0 Route 1 0 0
2.测试
[root@client yxs]# curl 192.168.0.200
RS2 - 192.168.0.20
[root@client yxs]# curl 192.168.0.200
RS2 - 192.168.0.20
3.观察
[root@vsnode yxs]# watch -n 1 ipvsadm -Lnc
IPVS connection entries
pro expire state source virtual destination
TCP 01:56 FIN_WAIT 172.25.254.99:42420 192.168.0.200:80 192.168.0.20:80
IP 00:57 ASSURED 172.25.254.99:0 0.0.26.10:0 192.168.0.20:0
TCP 01:54 FIN_WAIT 172.25.254.99:46216 192.168.0.200:80 192.168.0.20:80
TCP 01:55 FIN_WAIT 172.25.254.99:46222 192.168.0.200:80 192.168.0.20:80