LVS -- 利用防火墙标签(FireWall Mark)解决轮询错误

DR 模式 (Direct Routing):LVS 的一种转发模式。Director 只修改数据包的目标 MAC 地址,将其直接转发给后端 RS,RS 处理完后直接将响应返回给客户端,性能极高。

FireWall Mark (FWM):一种通过 iptables 给数据包打上的整数标签,用于在 LVS 中对流量进行更精细的分组和调度。

一. 概述

1.1 原理

在 DR 模式下,默认对不同端口(如 80 和 443)的请求是分开调度的,这会导致同一客户端访问同一 VIP 的不同端口时,可能被调度到不同的后端 RS 上。

· 打标记 :在 Director 上,使用 iptables -t mangle 规则,将访问同一 VIP 的不同端口(如 80 和 443)的数据包打上相同的防火墙标记(如 6666)。

· 基于标记调度 :使用 ipvsadm -A -f 6666 创建一个基于该标记的虚拟服务。这样,所有带有此标记的数据包(无论端口是 80 还是 443)都会被视为一个整体,按照同一套调度规则(如 rr 轮询)进行处理,从而保证同一客户端的 HTTP 和 HTTPS 请求被调度到同一台 RS。

1.2 目的

解决 DR 模式下,同一 VIP 不同端口请求被独立调度导致的会话割裂问题,确保同一客户端的相关请求被路由到同一后端服务器。

1.3 适用场景

同一应用同时提供 HTTP(80)和 HTTPS(443)服务,需要保证用户会话一致性。

多个不同端口的服务逻辑上属于一个整体,需要统一调度。

二. 环境设定

2.1 环境流程图

2.2 实验环境

2.3 环境配置

完整环境设定方法已整理并发布到CSDN以下链接中,若需要可跳转查看

https://blog.csdn.net/2401_84184229/article/details/157652660

三. 实现方法

3.1 在rs主机中同时开始http和https两种协议

在RS1中

复制代码
[root@RS1 ~]# dnf install mod_ssl -y
[root@RS1 ~]# systemctl restart httpd

在RS2中

复制代码
[root@RS2 ~]# dnf install mod_ssl -y
[root@RS2 ~]# systemctl restart httpd

3.2 在vsnode中添加https的轮询策略

复制代码
[root@vsnode ~]# cd ../boot
[root@vsnode boot]# ipvsadm -A -t 192.168.221.200:80 -s rr
#添加一个基于 TCP 协议、VIP 为 192.168.221.200:80、调度算法为轮询(rr)的虚拟服务。
[root@vsnode boot]# ipvsadm -a -t 192.168.221.200:80 -r 192.168.221.20 -g
#将真实服务器 192.168.221.20 以 DR 模式(-g)添加到上述 80 端口的虚拟服务中
[root@vsnode boot]# ipvsadm -a -t 192.168.221.200:80 -r 192.168.221.10 -g
[root@vsnode boot]# ipvsadm -A -t 192.168.221.200:443 -s rr
[root@vsnode boot]# ipvsadm -a -t 192.168.221.200:443 -r 192.168.221.20:443 -g
[root@vsnode boot]# ipvsadm -a -t 192.168.221.200:443 -r 192.168.221.10:443 -g
[root@vsnode boot]# ipvsadm -Ln
#以数字格式(不解析域名)列出所有 IPVS 虚拟服务和真实服务器的详细配置
[root@vsnode boot]# systemctl restart ipvsadm.service
#重启 ipvsadm 服务,使配置生效或重新加载

3.3 轮询错误展示

正确轮询应为"curl192.168.221.200"和"curl -k https://192.168.221.200"分别访问到两个不同主机,若访问结果中的主机为同一主机则轮询错误。

在client中

复制代码
[root@client ~]# curl  192.168.221.200;curl -k https://192.168.221.200

3.4 解决方案

使用火墙标记访问vip的80和443的所有数据包,设定标记为6666,然后对此标记进行负载

复制代码
[root@vsnode boot]# iptables -t mangle -A PREROUTING -d 192.168.221.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark  6666
#在 iptables 的 mangle 表中,给目标地址为 192.168.221.200、端口为 80/443 的 TCP 流量打上标记值 6666
[root@vsnode boot]# ipvsadm -A -f 6666 -s rr
#创建一个基于标记(mark)6666 的 LVS 虚拟服务,指定调度算法为轮询(rr)
[root@vsnode boot]# ipvsadm -a -f 6666 -r 192.168.221.10 -g
#将真实服务器 192.168.221.10 以 DR 模式(-g)添加到标记为 6666 的 LVS 虚拟服务中
[root@vsnode boot]# ipvsadm -a -f 6666 -r 192.168.221.20 -g

测试:

在client中

复制代码
[root@client ~]# curl  192.168.221.200;curl -k https://192.168.221.200

四. 结论

防火墙标记技术通过在 Director 上对特定流量(如同一 VIP 的 80 和 443 端口)打上统一的标记(如 6666),并基于此标记创建 LVS 虚拟服务,成功解决了 DR 模式下多端口独立调度导致的轮询错乱问题。它将多个端口的流量抽象为一个逻辑单元,确保了同一客户端的相关请求被一致调度。这不仅是对 LVS 调度粒度的精细化控制,也是在高性能的 DR 模式下,实现应用级会话一致性的有效手段。

相关推荐
考虑考虑6 小时前
数据库中的EXISTS
运维·数据库·后端
Wang's Blog6 小时前
Java框架快速入门: Spring Security+OAuth2之数据库和实体类的RBAC改造
java·数据库·spring
梦想平凡8 小时前
百游棋牌源代码开发搭建教程(十):隔离部署、备份恢复与双端验收
java·前端·javascript·数据库·源代码管理
一个有温度的技术博主8 小时前
Linux 核心命令速查指南:从文件操作到系统运维
linux·服务器
xcLeigh8 小时前
让大模型长出手脚,自己写SQL查数据库(Function Calling初探)
数据库·人工智能·sql·时序数据库·timechoai
yume_sibai9 小时前
06-Rust Web 开发实战(Axum 框架 + 数据库 + JWT 认证 + 中间件 + 部署)
前端·数据库·rust
Winner_hwx9 小时前
华为ICT大赛备赛复习1
服务器·网络·华为
AugustRed10 小时前
Neo4j 图数据库原理 + 应用场景简单介绍
数据库·neo4j
宗介波妞10 小时前
Wireshark 抓取 IEC104 报文:常见异常报文排查与标志位解读
服务器·网络·wireshark
Gl�ria10 小时前
Redis 高可用架构对比
数据库·redis