HAProxy 集群配合 Keepalived 实现 VIP 高可用,核心是在多台服务器上部署 Keepalived 通过 VRRP 协议管理虚拟 IP,当主节点 HAProxy 故障时 VIP 自动漂移到备节点。适用场景是 TCP/HTTP 负载均衡入口需要避免单点故障,风险边界在于防火墙需放行 VRRP 协议且需防止脑裂。
先说结论:Keepalived 负责 VIP 浮动与节点健康检查,HAProxy 负责流量转发,两者结合可实现负载均衡入口的秒级故障切换。
- 适合:生产环境需要高可用的 TCP 或 HTTP 负载均衡架构。
- 先准备:确保服务器内网互通、时间同步、防火墙放行 VRRP 协议(协议号 112)。
- 验收:手动停止主节点 HAProxy 服务,观察 VIP 是否漂移至备节点且业务不中断。
命令速用版
以下命令适用于主流 Linux 发行版,用于快速安装并启动服务。
# Ubuntu/Debian 安装
apt update && apt install haproxy keepalived -y
# CentOS/RHEL 安装
yum install haproxy keepalived -y
# 开启 IP 非本地绑定(必需,否则 VIP 无法绑定)
echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
sysctl -p
# 启动服务
systemctl enable `--now` haproxy
systemctl enable `--now` keepalived为什么会这样
Keepalived 通过 VRRP 协议选举 Master 节点持有 VIP,当检测到 HAProxy 进程异常时降低优先级触发切换。
Keepalived 守护进程会在集群节点间发送 VRRP 广播,默认优先级高的节点成为 Master 并绑定虚拟 IP。配置中包含 vrrp_script 脚本,定期检查 HAProxy 进程状态。如果主节点 HAProxy 挂掉,脚本检测失败,Keepalived 自动降低该节点优先级,备节点检测到主节点优先级低于自己后,接管 VIP 并启动 HAProxy 服务,从而实现流量无缝切换。
分步处理
配置过程分为 HAProxy 基础配置、Keepalived 健康检查脚本、Keepalived 主配置文件三步。
1. 配置 HAProxy
编辑 /etc/haproxy/haproxy.cfg,确保监听地址包含 VIP 或 0.0.0.0。
global
log /dev/log local0
maxconn 4096
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http_front
bind *:80
default_backend http_back
backend http_back
balance roundrobin
server web1 192.168.1.10:80 check
server web2 192.168.1.11:80 check2. 编写健康检查脚本
在 /etc/keepalived 目录下创建 check_haproxy.sh,用于检测 HAProxy 是否存活。
#!/bin/bash
if ! killall -0 haproxy; then
exit 1
fi
exit 0赋予执行权限:chmod +x /etc/keepalived/check_haproxy.sh。
3. 配置 Keepalived
编辑主节点 /etc/keepalived/keepalived.conf,设置较高优先级。
vrrp_script chk_haproxy { script "/etc/keepalived/check_haproxy.sh" interval 2 weight -20 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_haproxy } virtual_ipaddress { 192.168.1.100 } }备节点配置类似,将
state改为BACKUP,priority改为小于 100 的值(如 90)。怎么验证是否生效
通过查看 IP 地址状态和日志确认 VIP 漂移情况。
1. 检查 VIP 是否存在
在主节点执行
ip addr show,确认 eth0 接口下是否有192.168.1.100。2. 模拟故障切换
在主节点停止 HAProxy 服务:
systemctl stop haproxy。等待约 3-5 秒后,在备节点执行ip addr show,应看到 VIP 出现在备节点网卡上。3. 查看 Keepalived 日志
检查
/var/log/syslog或/var/log/messages,搜索Keepalived关键字,确认是否有Entering FAULT STATE或Master状态变更记录。常见坑
配置过程中容易因防火墙或参数冲突导致切换失败。
- 防火墙拦截 VRRP:VRRP 使用协议号 112,不是 TCP/UDP 端口。iptables 或 firewalld 需放行该协议,否则备节点收不到心跳包会误判为主节点宕机,导致双主脑裂。
- IP 非本地绑定未开启:未设置
net.ipv4.ip_nonlocal_bind = 1时,Keepalived 尝试绑定 VIP 会失败,日志报错Cannot assign requested address。 - 脚本权限不足:健康检查脚本必须有执行权限,且 Keepalived 进程用户(通常 root)需能读取执行,否则检测一直失败导致优先级持续降低。
- virtual_router_id 冲突:同一局域网内不同 Keepalived 集群的
virtual_router_id不能相同,否则会发生 IP 地址冲突。
常见问题
VIP 没有漂移到备节点怎么办?
首先检查备节点 Keepalived 服务状态和日志报错。
常见原因是防火墙阻挡了 VRRP 广播包,或者主节点的健康检查脚本未正确降低优先级。登录备节点查看 systemctl status keepalived,确认是否处于 BACKUP 或 MASTER 状态,并检查 syslog 中是否有认证失败或脚本执行错误的记录。
可以实现双主模式吗?
可以,通过配置两个 vrrp_instance 实现负载分担。
配置两个虚拟路由器组,节点 A 在组 1 是 Master,在组 2 是 Backup;节点 B 相反。这样两个节点同时对外提供服务,任一节点故障时,另一节点接管所有 VIP。需注意 HAProxy 配置需监听所有 VIP。
切换过程业务会中断吗?
通常会有秒级抖动,TCP 连接可能断开。
VIP 漂移本身很快,但客户端已有的 TCP 连接会因原主节点失效而断开,需要客户端重连。对于 HTTP 短连接业务感知不明显,长连接业务需具备重连机制。公开资料中没有看到可靠的量化数据表明具体中断毫秒数,取决于网络环境和检测间隔配置。
参考来源
- HAProxy Official Documentation, "HAProxy Configuration Manual"
- Keepalived Official Documentation, "Keepalived Documentation"
- Linux Kernel Documentation, "sysctl net.ipv4"