2026/9/6 3:27:09

Keepalived 双主架构 + IPVS (LVS) 高可用联动实战

Keepalived 双主架构 + IPVS (LVS) 高可用联动实战 前言前面我们完成了 Keepalived 主备模式、抢占控制、单播心跳的配置。本篇进入企业级高级应用涵盖两大核心场景MASTER–MASTER 双主架构两台节点同时对外提供服务互为主备解决单主模式备机资源闲置问题Keepalived IPVS 联动高可用通过 Keepalived 的virtual_server自动管理 LVS 规则实现 LVS-DR 模式调度器的高可用无需手动配置 ipvsadm实验环境KA1172.25.254.50、KA2172.25.254.60 VIP 规划WEB_VIP172.25.254.100MYSQL_VIP172.25.254.1101. 实现 MASTER–MASTER 双主架构1.1 双主架构原理单主模式MASTER–BACKUP的问题同一时间只有一台节点持有 VIP、承载业务流量另一台节点完全空闲硬件资源利用率只有 50%。双主架构MASTER–MASTER通过创建两组独立的 VRRP 实例解决这个问题第一组 VRRP 实例WEB_VIPKA1 为 BackupKA2 为 Master → VIP 172.25.254.100 运行在 KA2第二组 VRRP 实例MYSQL_VIPKA1 为 MasterKA2 为 Backup → VIP 172.25.254.110 运行在 KA1两台节点同时承载业务、互为备份资源利用率提升至 100%。任意一台节点故障另一台接管全部 VIP。双主架构核心要点每个 VRRP 实例必须有唯一的 virtual_router_id不能重复每个 VIP 绑定不同的网卡别名eth0:0、eth0:1两组实例的优先级在两台节点上交叉设置1.2 KA1 节点配置KA1 上同时运行两个 VRRP 实例MYSQL_VIPKA1 为 Master优先级 100WEB_VIPKA1 为 Backup优先级 80MYSQL_VIP 实例配置[rootKA1 ~]# vim /etc/keepalived/conf.d/MYSQL_VIP.confvrrp_instance MYSQL_VIP { state MASTER # KA1作为MySQL服务的Master interface eth0 virtual_router_id 52 # VRID必须唯一与WEB_VIP的51区分 preempt_delay 10 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.25.254.110/24 dev eth0 label eth0:1 # MySQL VIP绑定eth0:1 } # 状态切换通知脚本 notify_master /etc/keepalived/scripts/VIP_change_mail.sh MASTER 100 MYSQL_VIP notify_backup /etc/keepalived/scripts/VIP_change_mail.sh BACKUP 100 MYSQL_VIP notify_fault /etc/keepalived/scripts/VIP_change_mail.sh FAULT 100 MYSQL_VIP }WEB_VIP 实例配置[rootKA1 ~]# vim /etc/keepalived/conf.d/WEB_VIP.confvrrp_instance WEB_VIP { state BACKUP # KA1作为Web服务的Backup interface eth0 virtual_router_id 51 preempt_delay 10 priority 80 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.25.254.100/24 dev eth0 label eth0:0 # Web VIP绑定eth0:0 } notify_master /etc/keepalived/scripts/VIP_change_mail.sh MASTER 80 WEB_VIP notify_backup /etc/keepalived/scripts/VIP_change_mail.sh BACKUP 80 WEB_VIP notify_fault /etc/keepalived/scripts/VIP_change_mail.sh FAULT 80 WEB_VIP }重启服务[rootKA1 ~]# systemctl restart keepalived1.3 KA2 节点配置KA2 上两个实例的角色与 KA1完全交叉MYSQL_VIPKA2 为 Backup优先级 80WEB_VIPKA2 为 Master优先级 100MYSQL_VIP 实例配置[rootKA2 ~]# vim /etc/keepalived/conf.d/MYSQL_VIP.confvrrp_instance MYSQL_VIP { state BACKUP # KA2作为MySQL服务的Backup interface eth0 virtual_router_id 52 preempt_delay 10 priority 80 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.25.254.110/24 dev eth0 label eth0:1 } notify_master /etc/keepalived/scripts/VIP_change_mail.sh MASTER 80 MYSQL_VIP notify_backup /etc/keepalived/scripts/VIP_change_mail.sh BACKUP 80 MYSQL_VIP notify_fault /etc/keepalived/scripts/VIP_change_mail.sh FAULT 80 MYSQL_VIP }WEB_VIP 实例配置[rootKA2 ~]# vim /etc/keepalived/conf.d/WEB_VIP.confvrrp_instance WEB_VIP { state MASTER # KA2作为Web服务的Master interface eth0 virtual_router_id 51 preempt_delay 10 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.25.254.100/24 dev eth0 label eth0:0 } notify_master /etc/keepalived/scripts/VIP_change_mail.sh MASTER 100 WEB_VIP notify_backup /etc/keepalived/scripts/VIP_change_mail.sh BACKUP 100 WEB_VIP notify_fault /etc/keepalived/scripts/VIP_change_mail.sh FAULT 100 WEB_VIP }重启服务[rootKA2 ~]# systemctl restart keepalived1.4 notify 状态切换通知脚本说明notify_master/notify_backup/notify_fault是 Keepalived 的状态钩子notify_master节点切换为 Master 状态时执行的脚本notify_backup节点切换为 Backup 状态时执行的脚本notify_fault节点进入故障状态时执行的脚本典型用途发送邮件告警、记录日志、触发自定义业务切换动作。脚本接收三个参数当前状态、优先级、VRRP 实例名。示例脚本/etc/keepalived/scripts/VIP_change_mail.sh#!/bin/bash # $1: 状态 MASTER/BACKUP/FAULT # $2: 优先级 # $3: VRRP实例名 STATE$1 PRIORITY$2 INSTANCE$3 HOSTNAME$(hostname) echo $(date %F %T): $HOSTNAME $INSTANCE 切换为 $STATE 状态(优先级$PRIORITY) /var/log/keepalived_notify.log # 可在此处添加邮件发送逻辑1.5 双主架构验证查看 KA1 的 IP[rootKA1 ~]# ip a输出关键部分2: eth0: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:0c:29:93:eb:8f brd ff:ff:ff:ff:ff:ff inet 172.25.254.50/24 brd 172.25.254.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet 172.25.254.110/24 scope global secondary eth0:1 valid_lft forever preferred_lft foreverKA1 持有MYSQL_VIP172.25.254.110绑定在 eth0:1。查看 KA2 的 IP[rootKA2 ~]# ip a输出关键部分2: eth0: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:0c:29:81:44:a2 brd ff:ff:ff:ff:ff:ff inet 172.25.254.60/24 brd 172.25.254.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet 172.25.254.100/24 scope global secondary eth0:0 valid_lft forever preferred_lft foreverKA2 持有WEB_VIP172.25.254.100绑定在 eth0:0。双主模式运行状态总结表格节点持有 VIP承载业务KA1172.25.254.110eth0:1MySQL 负载均衡KA2172.25.254.100eth0:0Web 负载均衡两台节点同时工作资源利用率 100%。1.6 故障切换测试模拟 KA1 节点故障[rootKA1 ~]# systemctl stop keepalived.service查看 KA2 的 IP[rootKA2 ~]# ip a | grep inet 172.25.254 inet 172.25.254.60/24 brd 172.25.254.255 scope global noprefixroute eth0 inet 172.25.254.100/24 scope global secondary eth0:0 inet 172.25.254.110/24 scope global secondary eth0:1KA1 故障后KA2同时接管了两个 VIP172.25.254.100 和 172.25.254.110Web 和 MySQL 业务均不中断。恢复 KA1 后由于配置了preempt_delay 10等待 10 秒后 KA1 会重新抢回 MYSQL_VIP恢复双主并行状态。2. 实现 IPVSLVS的高可用性Keepalived 内置IPVS wrapper模块可以通过配置文件中的virtual_server段自动生成 LVSIPVS负载均衡规则无需手动执行ipvsadm命令。同时结合 VRRP 实现 LVS 调度器本身的高可用。2.1 IPVS 相关配置详解2.1.1 virtual_server 三种定义方式virtual_server IP port # 方式1直接指定VIP和端口 virtual_server fwmark int # 方式2基于防火墙标记fwmark实现端口无关的负载均衡 virtual_server group string # 方式3引用虚拟服务器组2.1.2 virtual_server 完整配置结构virtual_server VIP PORT { # 虚拟服务器VIP和端口 delay_loop INT # 后端健康检查间隔秒 lb_algo rr|wrr|lc|wlc|lblc|sh|dh # 调度算法 lb_kind NAT|DR|TUN # LVS工作模式注意必须大写 persistence_timeout INT # 持久连接超时时间 protocol TCP|UDP|SCTP # 协议类型 sorry_server IP PORT # 所有RS故障时的备用报错服务器 real_server RS_IP PORT { # 后端真实服务器 weight INT # 权重 notify_up 脚本路径 # RS上线通知脚本 notify_down 脚本路径 # RS下线通知脚本 HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC_CHECK { # 健康检查方法配置 } } }⚠️重要语法注意大括号必须分行写}}写在同一行会导致配置解析错误。2.1.3 应用层健康检测 HTTP_GET / SSL_GETHTTP_GET | SSL_GET { url { path /index.html # 监控的URL路径 status_code 200 # 判定健康的响应状态码 } connect_timeout 3 # 连接超时时间秒 nb_get_retry 3 # 检测失败重试次数 delay_before_retry 3 # 重试间隔时间秒 connect_ip IP # 健康检测目标IP默认用RS的IP connect_port PORT # 健康检测目标端口默认用RS端口 bindto IP # 发起检测的源IP bind_port PORT # 发起检测的源端口 }2.1.4 传输层健康检测 TCP_CHECKTCP_CHECK { connect_ip IP # 检测目标IP connect_port PORT # 检测目标端口 bindto IP # 源IP bind_port PORT # 源端口 connect_timeout 5 # 连接超时时间 }TCP_CHECK 仅尝试建立 TCP 连接不发送 HTTP 请求比 HTTP_GET 更轻量适合 MySQL、Redis 等非 HTTP 服务。2.2 实战案例一单主 LVS‑DR 模式高可用实验目标通过 Keepalived 自动管理 LVS-DR 规则实现 Web 服务的负载均衡同时 Keepalived 保障调度器高可用。第一步后端 RS 服务器配置LVS-DR 模式要求LVS-DR 模式要求后端 RS 在 lo 回环网卡上配置 VIP并抑制 ARP 响应。以下操作在 RS1 和 RS2 上均执行。1. 准备 Web 页面[rootRS1 ~]# echo RS1-172.25.254.10 /var/www/html/index.html [rootRS2 ~]# echo RS2-172.25.254.20 /var/www/html/index.html2. 在 lo 网卡上配置 VIP[rootRS1 ~]# cd /etc/NetworkManager/system-connections/ [rootRS1 system-connections]# cp -p eth0.nmconnection lo.nmconnection # ⚠️ 网卡配置文件权限必须为600 [rootRS1 system-connections]# vim lo.nmconnection[connection] idlo typeloopback interface-namelo [ipv4] methodmanual address1127.0.0.1/8 address2172.25.254.100/32激活 lo 网卡[rootRS1 system-connections]# nmcli connection reload [rootRS1 system-connections]# nmcli connection up lo3. 配置 ARP 抑制DR 模式必须[rootRS1 ~]# vim /etc/sysctl.conf net.ipv4.conf.all.arp_ignore1 net.ipv4.conf.all.arp_announce2 net.ipv4.conf.lo.arp_announce2 net.ipv4.conf.lo.arp_ignore1[rootRS1 ~]# sysctl -p net.ipv4.conf.all.arp_ignore 1 net.ipv4.conf.all.arp_announce 2 net.ipv4.conf.lo.arp_announce 2 net.ipv4.conf.lo.arp_ignore 1RS2 执行完全相同的配置。第二步KA 节点安装 ipvsadm[rootKA1 ~]# dnf install ipvsadm -y [rootKA2 ~]# dnf install ipvsadm -y第三步Keepalived 配置 virtual_server在 KA1 和 KA2 的 WEB_VIP 子配置文件中追加virtual_server段VRRP 实例和 virtual_server 写在同一文件中[rootKA1 ~]# vim /etc/keepalived/conf.d/WEB_VIP.confvrrp_instance WEB_VIP { state BACKUP interface eth0 virtual_router_id 51 preempt_delay 10 priority 80 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.25.254.100/24 dev eth0 label eth0:0 } } # LVS虚拟服务器配置DR模式 virtual_server 172.25.254.100 80 { delay_loop 6 lb_algo rr lb_kind DR protocol TCP real_server 172.25.254.10 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 retry 3 delay_before_retry 1 } } real_server 172.25.254.20 80 { weight 1 TCP_CHECK { connect_timeout 5 retry 3 delay_before_retry 3 connect_port 80 } } }KA2 配置完全相同VRRP 实例部分按双主 / 单主角色调整 priority 即可。两台节点均重启服务[rootKA1 ~]# systemctl restart keepalived [rootKA2 ~]# systemctl restart keepalived第四步验证 IPVS 规则自动生成在当前持有 VIP 的 Master 节点假设为 KA2上查看[rootKA2 ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size4096) Prot LocalAddress:Port Scheduler Flags - RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.25.254.100:80 rr - 172.25.254.10:80 Route 1 0 0 - 172.25.254.20:80 Route 1 0 0Keepalived 自动生成了 LVS-DR 规则Forward列为Route表示 DR 模式无需手动执行 ipvsadm 命令。第五步客户端访问测试[rootclient ~]# for i in {1..10};do curl 172.25.254.100;done RS2-172.25.254.20 RS1-172.25.254.10 RS2-172.25.254.20 RS1-172.25.254.10 RS2-172.25.254.20 RS1-172.25.254.10 RS2-172.25.254.20 RS1-172.25.254.10 RS2-172.25.254.20 RS1-172.25.254.10LVS-DR 轮询调度正常Keepalived IPVS 联动成功。2.3 实战案例二双主分别实现 HTTP 和 MySQL 调度在双主架构基础上KA1 承载 MySQL LVS 调度VIP 172.25.254.110:3306KA2 承载 Web LVS 调度VIP 172.25.254.100:80。第一步后端 RS 配置 MySQL 服务RS1 和 RS2 均安装配置 MariaDB[rootRS1 ~]# dnf install mariadb-server -y [rootRS1 ~]# vim /etc/my.cnf.d/mariadb-server.cnf[mysqld] server-id10 # RS1设为10RS2设为20用于验证调度结果 datadir/var/lib/mysql socket/var/lib/mysql/mysql.sock log-error/var/log/mariadb/mariadb.log pid-file/run/mariadb/mariadb.pid[rootRS1 ~]# systemctl enable --now mariadb登录 MySQL 创建远程连接用户MariaDB [(none)] create user dragon% identified by 123; MariaDB [(none)] grant all on *.* to dragon%;客户端直连测试两台 MySQL[rootclient ~]# mysql -udragon -p123 -h172.25.254.10 [rootclient ~]# mysql -udragon -p123 -h172.25.254.20均能正常登录MySQL 服务部署完成。第二步RS 的 lo 网卡追加 MySQL VIP在 RS1 和 RS2 的 lo 配置中追加第二个 VIP[rootRS1 ~]# vim /etc/NetworkManager/system-connections/lo.nmconnection[ipv4] methodmanual address1127.0.0.1/8 address2172.25.254.100/32 address3172.25.254.110/32 # 追加MySQL VIP[rootRS1 ~]# nmcli connection reload [rootRS1 ~]# nmcli connection up lo验证 lo 网卡 VIP[rootRS2 ~]# ip a | grep inet 172.25.254 inet 172.25.254.100/32 scope global lo inet 172.25.254.110/32 scope global loARP 抑制参数在上一个实验已配置无需重复。第三步Keepalived 配置 MySQL 的 virtual_server在 KA1 和 KA2 的MYSQL_VIP.conf中追加 MySQL LVS 配置[rootKA1 ~]# vim /etc/keepalived/conf.d/MYSQL_VIP.confvrrp_instance MYSQL_VIP { state MASTER interface eth0 virtual_router_id 52 preempt_delay 10 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.25.254.110/24 dev eth0 label eth0:1 } } # MySQL LVS虚拟服务器DR模式 virtual_server 172.25.254.110 3306 { delay_loop 6 lb_algo rr lb_kind DR protocol TCP real_server 172.25.254.10 3306 { weight 1 TCP_CHECK { connect_timeout 5 retry 3 delay_before_retry 3 connect_port 3306 } } real_server 172.25.254.20 3306 { weight 1 TCP_CHECK { connect_timeout 5 retry 3 delay_before_retry 3 connect_port 3306 } } }KA2 配置相同VRRP priority 按双主角色调整为 80。两台均重启服务。第四步双业务访问验证Web 服务测试VIP 172.25.254.100运行在 KA2[rootclient ~]# for i in {1..10};do curl 172.25.254.100;done RS2-172.25.254.20 RS1-172.25.254.10 RS2-172.25.254.20 RS1-172.25.254.10 ...MySQL 服务测试VIP 172.25.254.110运行在 KA1[rootclient ~]# mysql -udragon -p123 -h172.25.254.110 MariaDB [(none)] select server_id; ------------- | server_id | ------------- | 20 | -------------退出后再次连接[rootclient ~]# mysql -udragon -p123 -h172.25.254.110 MariaDB [(none)] select server_id; ------------- | server_id | ------------- | 10 | -------------两次连接分别调度到 server_id20RS2和 server_id10RS1MySQL LVS 轮询调度正常。本章总结双主架构 MASTER–MASTER通过两组 VRRP 实例不同 VRID实现两台节点同时承载业务互为主备资源利用率 100%。任意节点故障另一台接管全部 VIP。notify 通知脚本notify_master/backup/fault在状态切换时触发自定义脚本用于邮件告警和日志记录。Keepalived IPVS 联动通过virtual_server配置段自动生成 LVS 规则无需手动 ipvsadm。支持 HTTP_GET应用层和 TCP_CHECK传输层两种健康检查。LVS-DR 模式配合后端 RS 需在 lo 网卡配置 VIP/32 掩码并开启 ARP 抑制arp_ignore1, arp_announce2。双业务双主调度KA1 承载 MySQL LVSVIP .110:3306KA2 承载 Web LVSVIP .100:80两台调度器同时工作完整实现企业级高可用负载均衡架构。整个 Keepalived 系列到此形成完整闭环基础原理 → 安装配置 → 主备模式 → 抢占控制 → 单播心跳 → 双主架构 → IPVS 联动高可用。