LVS 集群部署
一、LVS 核心概念与模式选择
LVS(Linux Virtual Server)是 Linux 内核集成的四层负载均衡解决方案,通过 IPVS 模块实现请求分发,性能远高于 Nginx 等七层负载均衡。
1.1 三种工作模式对比
| 模式 | 核心原理 | 性能 | 网络要求 | 适用场景 |
|---|---|---|---|---|
| DR 模式(Direct Routing) | 调度器仅修改 MAC 地址,RS 直接响应客户端 | 最高 | VIP 与 RS 同网段,RS 需配置 VIP 到 lo 接口 | 大规模 Web 服务,追求机制性能 |
| NAT 模式 | 调度器做 DNAT / PNAT转换,RS 网关指向调度器 | 中 | 调度器双网卡,RS 与外网隔离 | 小规模服务,RS 无公网 IP |
| TUN 模式 | IP 隧道封装,RS 跨网段直接响应客户端 | 中高 | 支持 IPIP / GRE 隧道,RS 需配置隧道接口 | 跨机房部署,RS 分散在不同网段 |
二、环境规划与准备(DR 模式)
2.1 服务器角色与网络配置
| 角色 | 主机名 | IP 地址 | 核心配置 |
|---|---|---|---|
| 调度器 (Director) | lvs-director | DIP: 192.168.1.100VIP: 192.168.1.200/32 | 双网卡 (可选),安装 ipvsadm |
| 真实服务器 1 (RS1) | web1 | RIP: 192.168.1.101VIP: 192.168.1.200/32(lo) | 安装 Nginx,配置 ARP 参数 |
| 真实服务器 2 (RS2) | web2 | RIP: 192.168.1.102VIP: 192.168.1.200/32(lo) | 安装 Nginx,配置 ARP 参数 |
| 客户端 | client | 192.168.1.201 | 测试访问 VIP |
2.2 基础环境准备(所有节点)
bash
# 关闭防火墙和SELinux(生产环境建议开放必要端口)
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 安装依赖工具
yum install -y ipvsadm net-tools vim wget # CentOS/RHEL
dnf install -y ipvsadm net-tools vim wget # openEuler
# 加载IPVS内核模块
modprobe ip_vs
modprobe ip_vs_rr # 轮询算法
modprobe ip_vs_wrr # 加权轮询
modprobe ip_vs_sh # 源地址哈希
lsmod | grep ip_vs # 验证模块加载
# 安装Web服务(RS节点额外执行)
yum install -y nginx
systemctl start nginx && systemctl enable nginx
echo "RS1: $(hostname -I)" > /usr/share/nginx/html/index.html # RS1
echo "RS2: $(hostname -I)" > /usr/share/nginx/html/index.html # RS2
三、DR 模式核心配置步骤
3.1 调度器(Director)配置
3.1.1 配置 VIP 地址
bash
# 临时添加VIP(重启失效)
ip addr add 192.168.1.200/32 dev eth0 # 绑定到外网网卡
# 永久配置VIP(推荐)
cat > /etc/sysconfig/network-scripts/ifcfg-eth0:0 << EOF
DEVICE=eth0:0
ONBOOT=yes
IPADDR=192.168.1.200
NETMASK=255.255.255.255
EOF
ifup eth0:0
3.1.2 配置 IPVS 规则
bash
# 清空原有规则
ipvsadm -C
# 添加虚拟服务(VIP:80,轮询算法rr)
ipvsadm -A -t 192.168.1.200:80 -s rr
# 添加真实服务器(DR模式用-g参数,权重1)
ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.101:80 -g -w 1
ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.102:80 -g -w 1
# 保存规则(重启后自动加载)
ipvsadm -S > /etc/sysconfig/ipvsadm
systemctl enable ipvsadm --now
# 查看规则
ipvsadm -Ln
3.2 真实服务器(RS)核心配置
DR 模式必须配置以下内容,否则会出现 VIP 地址冲突和 ARP 响应异常问题。
3.2.1 配置 VIP 到 lo 接口
bash
# 临时配置
ip addr add 192.168.1.200/32 dev lo
# 永久配置
cat > /etc/sysconfig/network-scripts/ifcfg-lo:0 << EOF
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.1.200
NETMASK=255.255.255.255
EOF
ifup lo:0
3.2.2 修改 ARP 内核参数(禁用 VIP 响应)
bash
# 临时生效
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
# 永久生效
cat >> /etc/sysctl.conf << EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF
sysctl -p
参数说明:
arp_ignore:仅响应目标 IP 为接收网卡配置 IP 的 ARP 请求arp_announce=2:发送 ARP 时仅使用网卡真实 IP 作为源地址
3.2.3 验证 RS 配置
bash
yum install -y keepalived
systemctl enable keepalived --now
四、LVS + Keepalived 高可用配置(生产)
点调度器存在单点故障,通过 Keepalived 实现双机热备,自动故障转移
4.1 安装 Keepalived(两台调度器)
bash
yum install -y keepalived
systemctl enable keepalived --now
4.2 主调度器(Master)配置
文件位置:/etc/keepalived/keepalived.conf
bash
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL # 唯一标识
}
vrrp_instance VI_1 {
state MASTER # 主节点
interface eth0 # 绑定VIP的网卡
virtual_router_id 51 # 虚拟路由ID(主备一致)
priority 150 # 优先级(主>备)
advert_int 1 # 心跳间隔1秒
authentication {
auth_type PASS
auth_pass 1111 # 认证密码(主备一致)
}
virtual_ipaddress {
192.168.1.200/32 dev eth0 # VIP配置
}
}
# LVS虚拟服务配置
virtual_server 192.168.1.200 80 {
delay_loop 3 # 健康检查间隔
lb_algo rr # 调度算法(rr/wrr/lc/wlc/sh等)
lb_kind DR # DR模式
persistence_timeout 50 # 会话保持时间(0=关闭)
protocol TCP
real_server 192.168.1.101 80 {
weight 1 # 权重
TCP_CHECK { # 健康检查
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.202 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
4.3 备调度器(Backup)配置
(进修改差异部分)
bash
state BACKUP # 备节点
priority 100 # 优先级低于主节点
4.4 启动并验证高可用
bash
systemctl restart keepalived
ip addr show eth0 # 主节点应绑定VIP
tail -f /var/log/messages # 查看日志
五、NAT 模式快速部署
5.1 基础准备(所有节点)
bash
# 1. 关闭防火墙与 SELinux(生产按需开放端口)
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 2. 安装依赖
yum install -y ipvsadm net-tools vim # CentOS 7
dnf install -y ipvsadm net-tools vim # openEuler
# 3. 加载 IPVS 内核模块
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
lsmod | grep ip_vs # 验证
5.2 调度器配置
外网网卡(eth0,VIP)
bash
vim /etc/sysconfig/network-scripts/ifcfg-eth0
ini
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=203.0.113.100
NETMASK=255.255.255.0
GATEWAY=203.0.113.1 # 外网网关
DNS1=223.5.5.5
内网网卡(eth1,DIP)
bash
vim /etc/sysconfig/network-scripts/ifcfg-eth1
ini
TYPE=Ethernet
BOOTPROTO=static
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=192.168.10.1
NETMASK=255.255.255.0
# 内网网卡**不要配网关与DNS**
重启网络
systemctl restart network
# 验证
ip addr show eth0
ip addr show eth1
5.3 开启 IP 转发
bash
# 临时生效
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久生效
cat >> /etc/sysctl.conf << EOF
net.ipv4.ip_forward = 1
# 关闭重定向(避免路由异常)
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth1.send_redirects = 0
EOF
sysctl -p # 加载
5.4 配置 LVS-NAT 规则(ipvsadm)
bash
# 1. 清空旧规则
ipvsadm -C
# 2. 添加虚拟服务(VIP:80,轮询 rr)
# -A:添加虚拟服务;-t:TCP;-s:调度算法(rr/wrr/lc/wlc)
ipvsadm -A -t 203.0.113.100:80 -s rr
# 3. 添加后端 RS(-m 指定 NAT 模式)
# -a:添加RS;-r:RIP;-m:NAT;-w:权重
ipvsadm -a -t 203.0.113.100:80 -r 192.168.10.101:80 -m -w 1
ipvsadm -a -t 203.0.113.100:80 -r 192.168.10.102:80 -m -w 1
# 4. 保存规则(开机自加载)
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl enable ipvsadm --now
# 5. 查看规则
ipvsadm -Ln
输出
TCP 203.0.113.100:80 rr
-> 192.168.10.101:80 Masq 1 0 0
-> 192.168.10.102:80 Masq 1 0 0
5.5 真实服务器(RS)配置
bash
vim /etc/sysconfig/network-scripts/ifcfg-eth0
RS1
ini
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.10.101
NETMASK=255.255.255.0
GATEWAY=192.168.10.1 # 必须是调度器内网DIP
DNS1=223.5.5.5
RS2
ini
IPADDR=192.168.10.102
其余同 RS1
重启网络
bash
systemctl restart network
# 验证网关
ip route show | grep default
# 输出:default via 192.168.10.1 dev eth0
5.6 功能测试
负载均衡
bash
# 循环访问 VIP 10 次
for i in {1..10}; do curl http://203.0.113.100; done
预期结果:
RS-01: 192.168.10.101
RS-02: 192.168.10.102
RS-01: 192.168.10.101
RS-02: 192.168.10.102
...(轮询分发)
连接状态查看
bash
ipvsadm -Ln --stats # 查看连接统计
ipvsadm -Ln --rate # 查看速率
故障转移
bash
# 停止 RS1 Nginx
systemctl stop nginx@web-01
# 再次访问,所有流量自动切到 RS2
for i in {1..5}; do curl http://203.0.113.100; done
# 启动 RS1,自动恢复负载均衡
systemctl start nginx@web-01