Keepalived 是实现 HAProxy 高可用的核心工具,它通过 VRRP 协议(虚拟路由冗余协议)为两台 HAProxy 调度器提供虚拟 IP(VIP) 故障自动切换能力,避免单台 HAProxy 宕机导致整个服务不可用。下面从核心原理、实验环境、配置步骤、验证方法全维度讲解。
一、Keepalived 核心认知
1. 核心作用
- 为 HAProxy 集群提供VIP(虚拟 IP) ,所有客户端请求都访问这个 VIP;
- 实时监控 HAProxy 服务状态,当主 HAProxy 宕机 / 服务异常时,自动将 VIP 切换到备 HAProxy;
- 主 HAProxy 恢复后,可配置自动 / 手动切回(生产建议手动切回,避免抖动)。
2. 核心概念

二、实验环境准备
1. 实验拓扑(基于之前的 HAProxy 环境扩展)
| 主机角色 | IP 地址(内网) | VIP(虚拟 IP) | 软件配置 |
|---|---|---|---|
| HAProxy 主节点(MASTER) | 192.168.0.100 | 172.25.254.100 | HAProxy + Keepalived(主) |
| HAProxy 备节点(BACKUP) | 192.168.0.101 | 172.25.254.100 | HAProxy + Keepalived(备) |
| WebServer1 | 192.168.0.10 | - | httpd |
| WebServer2 | 192.168.0.20 | - | httpd |
2. 前置条件
- 两台 HAProxy 节点都已安装并配置好 HAProxy(负载均衡规则一致);
- 所有节点关闭防火墙 /selinux(实验环境简化):
bash
systemctl stop firewalld && systemctl disable firewalld
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
- 两台 HAProxy 节点能互相 ping 通,且能访问后端 Web 服务器。
三、Keepalived 安装与配置(核心实验)
1. 安装 Keepalived(两台 HAProxy 节点都执行)
bash
dnf install keepalived -y # CentOS/RHEL 8+
# 验证安装
rpm -qa keepalived
2. 主节点(192.168.0.100)配置
编辑 Keepalived 主配置文件/etc/keepalived/keepalived.conf:
bash
! Configuration File for keepalived
global_defs {
router_id HA_PROXY_MASTER # 节点标识,唯一即可
}
# 自定义脚本:监控HAProxy服务状态
vrrp_script check_haproxy {
script "/usr/bin/systemctl is-active haproxy" # 检查HAProxy是否运行
interval 2 # 检查间隔(秒)
weight -20 # 检查失败则优先级减20
}
vrrp_instance VI_1 {
state MASTER # 主节点标识
interface eth0 # 绑定VIP的网卡(外网网卡)
virtual_router_id 51 # VRRP组ID(主备必须一致,范围0-255)
priority 100 # 主节点优先级(高于备节点)
advert_int 1 # VRRP通告间隔(秒)
nopreempt # 关闭抢占模式(可选,生产建议开启,避免主恢复后抢占VIP导致抖动)
authentication {
auth_type PASS # 认证类型
auth_pass 1111 # 认证密码(主备必须一致)
}
virtual_ipaddress {
172.25.254.100/24 # 虚拟IP(VIP),和之前HAProxy的外网IP一致
}
# 调用上面的HAProxy健康检查脚本
track_script {
check_haproxy
}
}
3. 备节点(192.168.0.101)配置
编辑/etc/keepalived/keepalived.conf,仅需修改 3 处:
bash
! Configuration File for keepalived
global_defs {
router_id HA_PROXY_BACKUP # 备节点标识
}
vrrp_script check_haproxy {
script "/usr/bin/systemctl is-active haproxy"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP # 备节点标识
interface eth0
virtual_router_id 51 # 和主节点一致
priority 90 # 优先级低于主节点(100)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 # 和主节点一致
}
virtual_ipaddress {
172.25.254.100/24 # 同一个VIP
}
track_script {
check_haproxy
}
}
- 启动 Keepalived(两台节点都执行)
bash
# 启动并开机自启
systemctl enable --now keepalived
# 查看状态
systemctl status keepalived
四、实验验证(核心步骤)
1. 验证 VIP 默认在主节点
- 主节点执行
ip a show eth0,能看到 VIP(172.25.254.100):
bash
[root@haproxy-master ~]# ip a show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 192.168.0.100/24 brd 192.168.0.255 scope global eth0
inet 172.25.254.100/24 scope global secondary eth0 # VIP已绑定
2. 验证 VIP 访问正常
客户端访问 VIP(172.25.254.100),能正常轮询访问 Web1/Web2:
bash
curl 172.25.254.100
# 交替输出:
# webserver1 - 192.168.0.10
# webserver2 - 192.168.0.20
3. 模拟主节点故障,验证 VIP 切换
(1)停止主节点的 HAProxy 服务(模拟故障)
bash
[root@haproxy-master ~]# systemctl stop haproxy
(2)观察备节点 VIP
备节点执行ip a show eth0,能看到 VIP 已自动绑定:
bash
[root@haproxy-backup ~]# ip a show eth0
inet 192.168.0.101/24 brd 192.168.0.255 scope global eth0
inet 172.25.254.100/24 scope global secondary eth0 # VIP已切换过来
(3)验证 VIP 访问仍正常
客户端再次访问curl 172.25.254.100,依然能正常轮询,服务无中断。
4. 验证主节点恢复后 VIP 切回(可选)
- 启动主节点的 HAProxy:
bash
[root@haproxy-master ~]# systemctl start haproxy
- 若开启了
nopreempt(关闭抢占),VIP 不会自动切回;若未开启,主节点优先级更高,VIP 会自动切回。
五、常见问题排查
-
VIP 无法绑定:
- 检查
interface配置的网卡是否正确(如 eth0/eth1); - 检查防火墙 /selinux 是否关闭;
- 检查主备
virtual_router_id和auth_pass是否一致。
- 检查
-
故障后 VIP 不切换:
- 检查健康检查脚本是否正确(
systemctl is-active haproxy返回 0 表示正常); - 检查
weight配置是否合理(优先级减少后是否低于备节点); - 查看 Keepalived 日志:
journalctl -u keepalived -f。
- 检查健康检查脚本是否正确(
六、核心总结
- Keepalived 核心:基于 VRRP 协议实现 VIP 故障切换,核心是 "优先级 + 健康检查",确保 HAProxy 集群无单点故障。
- 配置关键 :
- 主备节点的
virtual_router_id、auth_pass必须一致; - 主节点优先级 > 备节点;
- 一定要配置 HAProxy 健康检查脚本,避免 HAProxy 进程挂了但 Keepalived 未感知。
- 主备节点的
- 实验验证重点 :
- 正常状态下 VIP 在主节点;
- 主节点故障后 VIP 自动切到备节点;
- 切换后服务无中断,这是高可用的核心目标。