Skip to content

Keepalived

Keepalived 常用于通过 VRRP 实现 VIP 漂移,配置重点在 vrrp_instance、优先级、抢占、健康检查脚本、VIP、通知和与 LVS/HAProxy/Nginx 的配合。

一、Keepalived 解决什么

负载均衡实例本身也可能故障。Keepalived 常用来让一个 VIP 在两台或多台入口机器之间漂移。

当主入口机器故障,备用入口接管 VIP:

Keepalived 使用 VRRP 协议做主备选举。可以理解成多台机器约定一个虚拟路由器身份,当前 master 持有 VIP,backup 监听 master 的通告。master 不再通告时,backup 根据优先级接管。

二、几个核心概念

概念含义
VRRP虚拟路由冗余协议
VIP漂移的虚拟 IP
MASTER当前持有 VIP 的节点
BACKUP等待接管的节点
priority优先级,越大越容易成为 MASTER
advert_intVRRP 通告间隔
virtual_router_id同一组 VRRP 实例的标识
track_script根据脚本结果调整权重或触发切换

我会把 Keepalived 当成“入口地址接管工具”,不把它当成完整负载均衡。真正分发流量的是 LVS、HAProxy、Nginx 或云 LB,Keepalived 负责让 VIP 落在健康的入口机器上。

三、安装

RHEL / Rocky / CentOS:

bash
yum install -y keepalived
systemctl enable --now keepalived
keepalived -v

Debian / Ubuntu:

bash
apt update
apt install -y keepalived
systemctl enable --now keepalived
keepalived -v

配置文件:

text
/etc/keepalived/keepalived.conf

检查服务:

bash
systemctl status keepalived --no-pager
journalctl -u keepalived -n 100 --no-pager

四、基础主备配置

示例环境:

角色地址
lb01192.168.10.11
lb02192.168.10.12
VIP192.168.10.100
网卡eth0

lb01 配置:

conf
# /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 120
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 12345678
    }

    virtual_ipaddress {
        192.168.10.100/24 dev eth0
    }
}

lb02 配置:

conf
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 12345678
    }

    virtual_ipaddress {
        192.168.10.100/24 dev eth0
    }
}

关键点:

配置说明
virtual_router_id同一组主备保持一致,不同组错开
priority优先级越高越容易成为 MASTER
interfaceVIP 绑定在哪张网卡
virtual_ipaddress要漂移的 VIP

启动:

bash
systemctl restart keepalived
ip addr show dev eth0 | grep 192.168.10.100

五、组播和单播

VRRP 默认常见形态是组播通告,地址一般是 224.0.0.18,协议号是 112。同一二层网络里,backup 能收到 master 的 VRRP 通告,就不会抢 VIP。

虚拟化平台、云 VPC、跨交换机安全策略里,组播可能被限制。现象通常是两台机器都认为自己收不到对方通告,于是都进入 MASTER,VIP 同时出现在两台机器上。这类环境更适合配置 unicast peer。

lb01:

conf
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 120
    advert_int 1

    unicast_src_ip 192.168.10.11
    unicast_peer {
        192.168.10.12
    }

    virtual_ipaddress {
        192.168.10.100/24 dev eth0
    }
}

lb02:

conf
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1

    unicast_src_ip 192.168.10.12
    unicast_peer {
        192.168.10.11
    }

    virtual_ipaddress {
        192.168.10.100/24 dev eth0
    }
}

单播模式下两边的 unicast_src_ipunicast_peer 要对称。防火墙也要放通两台入口之间的 VRRP 报文,抓包仍然可以看协议号 112

bash
tcpdump -nn -i eth0 host 192.168.10.11 or host 192.168.10.12
tcpdump -nn -i eth0 proto 112  # VRRP 报文是否能互相看到

六、GARP 和 ARP 更新

VIP 漂移以后,交换机、网关或客户端还可能短时间保留旧的 ARP 记录。表现是 VIP 已经在新 master 上,但部分客户端还往旧 MAC 发包。

