Appearance
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_int | VRRP 通告间隔 |
| 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 -vDebian / 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四、基础主备配置
示例环境:
| 角色 | 地址 |
|---|---|
| lb01 | 192.168.10.11 |
| lb02 | 192.168.10.12 |
| VIP | 192.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 |
interface | VIP 绑定在哪张网卡 |
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_ip 和 unicast_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.shKeepalived 配置:
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 | 配置错误、网卡名错误、服务没启动 |
| 两台都有 VIP | VRRP 通信不通、防火墙拦截、virtual_router_id 冲突 |
| 切换后部分客户端不通 | ARP 缓存没刷新、GARP 被网络设备限制 |
| VIP 漂移但业务不通 | HAProxy/Nginx 没监听、后端不可用 |
| 主恢复后又抢回 | 默认抢占行为 |
| 脚本不生效 | 权限、退出码、路径、SELinux |
Keepalived 排查里先看 VIP 在谁身上,再看 VRRP 报文是否互通,再看入口服务是否监听,最后看后端。VIP 漂了不代表业务一定恢复,它只是入口地址到了另一台机器。