【负载均衡】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

