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)

机器

主机名

网卡

IP地址

网关

特殊配置

路由器

router

ens33

192.168.2.10

无(网关角色)

开启转发 + NAT

ens37

192.168.1.10

192.168.1.2

VMware NAT 网关

LVS1

lvs1

ens33

192.168.2.200

192.168.2.10

Keepalived MASTER,VIP 浮动

LVS2

lvs2

ens33

192.168.2.150

192.168.2.10

Keepalived BACKUP,VIP 浮动

RS1

rs1

ens33

192.168.2.210

192.168.2.10

lo 绑 VIP + ARP 抑制

RS2

rs2

ens33

192.168.2.220

192.168.2.10

lo 绑 VIP + ARP 抑制

Client

client

ens33

192.168.2.50

192.168.2.10

测试机

VIP

—

—

192.168.2.100:80

—

由 Keepalived 管理,浮动于 LVS1/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 save

RS1 / 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.service

ARP 抑制 + 关闭 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 nginx

LVS1(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 keepalived

RS 节点(rs1 / rs2)

按照第四节的配置,lvs-rs-boot.service 已配置自启,ARP 参数已写入 sysctl.d:

 sudo systemctl enable lvs-rs-boot.service

路由器

NAT 规则已通过 iptables-persistent 持久化。

Keepalived 常用命令速查

操作

命令

启动 Keepalived

sudo systemctl start keepalived

停止 Keepalived

sudo systemctl stop keepalived

重启 Keepalived

sudo systemctl restart keepalived

查看 Keepalived 状态

sudo systemctl status keepalived

查看 VRRP 心跳日志

sudo journalctl -u keepalived -f

查看当前 VIP 归属

ip addr show ens33

查看 LVS 规则

sudo ipvsadm -Ln

查看 LVS 连接统计

sudo ipvsadm -Ln --stats

查看 LVS 活跃连接

sudo ipvsadm -Lnc

DR + Keepalived vs 纯手动 LVS 对比

项目

纯手动 LVS(您的原笔记)

LVS + Keepalived(本方案)

VIP 管理

手动 ip addr add,无故障切换

Keepalived 自动漂移,主备切换

真实服务器健康检查

无,故障 RS 仍被调度

TCP_CHECK 自动剔除故障 RS

开机自启

需自定义 systemd 服务

Keepalived 自带服务,规则自动恢复

适用场景

实验/临时环境

生产环境高可用必备

配置复杂度

低

中等(主要为 keepalived.conf)

常见问题排查(针对 Keepalived)

问题

检查方法

解决方案

VIP 不出现

systemctl status keepalived

检查配置语法、确保主备 virtual_router_id 和 auth_pass 一致

VIP 在 LVS1 和 LVS2 同时出现(脑裂)

检查防火墙是否放行 VRRP(协议 112)

sudo ufw allow proto vrrp 或关闭防火墙

Keepalived 启动但 ipvsadm 规则为空

查看日志 journalctl -u keepalived -f

检查 virtual_server 块语法,确保 real_server 配置正确

主备切换后连接中断

客户端是否有持久连接

生产环境可开启 persistence_timeout 保持会话亲和性

LVS1 恢复后 VIP 不抢回

检查 preempt 策略(默认开启)

确保优先级(priority)配置正确,MASTER > BACKUP

VRRP 通告被拦截

sudo tcpdump -nn -vvv vrrp

检查交换机/防火墙是否允许组播 224.0.0.18 或 VRRP 协议

最终目录结构(配置文件清单)

 路由器 (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.yaml