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 模式下,实现应用级会话一致性的有效手段。

相关推荐
jiayou641 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤2 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
Sinclair2 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
Rockbean3 天前
用40行代码搭建自己的无服务器OCR
服务器·python·deepseek
爱可生开源社区3 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
茶杯梦轩3 天前
CompletableFuture 在 项目实战 中 创建异步任务 的核心优势及使用场景
服务器·后端·面试
随逸1773 天前
《从零搭建NestJS项目》
数据库·typescript
海天鹰4 天前
【免费】PHP主机=域名+解析+主机
服务器
加号34 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏4 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker