LVS -- 部署DR模式集群案例

一.DR模式简介

1.1 背景

在早期的负载均衡方案中,比如 NAT 模式,所有请求和响应都必须经过调度器,这就像一个只有一个收银台的超市,高峰期收银台会成为瓶颈,导致整个系统响应变慢。随着用户量和访问量的激增,这种模式已经无法满足高并发场景的需求。为了解决这个性能瓶颈,DR(直接路由)模式应运而生,它的目标是让响应流量绕过调度器,直接从后端服务器返回给用户。

1.2 原理

DR 模式的工作原理可以用 "快递中转站" 来打比方:

  1. 请求阶段:用户(寄件人)把包裹(请求)发给快递中转站(调度器 VIP)。中转站不拆开包裹,只在包裹上贴一个新的快递面单(重新封装 MAC 地址),上面写着负责派送的快递员(后端 RS)的地址,然后直接转发给该快递员。
  2. 响应阶段:快递员(后端 RS)派送完成后,不把签收单带回中转站,而是直接拍照(响应数据包)发给寄件人(用户),这样就省去了回传的时间。

整个过程中,包裹的收件人、寄件人信息(源 IP 和目标 IP)都没有变,只有快递面单(MAC 地址)被修改,这保证了效率。

1.3 目的

  • 提升性能:让响应流量不经过调度器,解决了 NAT 模式下调度器的瓶颈问题,能承载更大的并发量。
  • 保证网络稳定:通过 ARP 抑制技术(修改内核参数或使用 arptables),确保后端服务器不会对外暴露 VIP,避免网络中出现 MAC 地址冲突,就像给快递员统一了工服,防止用户直接找到快递员而绕过中转站。
  • 简化部署:后端服务器可以使用私网 IP,无需公网地址,降低了网络配置的复杂度和成本。

二.环境设定

2.1 环境流程图

注:

  • vsnode 服务器采用双网卡:一个仅主机网卡连接路由节点,另一个仅主机网卡与后端 RS 服务器相连,分别承载 VIP 和 DIP 网络。
  • RS 服务器采用仅主机网卡:与 vsnode 相连,不直接连接外网,保障后端服务的网络安全性。
  • RS 服务器配置 :回环网卡(lo)绑定虚拟 IP(VIP 192.168.221.200),网关指向 vsnode 的 DIP(192.168.221.50),确保响应流量按预期路径转发。
  • 路由节点作用 :通过 NAT 网卡连接外网,作为整个集群的对外入口,将用户请求转发至 vsnode 的 VIP(192.168.221.200)。

2.2 实验环境

2.3 环境配置

2.3.1创建并开启虚拟机

(注意对应的网卡数量及类型)

注:添加并更改网卡教程

添加

更改

2.3.2 环境配置命令

1.设定网络

1)在router中

复制代码
[root@router ~]# vmset.sh eth0 192.168.35.100 router
[root@router ~]# vmset.sh eth1 192.168.221.100 router noroute

2)在vsnode中

