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

相关推荐
疯狂吧小飞牛10 小时前
GPG基础指令
linux·服务器·网络
C++ 老炮儿的技术栈10 小时前
volatile使用场景
linux·服务器·c语言·开发语言·c++
哆啦A梦158810 小时前
Springboot整合MyBatis实现数据库操作
数据库·spring boot·mybatis
Zzzzmo_11 小时前
【MySQL】JDBC(含settings.xml文件配置/配置国内镜像以及pom.xml文件修改)
数据库·mysql
hjxu201611 小时前
【OpenClaw 龙虾养成笔记一】在远程服务器,使用Docker安装OpenClaw
服务器·笔记·docker
FirstFrost --sy12 小时前
MySQL内置函数
数据库·mysql
2401_8796938712 小时前
将Python Web应用部署到服务器(Docker + Nginx)
jvm·数据库·python
reembarkation12 小时前
光标在a-select,鼠标已经移出,下拉框跟随页面滚动
java·数据库·sql
eggwyw12 小时前
MySQL-练习-数据汇总-CASE WHEN
数据库·mysql
星轨zb12 小时前
通过实际demo掌握SpringSecurity+MP中的基本框架搭建
数据库·spring boot·spring security·mp