Keepalived 成为 MASTER 时会发送 gratuitous ARP,用来刷新周围设备的 ARP 缓存。切换后短暂失败比较明显时,可以适当增加 GARP 次数:

conf
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 120
    advert_int 1

    garp_master_delay 1
    garp_master_repeat 5

    virtual_ipaddress {
        192.168.10.100/24 dev eth0
    }
}

GARP 只能帮助刷新邻居缓存,不能替代客户端重连。长连接业务切换时仍然会有连接中断,入口高可用解决的是新请求入口,不是把已经断掉的 TCP 连接搬到另一台机器。

七、抢占和非抢占

默认情况下,高优先级节点恢复后可能重新抢回 MASTER。这个行为叫抢占。

非抢占配置:

conf
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 120
    advert_int 1
    nopreempt

    virtual_ipaddress {
        192.168.10.100/24 dev eth0
    }
}

生产里是否抢占要看业务。抢占能让主入口回到指定机器,但恢复后立刻切回也会带来一次连接抖动。维护窗口外,我更倾向非抢占,等确认状态稳定后再人工切。

八、检查 HAProxy 或 Nginx

机器存活和入口可用是两件事。入口进程挂了但 Keepalived 还在,VIP 仍然可能留在坏节点上。

检查脚本:

bash
# /etc/keepalived/check_haproxy.sh
#!/bin/bash
set -euo pipefail

pidof haproxy >/dev/null
ss -lntp | grep -q ':80'  # 确认入口端口还在监听

授权:

bash
chmod +x /etc/keepalived/check_haproxy.sh

Keepalived 配置:

conf
vrrp_script chk_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2
    fall 3
    rise 2
    weight -30
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 120
    advert_int 1

    track_script {
        chk_haproxy
    }

    virtual_ipaddress {
        192.168.10.100/24 dev eth0
    }
}

weight -30 表示脚本失败时优先级减 30。lb01 原来 120,失败后变 90,就会低于 lb02 的 100,让 VIP 漂过去。

九、通知脚本

Keepalived 可以在状态变化时执行脚本:

conf
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 120
    advert_int 1

    notify_master "/etc/keepalived/notify.sh MASTER"
    notify_backup "/etc/keepalived/notify.sh BACKUP"
    notify_fault  "/etc/keepalived/notify.sh FAULT"

    virtual_ipaddress {
        192.168.10.100/24 dev eth0
    }
}

脚本示例:

bash
#!/bin/bash
set -euo pipefail

state="${1:-UNKNOWN}"
logger -t keepalived-notify "state changed to ${state}"

通知脚本里可以接企业微信、邮件或告警系统。脚本要轻,避免状态切换时被通知逻辑卡住。

十、与 LVS 配合

Keepalived 可以直接管理 LVS virtual server 和 real server。

conf
virtual_server 192.168.10.100 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    protocol TCP

    real_server 192.168.10.21 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            connect_port 80
        }
    }

    real_server 192.168.10.22 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            connect_port 80
        }
    }
}

这样 Keepalived 不只做 VIP,还能根据健康检查维护 IPVS 后端。LVS + Keepalived 是传统四层入口里很常见的组合。

十一、常见排查

检查 VIP:

bash
ip addr show dev eth0 | grep 192.168.10.100

检查日志:

bash
journalctl -u keepalived -n 100 --no-pager

抓 VRRP:

bash
tcpdump -nn -i eth0 proto 112  # VRRP 协议号是 112

常见问题:

现象常见方向
两台都没有 VIP配置错误、网卡名错误、服务没启动
两台都有 VIPVRRP 通信不通、防火墙拦截、virtual_router_id 冲突
切换后部分客户端不通ARP 缓存没刷新、GARP 被网络设备限制
VIP 漂移但业务不通HAProxy/Nginx 没监听、后端不可用
主恢复后又抢回默认抢占行为
脚本不生效权限、退出码、路径、SELinux

Keepalived 排查里先看 VIP 在谁身上,再看 VRRP 报文是否互通,再看入口服务是否监听,最后看后端。VIP 漂了不代表业务一定恢复,它只是入口地址到了另一台机器。