复制代码
[root@vsnode ~]# vmset.sh  eth0 192.168.221.50 vsnode  norouter
复制代码
#编辑 eth0 网卡
[root@vsnode ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection

[connection]
id=eth0
type=ethernet
interface-name=eth0


[ipv4]
method=manual
address1=192.168.221.50/24,192.168.221.100

复制代码
[root@vsnode ~]# cd  /etc/NetworkManager/system-connections/
[root@vsnode system-connections]# cp -p eth0.nmconnection lo.nmconnection
#复制 eth0 的配置文件为回环网卡 lo 的配置文件,保留原文件的权限和属性

[root@vsnode system-connections]# vim lo.nmconnection
编辑回环网卡 lo 的配置文件
[connection]
id=lo
type=loopback
interface-name=lo


[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.221.200/32   #添加虚拟 IP(VIP)192.168.221.200/32

复制代码
[root@vsnode system-connections]# nmcli connection reload   
#加载所有连接配置,使修改后的配置生效

[root@vsnode system-connections]# nmcli connection up eth0  #激活 eth0 网卡
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
[root@vsnode system-connections]# nmcli connection up lo    #激活 lo 网卡

检测:

复制代码
[root@vsnode system-connections]# route -n

3)在client中

复制代码
[root@client ~]# vmset.sh  eth0 192.168.35.99 client
复制代码
[root@client ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0


[ipv4]
method=manual
address1=192.168.35.99/24,192.168.35.100
dns=8.8.8.8

[root@client ~]# nmcli connection reload
[root@client ~]# nmcli connection up eth0

检测:

复制代码
[root@client ~]# ping 192.168.221.200
复制代码
[root@client ~]# route -n

4)在RS1中

复制代码
[root@RS1 ~]# vmset.sh  eth0 192.168.221.10 RS1 noroute
复制代码
[root@RS1 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.221.10
[root@RS1 ~]# nmcli connection reload
[root@RS1 ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
[root@RS1 ~]# route -n
复制代码
[root@RS1 ~]# cd /etc/NetworkManager/system-connections/
[root@RS1 system-connections]#  cp -p eth0.nmconnection lo.nmconnection
[root@RS1 system-connections]# vim lo.nmconnection

[connection]
id=lo
type=loopback
interface-name=lo

[ethernet]

[ipv4]
address1=127.0.0.1/8
address2=192.168.221.200/32
method=manual
复制代码
[root@RS1 system-connections]# nmcli connection reload
[root@RS1 system-connections]# nmcli connection up lo
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/8)
[root@RS1 system-connections]# ip a

在RS2中

复制代码
[root@RS2 ~]# vmset.sh eth0 192.168.221.20 RS2 noroute

复制代码
[root@RS2 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.221.100
[root@RS2 ~]# nmcli connection reload
[root@RS2 ~]# nmcli connection up eth0
[root@RS2 ~]# route -n
复制代码
[root@RS2 ~]# cd /etc/NetworkManager/system-connections/
[root@RS2 system-connections]# cp -p eth0.nmconnection lo.nmconnection
[root@RS2 system-connections]# vim lo.nmconnection
[root@RS2 system-connections]# vim lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo

[ethernet]

[ipv4]
address1=127.0.0.1/8
address2=192.168.221.200/32
method=manual
复制代码
[root@RS2 system-connections]# nmcli connection reload
[root@RS2 system-connections]# nmcli connection up lo

2.设定访问业务真实数据

在RS1中

复制代码
[root@RS1 ~]# yum install httpd -y
#通过 yum 包管理器自动安装 Apache(httpd)网页服务软件,-y 表示安装过程中所有确认提示都自动回答 "是",无需手动确认

[root@RS1 ~]# echo RS1 - 192.168.221.10 > /var/www/html/index.html
#将文本 "RS1 - 192.168.221.10" 写入 Apache 服务的默认网页文件 /var/www/html/index.html,作为测试页面内容

[root@RS1 ~]# systemctl enable --now httpd
#同时完成两个操作 ------ 将 httpd 服务设置为开机自启(enable),并立即启动当前的 httpd 服务(--now)

[root@RS1 ~]# curl 192.168.221.10
#在本地通过 curl 命令访问本机 192.168.221.10 的 80 端口(httpd 默认端口),验证网页服务是否能正常返回测试页面内容

在RS2中

复制代码
[root@RS2 system-connections]# yum install httpd -y
[root@RS2 system-connections]# echo RS1 - 192.168.221.20 > /var/www/html/index.html
[root@RS2 system-connections]# systemctl enable --now httpd

三. 实现方法

3.1 在调度器中部署ipvsadm

三台虚拟机中,vsnode是调度器,RS1和RS2是服从调度的,因此需要向调度器里面要安装管理LVS的工具(即ipvsadm)

在router中

复制代码
[root@router ~]# dnf install ipvsadm -y
#通过 dnf 包管理器自动安装 ipvsadm 工具(LVS 集群的配置 / 管理命令行工具),-y 表示安装过程中所有确认提示自动回答 "是",无需手动交互

在vsnode中

复制代码
[root@vsnode ~]# yum install ipvsadm -y
#通过 yum 包管理器自动安装 ipvsadm 工具(LVS 负载均衡的核心管理工具)

[root@vsnode ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
#以数字形式(-n,不解析域名)查看当前服务器上所有已配置的 LVS 虚拟服务和后端节点规则(-L 是列出规则)

3.2 设定内核路由功能

开启内核路由功能的核心作用是让调度器具备 IP 数据包转发能力,从而实现客户端请求到后端真实服务器的流量分发与响应回传

在router中

复制代码
[root@router ~]# sysctl -a | grep ip_forward   #查看当前内核路由功能是否开启(=0为没有开启,=1为已开启)
[root@router ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf   ##手动开启内核路由功能
[root@router ~]# sysctl  -p    #让更改生效
net.ipv4.ip_forward = 1
[root@router ~]# sysctl -a | grep ip_forward

3.3 数据转发策略

编写策略是为了明确流量转发规则、实现负载均衡、保障服务高可用,并隐藏后端架构以提升安全性

在router中

复制代码
[root@router ~]# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.221.100
#将从网卡 eth1 发出的数据包的源 IP 地址,统一替换为 192.168.221.100 后再发送出去

[root@router ~]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.35.100
#将从网卡 eth0 发出的数据包的源 IP 地址,统一替换为 192.168.35.100 后再发送出去
  • SNAT源地址转换,通常用于内网主机通过网关访问外网时,把内网 IP 替换成网关的公网 / 指定 IP,让外部能正确回包;
  • -t nat 指定操作 nat 表,-A POSTROUTING 表示在数据包发出前的阶段添加规则,-o eth1 指定出口网卡为 eth1。

在vsnode中

复制代码
[root@vsnode ~]# ipvsadm -A -t 192.168.221.200:80 -s rr       
#添加一条LVS虚拟服务规则,指定虚拟ip(VIP)为192.168.221.200,端口80,采用rr轮询调度算法分发流量到后端(RS)节点;DR模式下仅做MAC地址转换(二层),因此VIP端口需和后端RS端口(80)一致(NAT模式可不同)。
[root@vsnode ~]# ipvsadm -a -t 192.168.221.200:80 -r 192.168.221.10 -g
#为VIP:80端口添加一个后端真实服务器(RS1),地址是192.168.221.10,-g表示采用直接路由
(DR)模式(封装MAC地址,不走三层NAT转换)
[root@vsnode ~]# ipvsadm -a -t 192.168.221.200:80 -r 192.168.221.20 -g
[root@vsnode ~]# ipvsadm -Ln
#验证上述虚拟服务和后端节点是否成功添加
[root@vsnode ~]# ipvsadm-save -n
#用于验证规则内容 (仅执行 ipvsadm-save -n 只会输出到屏幕,重定向到文件才会保存)
复制代码
#生成持久化文件

[root@vsnode ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
#将当前 vsnode 上配置的所有 LVS 规则导出并写入系统默认的 ipvsadm 配置文件 /etc/sysconfig/ipvsadm,实现规则的持久化存储
[root@vsnode ~]# systemctl start ipvsadm
#启动 ipvsadm 系统服务

3.4 arp禁止响应

这些配置通常用于 LVS (Linux Virtual Server)Keepalived 等负载均衡和高可用场景。当多个服务器共享同一个虚拟 IP (VIP) 时,通过设置 arp_ignore2,可以确保只有真正提供服务的主服务器会响应对 VIP 的 ARP 请求,从而避免其他备服务器错误地抢占 VIP,保证网络流量能正确地流向主服务器

在RS1中

复制代码
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
#设置系统对所有网络接口(all)的 ARP 请求的响应级别为 1
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
#设置系统对所有网络接口(lo)的 ARP 请求的响应级别为 1

[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_ignore

在RS2中

复制代码
[root@RS2 system-connections]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS2 system-connections]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS2 system-connections]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS2 system-connections]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_ignore

3.5 检测

1.测试连通性

四. 常见问题

Q1:给网卡添加网关时,把网关配置错了怎么改?

修改错误网关,核心是先删错的、再加对的,临时生效用 ip 命令,永久生效改对应配置文件。

1.清空网关配置

ipv4.gateway 设置为空字符串,以删除当前配置的网关

nmcli connection modify 网卡名 ipv4.gateway ""

nmcli connection up 网卡名 # 生效

route -n #检测是否生效

2.添加正确网关

nmcli connection modify 网卡名 ipv4.gateway 正确的网关IP

nmcli connection up 网卡名 # 生效

route -n #检测是否生效

Q2:环回接口上已经写好vip配置并启动后,用ip a查看仍然不生效怎么办?

问题例图:

核心原因是通过 NetworkManager 编辑 lo.nmconnection 的方式有问题,且回环接口的配置逻辑和物理网卡不同。

解决方法:

  1. 先删除错误的 lo 配置文件(避免冲突)

rm -f /etc/NetworkManager/system-connections/lo.nmconnection

nmcli connection reload

  1. 重新创建正确的 lo 接口配置(推荐用 nmcli 命令,避免手动编辑出错)

重置 lo 接口的 NetworkManager 配置

nmcli connection add type loopback ifname lo con-name lo

给 lo 接口添加 VIP(192.168.221.200/32)

nmcli connection modify lo ipv4.addresses "192.168.221.200/32"

设置 IPv4 为手动模式(必须)

nmcli connection modify lo ipv4.method manual

重新加载并激活配置

nmcli connection reload

nmcli connection up lo

  1. 验证配置是否生效

查看 lo 接口地址(能看到 192.168.221.200/32 即成功) ip a show lo # 查看 NetworkManager 配置是否正确 nmcli connection show lo | grep ipv4.addresses

正确例图:

五. 结论

总的来说,LVS DR 模式就是负载均衡里的 "高速收费站":

• 调度器是收费站入口的分道闸机,负责把车流(请求)引导到不同的收费窗口(后端服务器)。

• 而你缴费完成后,不需要再绕回分道闸机,直接从收费窗口上高速(响应直接返回给用户),这样整个通行效率就大大提高了。

举个实际例子:像淘宝的 "双十一" 大促,每秒有上千万的请求进来。如果用 NAT 模式,调度器会被挤爆;而用 DR 模式,就像有 100 个收费窗口同时开放,每辆车(请求)被引导到不同窗口,缴费后直接上高速,整个系统就能流畅应对海量请求,不会出现卡顿或崩溃。

相关推荐
露天赏雪2 小时前
JDK8 的入门避坑指南
java·服务器·windows·spring boot·后端·spring·性能优化
成都极云科技2 小时前
成都GPU服务器托管 - 成都服务器idc托管
运维·服务器
AZ996ZA2 小时前
自学linux的二十天【DNS 服务从入门到实战】
linux·运维·服务器
这个软件需要设计一下2 小时前
ninedata安装磁盘不足问题解决
运维·bug
qinyia2 小时前
**使用AI助手在智慧运维中快速定位并修复服务异常:以Nginx配置错误导致502错误为例**
linux·运维·服务器·数据库·mysql·nginx·自动化
❀͜͡傀儡师2 小时前
CentOS 7部署FTP服务
linux·运维·centos·ftp
ONLYOFFICE2 小时前
ONLYOFFICE 自动化工具:宏和 AI 函数如何选择?
运维·自动化·编辑器·onlyoffice
济6172 小时前
ARM Linux 驱动开发篇----字符设备驱动开发(2)--字符设备驱动开发步骤---- Ubuntu20.04
linux·运维·服务器
Guheyunyi2 小时前
什么是安全监测预警系统?应用场景有哪些?
大数据·运维·人工智能·安全·音视频