目录
基本概念
一、LVS-DR 的核心设计思想
1.1 核心目标
- 性能最大化:避免 Director 成为响应流量的瓶颈(与 NAT 模式对比)
- 透明性:客户端无法感知后端集群的存在(所有响应看似直接来自 VIP)
- 网络兼容性:支持跨 VLAN 部署(需特定网络配置)
1.2 DR 模式的本质
- 二层重定向:Director 仅修改数据帧的 MAC 地址(目标 MAC 改为 Real Server 的 MAC)
- IP 层无变化:客户端请求的源 IP(CIP)和目标 IP(VIP)在整个转发过程中 始终不变
- Real Server 的 VIP 隐身:通过 ARP 抑制技术,确保只有 Director 响应 VIP 的 ARP 请求
二、网络分层视角下的 LVS-DR
2.1 OSI 模型定位
层级 | LVS-DR 的操作 |
---|---|
物理层 | 无特殊要求 |
数据链路层 | Director 修改目标 MAC 地址 → 关键操作层 |
网络层 | IP 包头(CIP→VIP)始终不变 |
传输层 | TCP/UDP 端口无修改(除非配置端口映射) |
会话层以上 | 完全透明 |
2.2 对比其他 LVS 模式
模式 | 层级 | 修改内容 | 性能瓶颈点 |
---|---|---|---|
NAT | 网络层 | 修改目标 IP + 端口 | Director 的出站流量 |
TUN | 网络层 | IP-in-IP 封装 | 隧道解封装开销 |
DR | 数据链路层 | 仅修改 MAC 地址 | 无(理论线速转发) |
三、数据包流向的深度拆解
3.1 请求流程(CIP → VIP)
客户端发送 SYN 包:
Ethernet Header: SRC_MAC=Client_MAC, DST_MAP=Gateway_MAC IP Header: SRC_IP=CIP, DST_IP=VIP TCP Header: SYN Flag
Director 接收数据包:
- 确认目标 IP 为 VIP 且端口匹配服务
- 根据 IPVS 规则选择 Real Server(假设选择 RS1)
Director 重写数据帧:
Ethernet Header: SRC_MAC=Director_MAC(DIP 的 MAC) DST_MAC=RS1_MAC(通过 ARP 表查找 RS1 的 MAC) IP Header: 保持 CIP→VIP 不变 → ‌**关键区别点!**‌
RS1 接收数据包:
- 检查目标 IP 是否为本机 IP → 发现 VIP 绑定在
lo
接口 - 内核将数据包传递给监听在 VIP:Port 的服务(如 Nginx)
- 检查目标 IP 是否为本机 IP → 发现 VIP 绑定在
3.2 响应流程(VIP → CIP)
RS1 生成 SYN-ACK 响应:
Ethernet Header: SRC_MAC=RS1_MAC, DST_MAC=Gateway_MAC(非 Director!) IP Header: SRC_IP=VIP, DST_IP=CIP TCP Header: SYN-ACK Flag
数据包直接发送到客户端:
- RS1 通过默认路由将响应发送到网关
- Director 完全不参与响应路径 → 响应带宽无限制
四、ARP 抑制的核心原理
4.1 ARP 冲突的根本原因
- 正常情况:当 VIP 绑定在 Real Server 的物理网卡时,RS 会主动响应 VIP 的 ARP 请求 → 导致局域网内多个设备(Director + RS)宣称拥有 VIP
- 后果:客户端可能直接与 RS 通信,绕过 Director 的调度 → 破坏集群逻辑
4.2 Linux 内核的 ARP 控制参数
参数 1:arp_ignore
- 定义:控制是否响应目标 IP 不属于本地物理接口的 ARP 请求
- 关键值:
0
(默认):只要本地有任意接口拥有该 IP,就响应 ARP1
:仅在查询的目标 IP 属于接收 ARP 请求的接口时才响应
参数 2:arp_announce
- 定义:控制发送 ARP 应答时使用的源 IP 地址
- 关键值:
0
(默认):可使用任意本地接口的 IP 作为源 IP2
:优先使用与目标 IP 在同一子网的本地接口 IP
4.3 DR 模式下的 ARP 抑制配置
# 在 Real Server 上配置
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# 特殊处理:针对 lo 接口的 ARP 行为
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
效果验证
# 在其他主机上执行
arping arping -I eth0 192.168.20.100
# 正确结果:
# 只有 Director 响应 ARP 请求
# Real Server 保持沉默
五、内核层面的实现机制
5.1 ip_vs
内核模块
- 功能:实现 LVS 的核心转发逻辑
- 工作位置:位于 Netfilter 的
NF_INET_LOCAL_IN
钩子点 - 处理流程:
- 检查目标 IP 是否匹配虚拟服务(VIP:Port)
- 根据调度算法选择 Real Server
- 调用
dev_queue_xmit()
直接转发修改后的数据帧
5.2 转发路径优化
- 绕过 TCP/IP 协议栈:Director 不会对数据包进行完整解封装,仅重写 MAC 地址 → 减少 CPU 开销
- 无连接跟踪:与 NAT 不同,DR 模式无需维护连接状态表 → 内存消耗更低
5.3 性能对比数据
指标 | DR 模式 | NAT 模式 |
---|---|---|
最大并发连接数 | 100 万+ | 10 万~50 万 |
吞吐量(64B 包) | 线速(取决于网卡) | 受限于 CPU |
延迟 | 增加 ≈0.1μs | 增加 ≈2μs |
六、LVS-DR 的拓扑限制与解决方案
6.1 严格网络要求
- 同一广播域:Director 和 Real Server 必须位于同一二层网络(无路由器隔离)
- VIP 不可路由:客户端必须通过二层可达性访问 VIP(通常 VIP 需与客户端同网段)
6.2 跨 VLAN 部署方案
方案 1:VLAN 聚合:
- 将 Director 和 Real Server 的物理端口划入同一 VLAN
- 需要交换机支持 VLAN trunking
方案 2:Proxy ARP:
# 在网关设备上配置 interface vlan100 ip proxy-arp # 允许跨 VLAN 代理 ARP
七、进阶思考:为什么不能使用普通负载均衡器?
7.1 传统负载均衡器的瓶颈
- 双向流量处理:需要处理入站请求和出站响应 → 成为带宽瓶颈
- 协议栈开销:完整的 TCP 连接处理消耗 CPU 资源
7.2 LVS-DR 的突破
- 非对称架构:将高消耗的响应流量卸载到 Real Server
- 内核级转发:利用 Linux 内核的网络栈优化实现线速转发
八、总结:LVS-DR 的哲学
LVS-DR 模式的精髓在于 “最小化修改” 和 “路径分离”:
- 最小化修改:仅操作数据链路层,保持上层协议完整性
- 路径分离:入站请求走 Director 调度,出站响应直连客户端
案例部署
一、部署架构规划
- 网络拓扑:Director 与 Real Server 需在同一二层网络(无路由器隔离)
- IP 分配示例:
- VIP(虚拟IP):192.168.20.100
- Director DIP(物理IP):192.168.20.1
- Real Server RIP:192.168.20.11/12
二、Director 配置步骤
安装 IPVS 工具
# CentOS/RedHat yum install -y ipvsadm # Ubuntu/Debian apt install -y ipvsadm
配置 VIP(临时生效)
ip addr add 192.168.20.100/32 dev ens33
启用 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward sysctl -p
添加 IPVS 规则
# 创建虚拟服务(使用加权最小连接调度) ipvsadm -A -t 192.168.20.100:80 -s wlc # 添加 Real Server(-g 表示 DR 模式,-w 设置权重) ipvsadm -a -t 192.168.20.100:80 -r 192.168.20.11:80 -g -w 1 ipvsadm -a -t 192.168.20.100:80 -r 192.168.20.12:80 -g -w 2 # 保存规则 ipvsadm-save > /etc/sysconfig/ipvsadm systemctl enable ipvsadm
三、Real Server 配置步骤
绑定 VIP 到 lo 接口
ip addr add 192.168.20.100/32 dev lo
配置 ARP 抑制
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce # 针对 lo 接口的特殊配置 echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
服务监听 VIP(以 Nginx 为例)
server { listen 192.168.20.100:80; server_name localhost; location / { root /usr/share/nginx/html; } }
四、关键验证方法
检查 Director 规则
ipvsadm -Ln # 应显示活跃的虚拟服务和 Real Server 状态
测试 ARP 抑制
# 在其他主机执行 arping -I eth0 192.168.20.100 # 仅 Director 响应,Real Server 无响应
流量观测工具
# Director 上观察连接分发 ipvsadm -lcn # Real Server 上抓包 tcpdump -i ens33 host 192.168.20.100
五、生产环境注意事项
- 高可用:建议结合 Keepalived 实现 Director 主备切换
- 持久化配置:将 VIP 和 ARP 参数写入
/etc/rc.local
或系统配置文件 - 性能调优:调整
/proc/sys/net/ipv4/vs/
下的内核参数(如conn_timeout
)