HAProxy 集群部署 Keepalived 实现 VIP 高可用切换怎么配置?

文章导读
HAProxy 集群配合 Keepalived 实现 VIP 高可用,核心是在多台服务器上部署 Keepalived 通过 VRRP 协议管理虚拟 IP,当主节点 HAProxy 故障时 VIP 自动漂移到备节点。适用场景是 TCP/HTTP 负载均衡入口需要避免单点故障,风险边界在于防火墙需放行 VRRP 协议且需防止脑裂。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

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。

HAProxy 集群部署 Keepalived 实现 VIP 高可用切换怎么配置?
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 check

2. 编写健康检查脚本

/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 改为 BACKUPpriority 改为小于 100 的值(如 90)。

HAProxy 集群部署 Keepalived 实现 VIP 高可用切换怎么配置?

怎么验证是否生效

通过查看 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 STATEMaster 状态变更记录。

HAProxy 集群部署 Keepalived 实现 VIP 高可用切换怎么配置?

常见坑

配置过程中容易因防火墙或参数冲突导致切换失败。

  • 防火墙拦截 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,确认是否处于 BACKUPMASTER 状态,并检查 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"