LVS+Keepalived DR 模式高可用集群(Ubuntu 24.04)
整体架构与 IP 规划
在您原有 DR 模式基础上,增加一台 备用的 LVS 分发器(lvs2)。两台 LVS 通过 Keepalived 的 VRRP 协议共享同一个 VIP(192.168.2.100),实现主备自动切换。
┌─────────────────────────────┐
│ 路由器 router │
│ ens37 外网 192.168.1.10 │
│ ens33 内网 192.168.2.10 │
└─────────────┬───────────────┘
上网(网关) │
┌───────────────┬──────────────────┼───────────────────┬───────────────┐
│ │ │ │ │
┌──┴───┐ ┌────┴────┐ ┌─────┴────┐ ┌────┴────┐ ┌────┴────┐
│Client│ │ LVS1 │ │ LVS2 │ │ RS1 │ │ RS2 │
│.2.50 │ │(MASTER) │ │(BACKUP) │ │ .2.210 │ │ .2.220 │
└──────┘ │ .2.200 │ │ .2.150 │ └─────────┘ └─────────┘
│ └────┬────┘ └────┬────┘ lo:VIP .2.100 lo:VIP .2.100
│ VIP .2.100 (浮动) │ ARP抑制 ARP抑制
└───访问VIP ────┴─────────────────┴─── LVS改MAC转发 ───→ RS1/RS2 ──直接回包──→ Client环境规划表(新增 lvs2)
变化点:VIP 不再手动绑在 lvs1 上,而是由 Keepalived 自动管理(主节点持有,备节点 standby)。
前期准备(所有机器)
# 更新软件源
sudo apt update && sudo apt upgrade -y
# 关闭防火墙
sudo ufw disable
sudo systemctl stop ufw
sudo systemctl disable ufw路由器配置(与您原有笔记完全一致)
# 编辑配置文件
vim /etc/netplan/50-cloud-init.yaml
# 替换以下内容
network:
ethernets:
ens33: # 内网口
addresses:
- 192.168.2.10/24
ens37: # 外网口(VMware NAT)
addresses:
- 192.168.1.10/24 # 避开 .1 和 .2
routes:
- to: default
via: 192.168.1.2 # VMware NAT 网关
nameservers:
addresses:
- 114.114.114.114
- 8.8.8.8
version: 2
# 刷新配置
sudo netplan apply
# 开启转发 + NAT
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
sudo iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o ens37 -j MASQUERADE
# 持久化 NAT 规则
sudo apt install -y iptables-persistent
sudo netfilter-persistent saveRS1 / RS2 配置
4.1 网卡配置
# 编辑配置文件
vim /etc/netplan/50-cloud-init.yaml
# 替换以下内容
network:
ethernets:
ens33:
addresses:
- 192.168.2.210/24 # RS2 改为 192.168.2.220/24
routes:
- to: default
via: 192.168.2.10
nameservers:
addresses:
- 114.114.114.114
- 8.8.8.8
version: 2
# 刷新配置
sudo netplan apply绑定 VIP 到 lo(Non-ARP)+ 开机自启
sudo ip addr add 192.168.2.100/32 dev lo
# 开机自启
sudo tee /etc/systemd/system/lvs-rs-boot.service <<'EOF'
[Unit]
Description=RS 开机配置(绑定VIP到lo)
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'ip addr replace 192.168.2.100/32 dev lo'
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
# 加载配置、开机自启、启动
sudo systemctl daemon-reload
sudo systemctl enable lvs-rs-boot.service
sudo systemctl start lvs-rs-boot.serviceARP 抑制 + 关闭 rp_filter
# 临时生效
echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 | sudo tee /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 | sudo tee /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 | sudo tee /proc/sys/net/ipv4/conf/ens33/rp_filter
# 持久化
sudo tee /etc/sysctl.d/99-lvs-dr.conf <<'EOF'
net.ipv4.ip_forward = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.ens33.rp_filter = 0
EOF
sudo sysctl -p /etc/sysctl.d/99-lvs-dr.conf安装 Web 服务
sudo apt install nginx -y
echo "rs1" | sudo tee /var/www/html/index.html # RS2 写 rs2
sudo systemctl start nginx
sudo systemctl enable nginxLVS1(MASTER)和 LVS2(BACKUP)配置
这是 与之前单机部署笔记最大的不同点:不再手动管理 VIP 和 ipvsadm 规则,全部交由 Keepalived 管理。
网卡配置
LVS1 (192.168.2.200):
# 编辑配置文件
vim /etc/netplan/50-cloud-init.yaml
# 替换以下内容
network:
ethernets:
ens33:
addresses:
- 192.168.2.200/24 # LVS2 修改 IP 地址为 192.168.2.150/24
routes:
- to: default
via: 192.168.2.10
nameservers:
addresses:
- 114.114.114.114
- 8.8.8.8
version: 2
# 刷新配置
sudo netplan apply安装 Keepalived 和 ipvsadm
sudo apt update
sudo apt install keepalived ipvsadm -y加载内核模块
sudo modprobe ip_vs
sudo modprobe ip_vs_rr
echo "ip_vs" | sudo tee -a /etc/modules
echo "ip_vs_rr" | sudo tee -a /etc/modules配置 Keepalived(核心)
LVS1 (MASTER) 配置文件:/etc/keepalived/keepalived.conf
# 复制示例文件为正式配置文件
sudo cp /etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf
# 编辑正式配置文件
sudo vim /etc/keepalived/keepalived.conf
# 添加以下内容
! Configuration File for keepalived
global_defs {
router_id lvs_1 # 集群内唯一标识
}
# VRRP 实例:管理 VIP 的漂移
vrrp_instance VI_1 {
state MASTER # LVS1 为主
interface ens33 # 绑定的物理网卡
virtual_router_id 51 # 虚拟路由 ID,主备必须一致(1-255)
priority 100 # 优先级,MASTER 要高于 BACKUP
advert_int 1 # 心跳通告间隔(秒)
authentication {
auth_type PASS
auth_pass 1111 # 认证密码,主备一致
}
virtual_ipaddress {
192.168.2.100/24 dev ens33 label ens33:0 # VIP 绑定在 ens33:0 上
}
}
# LVS 虚拟服务器配置
virtual_server 192.168.2.100 80 {
delay_loop 6 # 健康检查间隔(秒)
lb_algo rr # 调度算法:轮询
lb_kind DR # 工作模式:直接路由
nat_mask 255.255.255.0
# persistence_timeout 50 # 持久连接超时(可选,注释掉则无持久)
protocol TCP
# 真实服务器 RS1
real_server 192.168.2.210 80 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
# 真实服务器 RS2
real_server 192.168.2.220 80 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
}LVS2 (BACKUP) 配置文件:/etc/keepalived/keepalived.conf
与 LVS1 基本相同,只修改两处:
global_defs {
router_id lvs_2 # 改为 lvs_2,区分标识
}
vrrp_instance VI_1 {
state BACKUP # 改为 BACKUP
interface ens33
virtual_router_id 51 # 必须与 LVS1 相同
priority 10 # 优先级低于 MASTER(100 > 10)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.100/24 dev ens33 label ens33:0
}
}
# virtual_server 部分与 LVS1 完全相同
virtual_server 192.168.2.100 80 {
...
}启动 Keepalived 并验证
在两台 LVS 上分别执行:
sudo systemctl start keepalived
sudo systemctl enable keepalived验证 VIP 是否只在 MASTER 上:
# 在 LVS1 上查看
ip addr show ens33 | grep 192.168.2.100
# 应该能看到 192.168.2.100/24 ... ens33:0
# 在 LVS2 上查看
ip addr show ens33 | grep 192.168.2.100
# 应该没有输出(BACKUP 不持有 VIP)验证 LVS 规则是否自动生成(Keepalived 会自动配置 ipvsadm):
sudo ipvsadm -Ln
# 应该看到:
# IP Virtual Server version ...
# Prot LocalAddress:Port Scheduler Flags
# -> RemoteAddress:Port Forward Weight ActiveConn InActConn
# TCP 192.168.2.100:80 rr
# -> 192.168.2.210:80 Route 1 0 0
# -> 192.168.2.220:80 Route 1 0 0重要:Keepalived 启动后会自动添加 ipvsadm 规则,无需再手动执行
ipvsadm命令。如果需要清空规则,sudo ipvsadm -C后重启 keepalived 即可恢复。
Client 测试客户端配置
# 编辑配置文件
vim /etc/netplan/50-cloud-init.yaml
# 编辑以下内容
network:
ethernets:
ens33:
addresses:
- 192.168.2.50/24
routes:
- to: default
via: 192.168.2.10
nameservers:
addresses:
- 114.114.114.114
- 8.8.8.8
version: 2
# 刷新配置
sudo netplan apply
# 安装curl测试
sudo apt install curl -y验证与测试
基本负载均衡测试
# 通过 VIP 访问,轮询应显示 rs1 / rs2 交替
for i in {1..10}; do curl -s http://192.168.2.100; echo; done高可用故障切换测试(核心验证)
测试1:LVS1(MASTER)故障,VIP 自动漂移到 LVS2
# 在 LVS1 上停止 keepalived
sudo systemctl stop keepalived
# 在 LVS1 上检查 VIP 是否释放
ip addr show ens33 | grep 192.168.2.100 # 应无输出
# 在 LVS2 上检查 VIP 是否接管
ip addr show ens33 | grep 192.168.2.100 # 应看到 VIP
# 在 Client 上继续访问,服务应正常
for i in {1..4}; do curl -s http://192.168.2.100; echo; done测试2:LVS1 恢复,VIP 自动漂移回来
# 在 LVS1 上重启 keepalived
sudo systemctl start keepalived
# 等待几秒后,VIP 应回到 LVS1(因为优先级更高)
ip addr show ens33 | grep 192.168.2.100 # LVS1 上应恢复测试3:真实服务器故障,自动剔除
# 在 RS1 上停止 nginx
sudo systemctl stop nginx
# 在 Client 上连续访问,应全部返回 rs2
for i in {1..6}; do curl -s http://192.168.2.100; echo; done
# 在 LVS1 上查看连接统计,应只有 RS2 有 ActiveConn
sudo ipvsadm -Ln --stats
# 恢复 RS1
sudo systemctl start nginx
# 等待约 6 秒(delay_loop 间隔)后,RS1 重新加入轮询开机自启完整方案
LVS 节点(lvs1 / lvs2)
Keepalived 服务已自启,不需要 再单独配置 lvs-boot.service:
sudo systemctl enable keepalivedRS 节点(rs1 / rs2)
按照第四节的配置,lvs-rs-boot.service 已配置自启,ARP 参数已写入 sysctl.d:
sudo systemctl enable lvs-rs-boot.service路由器
NAT 规则已通过 iptables-persistent 持久化。
Keepalived 常用命令速查
DR + Keepalived vs 纯手动 LVS 对比
常见问题排查(针对 Keepalived)
最终目录结构(配置文件清单)
路由器 (router):
/etc/netplan/50-cloud-init.yaml
/etc/sysctl.conf (net.ipv4.ip_forward=1)
iptables NAT 规则 (iptables-persistent)
LVS1 / LVS2 (lvs1/lvs2):
/etc/netplan/50-cloud-init.yaml
/etc/keepalived/keepalived.conf ← 核心配置
/etc/modules (ip_vs, ip_vs_rr)
RS1 / RS2 (rs1/rs2):
/etc/netplan/50-cloud-init.yaml
/etc/systemd/system/lvs-rs-boot.service
/etc/sysctl.d/99-lvs-dr.conf
/var/www/html/index.html
Client:
/etc/netplan/50-cloud-init.yamlLVS+Keepalived DR 模式高可用集群
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法