1. 引言
- 背景:简要介绍 LVS(Linux Virtual Server)是什么,为什么需要负载均衡技术(如高可用性、高并发、扩展性等)。
- 目标:说明本文的目标是通过实验验证 LVS 的 NAT 模式和 DR 模式,并对比两者的差异与适用场景。
- 读者对象:适合有一定 Linux 基础、对网络负载均衡感兴趣的技术人员或运维工程师。
2. LVS 技术概述
2.1 LVS 的核心概念
- LVS 的组成:
- Director(调度器):接收客户端请求并转发到后端服务器。
- Real Server(真实服务器):处理具体业务请求的后端服务器。
- VIP(虚拟 IP):对外提供服务的 IP。
- DIP(Director IP):调度器的 IP。
- RIP(Real Server IP):后端服务器的 IP。
- LVS 的工作模式:
- NAT(Network Address Translation)
- DR(Direct Routing)
- TUN(IP Tunneling)(可简要提及,但重点放在实验的 NAT 和 DR 模式上)。
2.2 LVS 的调度算法
- 静态算法:轮询(RR)、加权轮询(WRR)、源地址哈希(SH)。
- 动态算法:最少连接(LC)、加权最少连接(WLC)。
- 适用场景:根据业务需求选择合适的算法。
3. LVS-NAT模式集群实验
3.1 实验环境规划
实验目标是搭建一个负载均衡集群,通过 LVS 调度器将流量分发到两台真实服务器(RS1 和 RS2)。
主机名 | 角色 | 网卡配置 | IP 地址分配 |
---|---|---|---|
VS | LVS 调度器 (VS) | 双网卡: - 网卡1:NAT 模式(172.25.254.0/24) - 网卡2:仅主机模式(192.168.0.0/24) | - VIP:172.25.254.100(NAT 模式) - DIP:192.168.0.100(仅主机模式) |
RS1 | 真实服务器 (RS1) | 单网卡:仅主机模式(192.168.0.0/24) | - RIP:192.168.0.101 |
RS2 | 真实服务器 (RS2) | 单网卡:仅主机模式(192.168.0.0/24) | - RIP:192.168.0.102 |
Client | 测试机 | 单网卡:NAT 模式(172.25.254.0/24) | - 任意 IP(可动态分配) |
3.2 网络配置详解
1. 网卡模式说明
NAT 模式:允许主机访问外部网络,适合调度器 VS 和测试机 Client 的外网接口。
仅主机模式:隔离外部网络,仅在虚拟机内部通信,适合调度器 VS 的内网接口和真实服务器(RS2/RS3)。
2. 每台主机的网卡配置
VS(调度器)
网卡1(NAT 模式):
配置 IP:
172.25.254.100/24
网关:
172.25.254.2
(根据虚拟机 NAT 网络配置)
网卡2(仅主机模式):
配置 IP:
192.168.0.100/24
RS1 和 RS2
网卡(仅主机模式):
RS2:
192.168.0.101/24
,网关:192.168.0.100
RS3:
192.168.0.102/24
,网关:192.168.0.100
Client(测试机)
网卡(NAT 模式):
配置 IP:
172.25.254.101/24
(可动态分配)网关:
172.25.254.2
验证网关
[root@VS ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.25.254.2 0.0.0.0 UG 100 0 0 ens160 0.0.0.0 192.168.0.100 0.0.0.0 UG 101 0 0 ens192 172.25.254.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160 192.168.0.0 0.0.0.0 255.255.255.0 U 101 0 0 ens192 [root@RS1 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 ens160 192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160 [root@RS2 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 ens160 192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160 [root@Client ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.25.254.2 0.0.0.0 UG 100 0 0 ens160 172.25.254.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
3.3 实验步骤
1. 所有主机的基础配置
关闭防火墙和 SELinux:
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
安装 HTTP 服务(在 RS21和 RS2 上):
sudo dnf install -y httpd
sudo systemctl enable --now httpd
在 RS1 上创建测试页面:
echo "RS1 server - 192.168.0.101" > /var/www/html/index.html
在 RS2 上创建测试页面:
echo "RS2 server - 192.168.0.102" > /var/www/html/index.html
2. VS(调度器)配置
(1) 启用 IP 转发
sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ip_forward.conf
sudo sysctl --system
作用:
IP 转发(IP Forwarding) 是 Linux 内核的功能,允许系统将接收到的数据包从一个网络接口转发到另一个网络接口。
在 LVS-NAT 模式 中,调度器需要将客户端的请求(VIP:80)转发到真实服务器(RIP:80),并将真实服务器的响应返回给客户端。如果未启用 IP 转发,调度器会丢弃这些数据包,导致服务不可用。
# 验证是否启用
cat /proc/sys/net/ipv4/ip_forward
# 输出应为 1
(2) 安装 ipvsadm 工具
sudo dnf install -y ipvsadm
(3) 配置 LVS-NAT 规则
添加虚拟服务器(VIP)和真实服务器(RIP):
# 添加虚拟服务器(轮询算法) sudo ipvsadm -A -t 172.25.254.100:80 -s rr # 添加真实服务器(NAT 模式) sudo ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.101:80 -m sudo ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.102:80 -m
验证规则:
sudo ipvsadm -Ln
# 输出示例:
# TCP 172.25.254.100:80 rr
# -> 192.168.0.101:80 Masq 1 0 0
# -> 192.168.0.102:80 Masq 1 0 0
(4) 保存规则并设置开机启动
# 保存规则到配置文件
sudo ipvsadm -S > /etc/sysconfig/ipvsadm
# 设置开机启动
sudo systemctl enable --now ipvsadm
3. node2 和 node3(真实服务器)配置
设置默认网关(确保响应流量通过调度器返回):
sudo ip route add default via 192.168.0.100
验证网关:
[root@RS1 ~]# ip route default via 192.168.0.100 dev ens160 proto static metric 100 192.168.0.0/24 dev ens160 proto kernel scope link src 192.168.0.101 metric 100 [root@RS1 ~]# [root@RS2 ~]# ip route default via 192.168.0.100 dev ens160 proto static metric 100 192.168.0.0/24 dev ens160 proto kernel scope link src 192.168.0.102 metric 100 [root@RS2 ~]#
4. Client(测试机)验证
使用curl测试负载均衡:
for N in {1..6}; do curl 172.25.254.100; done
预期结果:输出交替显示
RS1 server - 192.168.0.101
和RS2 server - 192.168.0.102
,表示轮询生效。
3.4 进阶配置
1. 修改为加权轮询(WRR)
调整调度算法和权重:
# 修改虚拟服务器的调度算法 sudo ipvsadm -E -t 172.25.254.100:80 -s wrr # 修改真实服务器的权重 sudo ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.101:80 -m -w 2 sudo ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.102:80 -m -w 1
测试加权轮询:
for N in {1..6}; do curl 172.25.254.100; done
预期结果:
RS1
的访问次数是RS2
的两倍(权重 2:1)。
3.5 总结
LVS-NAT 模式特点:
调度器负责地址转换(SNAT/DNAT),所有流量需经过调度器。
真实服务器的网关必须指向调度器的 DIP。
适合后端服务器数量较少的场景。
实验成功标志:
测试机访问 VIP 时,流量能正确分发到两台真实服务器。
加权轮询算法生效,访问比例符合权重配置。
4. LVS-DR模式集群实验
4.1 实验目标
在LVS-DR模式下实现负载均衡。
客户端通过VIP访问Web服务,请求被分发到RS1和RS2。
验证DR模式的流量转发机制和负载均衡策略。
4.2 实验环境
主机名 | 角色 | 网卡配置 | VIP(Virtual IP) |
---|---|---|---|
client | 测试客户端 | ens160 (NAT模式): 172.25.254.10/24 ,网关 172.25.254.100 |
无 |
router | 路由器 | ens160 (NAT模式): 172.25.254.100/24 ens192 (仅主机模式): 192.168.0.10/24 |
无 |
lvs | 调度器 | ens160 (仅主机模式): 192.168.0.200/24 ,网关 192.168.0.10 |
192.168.0.100 (lo接口) |
rs1 | 真实服务器1 | ens160 (仅主机模式): 192.168.0.101/24 ,网关 192.168.0.10 |
192.168.0.100 (lo接口) |
rs2 | 真实服务器2 | ens160 (仅主机模式): 192.168.0.102/24 ,网关 192.168.0.10 |
192.168.0.100 (lo接口) |
4.3 实验步骤
1. 环境准备
1.1 关闭防火墙和SELinux
在所有主机上执行以下命令:
# 关闭防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# 关闭SELinux
sudo setenforce 0
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
1.2 网络配置
配置 client
主机、route主机、LVS主机、RS1和RS2主机(以client为例)
编辑
ens160
的网络配置文件:[root@client ~]# vim /etc/NetworkManager/systemconnections/ens160.nmconnection
内容如下:
[connection] id=ens160 type=ethernet interface-name=ens160 [ipv4] method=manual address1=172.25.254.10/24,172.25.254.100
重启网络服务:
[root@client ~]# nmcli connection reload [root@client ~]# nmcli connection up ens160
验证路由表:
[root@client ~]# route -n # 输出应包含默认网关 172.25.254.100 [root@Client ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.25.254.100 0.0.0.0 UG 100 0 0 ens160 172.25.254.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
4.验证网络连通性:
在所有主机上执行以下命令,确保网络互通:
ping 192.168.0.10 # 测试到路由器
ping 192.168.0.101 # 测试到RS1
ping 192.168.0.102 # 测试到RS2
2. 安装必要的软件
2.1 安装 httpd
和 ipvsadm
[root@lvs ~]# dnf install -y ipvsadm
[root@rs1 ~]# dnf install -y httpd
[root@rs2 ~]# dnf install -y httpd
2.2 启动并启用 httpd
服务
[root@rs1 ~]# systemctl enable --now httpd
[root@rs2 ~]# systemctl enable --now httpd
3. 配置 VIP 和 ARP 参数
3.1 在 lvs
、rs1
、rs2
上配置 VIP
添加 VIP 到
lo
接口:[root@lvs ~]# ip addr add 192.168.0.100/32 dev lo [root@rs1 ~]# ip addr add 192.168.0.100/32 dev lo [root@rs2 ~]# ip addr add 192.168.0.100/32 dev lo
验证 VIP 是否生效:
[root@lvs ~]# ip a show dev lo [root@LVS ~]# ip a show dev lo 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet 192.168.0.100/32 scope global lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever
3.2 调整 ARP 参数(rs1
和 rs2
)
临时设置 ARP 参数:
[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce [root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce [root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
持久化 ARP 参数:
[root@rs1 ~]# echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf [root@rs1 ~]# echo "net.ipv4.conf.lo.arp_ignore = 1" >> /etc/sysctl.conf [root@rs1 ~]# echo "net.ipv4.conf.lo.arp_announce = 2" >> /etc/sysctl.conf [root@rs1 ~]# echo "net.ipv4.conf.all.arp_announce = 2" >> /etc/sysctl.conf [root@rs1 ~]# sysctl -p [root@rs2 ~]# echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf [root@rs2 ~]# echo "net.ipv4.conf.lo.arp_ignore = 1" >> /etc/sysctl.conf [root@rs2 ~]# echo "net.ipv4.conf.lo.arp_announce = 2" >> /etc/sysctl.conf [root@rs2 ~]# echo "net.ipv4.conf.all.arp_announce = 2" >> /etc/sysctl.conf [root@rs2 ~]# sysctl -p
4. 配置 LVS 调度器(lvs
)
4.1 添加 IPVS 规则
创建虚拟服务(VIP:80)并设置加权轮询(WRR)算法:
[root@lvs ~]# ipvsadm -A -t 192.168.0.100:80 -s wrr
添加真实服务器(RS1 和 RS2):
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.101:80 -g [root@lvs ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.102:80 -g
验证 IPVS 规则:
[root@lvs ~]# ipvsadm -Ln # 输出示例: TCP 192.168.0.100:80 wrr -> 192.168.0.101:80 Route 1 0 0 -> 192.168.0.102:80 Route 1 0 0
4.2 保存 IPVS 规则
保存规则到文件:
[root@lvs ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
设置开机自动加载规则:
[root@lvs ~]# systemctl enable ipvsadm [root@lvs ~]# systemctl start ipvsadm
5. 配置 Web 服务器(rs1
和 rs2
)
5.1 配置测试页面
在
rs1
上创建测试页面:[root@rs1 ~]# echo "RS1 server - 192.168.0.101" > /var/www/html/index.html
在
rs2
上创建测试页面:[root@rs2 ~]# echo "RS2 server - 192.168.0.102" > /var/www/html/index.html
6. 测试 LVS-DR 模式
6.1 在 client
上测试负载均衡
访问 VIP 并观察轮询效果:
[root@client ~]# for N in {1..6}; do curl http://192.168.0.100; done
# 预期输出交替显示 RS1 和 RS2 的内容
2. 修改服务器权重
sudo ipvsadm -e -t 192.168.0.100:80 -r 192.168.0.101:80 -g -w 3
sudo ipvsadm -e -t 192.168.0.100:80 -r 192.168.0.102:80 -g -w 1
再次观察轮询效果:
5.NAT与DR模式的对比
特性 | NAT 模式 | DR 模式 |
---|---|---|
流量路径 | 请求和响应均经过 Director | 请求经过 Director,响应直接返回客户端 |
性能 | 较低(Director 成为瓶颈) | 高(适合大规模集群) |
网络要求 | Real Server 可跨网络 | Real Server 必须与 Director 同局域网 |
配置复杂度 | 简单 | 较复杂(需配置 ARP 和 VIP) |
适用场景 | 小型集群(后端服务器数量少) | 大型集群(高性能需求) |
实际应用建议
选择 NAT 模式:适用于后端服务器数量较少、网络环境简单的场景(如小型 Web 服务)。
选择 DR 模式:适用于高性能、高并发的场景(如大型 Web 服务、数据库集群)。
结合 Keepalived:通过 Keepalived 实现 Director 的高可用性(主备切换)。