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

相关推荐
这个DBA有点耶4 小时前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
这个DBA有点耶6 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技7 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend8 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
ClouGence11 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
你好潘先生13 小时前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
先吃饱再说1 天前
存储的进化:从 MySQL 到浏览器缓存,数据到底住在哪?
数据库
Nturmoils1 天前
字段太多看不全,ksql 的展开模式和输出控制怎么用
数据库·后端
Databend1 天前
Agent 轨迹分析与归因的数据工程实践
大数据·数据库·agent
这个DBA有点耶1 天前
SQL改写进阶:标量子查询的“隐形代价”与消除实战
数据库·mysql·架构