DR直接路由模式:不修改客户请求的源地址和目标地址,LVS直接通过MAC将请求转发给RS(真实服务器),RS需要设置ARP抑制
实验环境说明
角色 | 数量 | IP 配置(示例) | 核心作用 |
---|---|---|---|
客户端(Client) | 1 台 | 192.168.1.10 (与 LVS 的 ens37 同网段) |
发起请求,测试负载均衡效果 |
LVS 负载均衡器 | 1 台 | ens33=192.168.146.100 (内网,连后端 RS)ens37=192.168.1.200 (VIP,对外服务) |
分发请求到后端 RS |
后端服务器(RS1) | 1 台 | ens33=192.168.146.101 (内网 IP)lo:0=192.168.1.200 (绑定 VIP) |
提供实际服务(如 Web) |
后端服务器(RS2) | 1 台 | ens33=192.168.146.102 (内网 IP)lo:0=192.168.1.200 (绑定 VIP) |
提供实际服务(如 Web) |
网络要求 :LVS 与所有 RS 必须在同一内网网段(192.168.146.0/24
),客户端与 LVS 的 VIP(192.168.1.200
)可互通。
实验步骤
第一步:配置 LVS 负载均衡器
登录 LVS 服务器(IP:192.168.146.100
/192.168.1.200
),执行以下操作:
-
确认双网卡 IP 配置(若未配置则手动设置):
# 配置内网网卡(连 RS) ifconfig ens33 192.168.146.100 netmask 255.255.255.0 up # 配置 VIP 网卡(对外服务,ens37 绑定 VIP) ifconfig ens37 192.168.1.200 netmask 255.255.255.0 up
-
开启 IP 转发(DR 模式依赖转发功能):
echo 1 > /proc/sys/net/ipv4/ip_forward # 永久生效(重启不失效) echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p # 生效配置
-
安装 ipvsadm 工具(Debian/Ubuntu 系统):
apt update && apt install -y ipvsadm
-
加载 LVS 核心模块:
modprobe ip_vs # 核心模块 modprobe ip_vs_rr # 轮询调度算法(按需选择,如 wrr、lc 等) lsmod | grep ip_vs # 验证模块是否加载成功 出现以下内容则表示模块加载成功: ip_vs_rr 12288 0 ip_vs 221184 2 ip_vs_rr nf_conntrack 196608 1 ip_vs nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs libcrc32c 12288 2 nf_conntrack,ip_vs
-
配置 LVS DR 模式规则:
# 清空旧规则(首次配置可跳过) ipvsadm -C # 添加虚拟服务(VIP:端口,调度算法 rr 轮询) # -t:TCP 协议;-s rr:轮询调度 ipvsadm -A -t 192.168.1.200:80 -s rr # 添加后端 RS(DR 模式用 -g 标记) # -r:RS 的内网 IP:端口;-g:DR 模式 ipvsadm -a -t 192.168.1.200:80 -r 192.168.146.101:80 -g # 添加 RS1 ipvsadm -a -t 192.168.1.200:80 -r 192.168.146.102:80 -g # 添加 RS2 # 保存规则(重启后需重新加载,或配置自动加载) ipvsadm -S > /etc/sysconfig/ipvsadm # 保存到文件
-
查看 LVS 规则(确认配置生效):
ipvsadm -Ln # 预期输出:能看到 VIP:80 和两台 RS 的 IP,调度算法为 rr
第二步:配置后端服务器(RS1 和 RS2)
分别登录 RS1(192.168.146.101
)和 RS2(192.168.146.102
),执行以下操作(两台配置相同,仅 IP 不同):
-
配置内网 IP:
# RS1 执行 ifconfig ens33 192.168.146.101 netmask 255.255.255.0 up # RS2 执行 ifconfig ens33 192.168.146.102 netmask 255.255.255.0 up
-
在回环接口(lo)绑定 VIP(关键步骤,避免 IP 冲突):
# 绑定 VIP 到 lo:0 子接口(子网掩码必须是 255.255.255.255) ifconfig lo:0 192.168.1.200 netmask 255.255.255.255 up # 添加路由,确保 VIP 流量由 lo 接口处理 route add -host 192.168.1.200 dev lo:0
-
关闭 ARP 响应(核心配置,防止 VIP 冲突):
# 禁止 RS 响应 VIP 的 ARP 请求(避免客户端直接访问 RS) echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce # 对所有接口生效 echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
-
安装并启动 Web 服务(用于区分不同 RS 的响应):
# 安装 Nginx apt update && apt install -y nginx # RS1 配置:返回标识(如 "This is RS1 (192.168.146.101)") echo "This is RS1 (IP: 192.168.146.101)" > /var/www/html/index.html # RS2 配置:返回标识(如 "This is RS2 (192.168.146.102)") echo "This is RS2 (IP: 192.168.146.102)" > /var/www/html/index.html # 启动 Nginx systemctl start nginx systemctl enable nginx # 开机自启
-
验证 RS 本地服务:
curl 127.0.0.1 # 应返回当前 RS 的标识文本
第三步:配置客户端(Client)
登录客户端机器(192.168.1.10
),确保与 LVS 的 VIP(192.168.1.200
)互通:
-
配置客户端 IP(与 LVS 的 ens37 同网段):
ifconfig ens33 192.168.1.10 netmask 255.255.255.0 up
-
测试与 LVS VIP 的连通性:
ping 192.168.1.200 # 应能 ping 通
第四步:验证 LVS DR 模式负载均衡效果
在客户端执行多次访问 LVS VIP 的命令,观察响应是否在 RS1 和 RS2 之间切换:
# 连续执行 curl 命令,查看返回结果
curl 192.168.1.200
curl 192.168.1.200
curl 192.168.1.200
预期结果 :多次执行后,响应应交替显示 This is RS1 (IP: 192.168.146.101)
和 This is RS2 (IP: 192.168.146.102)
,说明 LVS DR 模式的负载均衡已生效。
常见问题排查
-
客户端访问超时:
- 检查 LVS 与 RS 的内网连通性(
ping 192.168.146.101
); - 检查 RS 的 Nginx 是否启动(
systemctl status nginx
); - 检查 LVS 规则是否正确(
ipvsadm -Ln
)。
- 检查 LVS 与 RS 的内网连通性(
-
响应不切换(只访问一台 RS):
- 确认 LVS 调度算法为
rr
(轮询),而非sh
(源地址哈希); - 检查 RS 的 ARP 配置是否正确(
cat /proc/sys/net/ipv4/conf/all/arp_ignore
应返回 1)。
- 确认 LVS 调度算法为
-
VIP 冲突(客户端直接访问到 RS):
- 重新执行 RS 的 ARP 配置命令,确保
arp_ignore=1
和arp_announce=2
。
- 重新执行 RS 的 ARP 配置命令,确保
通过以上步骤,即可完成 LVS DR 模式的部署和验证,核心是利用 "MAC 地址转发" 和 "后端直接响应客户端" 的特性,提升负载均衡效率。