实验简介

    实验一:利用防火墙标记解决轮询错误

    该实验针对 HTTP(80 端口)和 HTTPS(443 端口)独立配置 IPVS 轮询时出现的 “轮询重复 / 不一致” 问题进行优化。

    1. 问题场景:在 RS 上同时开启 HTTP/HTTPS 服务,且在 VS 节点分别为 80、443 端口配置独立 IPVS 轮询规则后,客户端同时访问 HTTP 和 HTTPS 时,请求可能被转发到同一台 RS,未实现跨协议的轮询负载。
    2. 解决思路:取消 80/443 端口的独立 IPVS 规则,改用 iptables 为 VIP 的 80/443 端口数据包统一打标记 6666;基于该标记配置全局 IPVS 轮询规则,将两类协议的数据包纳入同一调度体系。
    3. 效果验证:客户端同时 curl HTTP 和 HTTPS 地址时,请求被分别转发到不同 RS(如 RS2、RS1),解决了跨协议轮询不一致的问题。

    实验二:利用持久连接实现会话粘滞

    该实验核心是基于 IPVS(IP 虚拟服务器)配置会话粘滞,确保客户端请求持续定向到同一台后端真实服务器(RS)。

    1. 配置逻辑:先通过 iptables 在 mangle 表中为目标 VIP(192.168.0.200)的 80/443 端口 TCP 数据包打上标记 6666;再基于该标记配置 IPVS 规则,采用 rr(轮询)调度策略,并通过-p 1开启持久连接(会话粘滞),将标记数据包转发至 192.168.0.10/20 两台 RS。
    2. 效果验证:客户端多次 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

    更多推荐