【负载均衡】LVS DR模式详解

LVS-DR 模式

1. DR 模式核心概念

DR = Direct Routing(直接路由)

2. DR 模式工作原理

2.1 数据流向对比
- 传统模式(NAT)
复制代码
客户端请求 → 负载均衡器 → 真实服务器 → 负载均衡器 → 客户端响应
- DR 模式
复制代码
客户端请求 → 负载均衡器 → 真实服务器 → 直接返回客户端
         (接收所有请求)(处理请求) (响应不经过负载均衡器)

3. 技术实现原理

复制代码
1. 客户端发送请求到 VIP
2. 负载均衡器接收请求,选择一台真实服务器
3. 负载均衡器将请求转发给真实服务器(MAC地址改写)
4. 真实服务器直接响应客户端(源IP仍是VIP)
5. 客户端收到响应,认为来自VIP

4. 为什么响应能直接返回?

  • 真实服务器配置 VIP 在 lo 接口
  • 通过 ARP 抑制避免 IP 冲突
  • 响应数据包源 IP 为 VIP,客户端接受

5. 配置负载均衡器

- 环境信息
  • Director IP: 192.168.65.131
  • VIP: 192.168.65.100
- 系统基础配置
复制代码
# 关闭防火墙
systemctl disable firewalld --now

# 关闭 SELinux(临时)
setenforce 0

# 加载 IPVS 内核模块
modprobe ip_vs

# 安装 IPVS 管理工具
yum -y install ipvsadm
- 配置虚拟 IP (VIP)
复制代码
# 进入网络配置目录
cd /etc/sysconfig/network-scripts/

# 复制 ens33 配置创建虚拟接口
cp ifcfg-ens33 ifcfg-ens33:0

# 编辑虚拟接口配置
vi ifcfg-ens33:0

ifcfg-ens33:0 内容:

复制代码
DEVICE=ens33:0        # 设备名称
ONBOOT=yes            # 开机启动
IPADDR=192.168.65.100 # 虚拟IP地址
NETMASK=255.255.255.255 # 子网掩码(32位,单机地址)
# 注意:不配置 GATEWAY 和 DNS

激活虚拟接口:

复制代码
# 启用虚拟接口
ifup ens33:0

# 检查配置
ifconfig ens33:0
# 应该显示: inet 192.168.65.100 netmask 255.255.255.255
- 调整内核参数
复制代码
# 编辑内核参数文件
vi /etc/sysctl.conf

# 添加以下内容:
# 启用 IP 转发(负载调度器需要)
net.ipv4.ip_forward = 0

# 禁用 ICMP 重定向,避免网络混乱
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

应用配置:

复制代码
# 重新加载内核参数
sysctl -p

# 验证 IP 转发是否启用
cat /proc/sys/net/ipv4/ip_forward
# 应该显示: 1
- 配置 LVS 服务及调度
复制代码
# 清空现有 IPVS 规则
ipvsadm -C

# 添加虚拟服务
# -A: 添加虚拟服务
# -t: TCP 协议
# 192.168.65.131:80: 虚拟服务的IP和端口
# -s rr: 调度算法为轮询 (Round Robin)
ipvsadm -A -t 192.168.10.180:80 -s rr

# 添加真实服务器
# -a: 添加真实服务器
# -t: TCP 协议  
# -r: 真实服务器地址
# -g: 使用 DR 模式 (Gateway, 即直接路由)
ipvsadm -a -t 192.168.10.180:80 -r 192.168.10.16:80 -g
ipvsadm -a -t 192.168.10.180:80 -r 192.168.10.17:80 -g

# 查看配置状态
ipvsadm -ln

预期输出:

复制代码
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.65.131:80 rr
  -> 192.168.65.128:80             Route   1      0          0
  -> 192.168.65.133:80             Route   1      0          0

注意: Route 表示 DR 模式配置正确。

配置节点服务器 (Real Server)

环境信息

  • Real Server 1: 192.168.65.128
  • Real Server 2: 192.168.65.133
  • VIP: 192.168.65.100

(1) 配置 VIP 到 lo 接口

复制代码
# 进入网络配置目录
cd /etc/sysconfig/network-scripts/

# 复制 lo 配置创建虚拟接口
cp ifcfg-lo ifcfg-lo:0

# 编辑虚拟接口配置
vi ifcfg-lo:0

ifcfg-lo:0 内容:

复制代码
DEVICE=lo:0           # 设备名称(环回接口虚拟设备)
ONBOOT=yes            # 开机启动  
IPADDR=192.168.65.100 # 虚拟IP地址
NETMASK=255.255.255.255 # 子网掩码(32位)

激活虚拟接口:

复制代码
# 启用虚拟接口
ifup lo:0

# 检查配置
ifconfig lo:0
# 应该显示: inet 192.168.65.100 netmask 255.255.255.255

# 添加路由,确保发往VIP的包通过lo:0接口
route add -host 192.168.65.100 dev lo:0

(2) ARP 参数调整(关键步骤)

复制代码
# 编辑内核参数文件
vi /etc/sysctl.conf

添加以下内容:

复制代码
# ARP 抑制配置 - 核心配置!
# 只响应目标IP地址为本地接口IP的ARP请求
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2


# 环回接口的ARP抑制  
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

应用配置:

复制代码
# 重新加载内核参数
sysctl -p

# 验证 ARP 抑制配置
sysctl -a | grep arp_ignore
sysctl -a | grep arp_announce

(3) 安装和配置 Web 服务

复制代码
# 安装 Apache
yum -y install httpd

# 启动服务
systemctl start httpd

# 为每台真实服务器创建不同的测试页面
# 在 192.168.10.16 上执行:
echo "Web Server 1 - 192.168.10.16" > /var/www/html/index.html

# 在 192.168.10.17 上执行:  
echo "Web Server 2 - 192.168.10.17" > /var/www/html/index.html

# 测试本地访问
http://192.168.65.100
相关推荐
LoneEon2 小时前
告别手动操作:用 Ansible 统一管理你的 Ubuntu 服务器集群
运维·服务器·ansible
百***67032 小时前
Nginx搭建负载均衡
运维·nginx·负载均衡
摘星|4 小时前
架设一台NFS服务器,并按照以下要求配置
linux·运维·服务器
做运维的阿瑞4 小时前
Linux环境变量持久化完全指南
linux·运维·服务器
天才奇男子4 小时前
从零开始搭建Linux Web服务器
linux·服务器·前端
Wang's Blog5 小时前
MySQL: 服务器性能优化全面指南:参数配置与数据库设计的最佳实践
服务器·数据库·mysql
顾安r5 小时前
11.14 脚本网页 迷宫逃离
服务器·javascript·游戏·flask·html
小任今晚几点睡5 小时前
Ansible 基础配置与负载均衡部署实践
运维·自动化·ansible·负载均衡
网络坤子-蔡先生5 小时前
openEuler 22.03 ARM64 KVM虚拟化安装
linux·开源·负载均衡