Keepalived 是一个基于 C 语言编写的路由软件,其主要目标是为 Linux 系统及基于 Linux 的基础设施提供简单而健壮的负载均衡和高可用性功能。其负载均衡框架依赖于著名的 Linux 虚拟服务器(IPVS)内核模块,实现第四层负载均衡。同时,它还能根据后端服务器的健康状况,动态地维护和管理负载均衡的服务器池。而其高可用性功能,则是通过 VRRP 协议 实现的,该协议是路由器故障转移的基石。
在实际生产环境中,如何有效配置和管理 Keepalived,是保障服务连续性的关键。本文将结合实战经验,分享一套从基础配置、主备切换优化到 运维 脚本和 Docker 化部署的完整实践方案。
01 基础配置
清晰、模块化的配置文件是稳定运行的前提。
1.1 主配置文件
保持主配置文件的简洁,通过 include 指令引入具体的业务配置。
$ cat <<EOF | tee /etc/keepalived/keepalived.conf > /dev/null
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server localhost
smtp_connect_timeout 30
router_id LVS_DEVEL
}
include /etc/keepalived/keepalived-test.conf
EOF
提示:使用 include 引入其他配置文件,能让主配置文件尽可能保持干净。
1.2 业务配置文件(主要)
这是定义 VRRP 实例和虚拟 IP(VIP)的核心配置。
$ cat <<EOF | tee /etc/keepalived/keepalived-test.conf > /dev/null
vrrp_instance test {
# 集群的角色(MASTER, BACKUP)
state MASTER
# 网卡名称
interface bond0.4009
# 虚拟路由ID,同网段避免冲突
virtual_router_id 18
# 权重
priority 100
# VRRP广播间隔(以秒为单位)
advert_int 1
# 本机IP地址
unicast_src_ip x.x.x.x
# keepalived集群其他IP地址
unicast_peer {
x.x.x.x
x.x.x.x
}
# keepalived集群认证信息
authentication {
auth_type PASS
auth_pass 1111
}
# VIP地址
virtual_ipaddress {
x.x.x.x
}
}
EOF
提示:生产环境建议尽可能使用 Keepalived 的单播模式,配置上 unicast_src_ip 和 unicast_peer 参数即可。
1.3 docker-compose 启动文件
使用 Docker 容器化部署,便于环境一致性和快速迁移。
$ cat <<EOF | tee /etc/keepalived/docker-compose.yml > /dev/null
services:
keepalived:
container_name: keepalived
image: core.jiaxzeng.com/jiaxzeng/keepalived:2.3.4
restart: always
network_mode: host
volumes:
- .:/etc/keepalived
cap_add:
- NET_ADMIN
- NET_BROADCAST
- NET_RAW
EOF
1.4 启动 keepalived 服务
使用 Docker Compose 启动服务。
$ docker-compose up -d
[+] Running 1/1
✔ Container keepalived Started
$ docker-compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
keepalived keepalived:2.3.4 "/opt/keepalived/sbi…" keepalived 5 seconds ago Up 5 seconds
02 配置主备切换 VIP
VIP 的切换是 Keepalived 高可用能力的直接体现。
2.1 手工切换
在 Keepalived 主节点(即当前 VIP 所在节点)执行,停止或重启 Keepalived 服务都可以触发 VIP 切换。
$ docker-compose down
[+] Running 1/1
✔ Container keepalived Removed
$ docker-compose restart
[+] Restarting 1/1
✔ Container keepalived Started
2.2 自动切换
此场景通常是为本机某个无状态服务(如 Nginx、HAProxy)提供高可用,确保 VIP 漂移到任何节点,服务都能正常访问。下面以 HAProxy 为例。
提示:本示例是为 HAProxy 服务提供高可用。
1. 创建检查 HAProxy 状态脚本
$ cat /etc/keepalived/chk_haproxy.sh
#!/bin/bash
curl localhost:8405/metrics &> /dev/null
if [ $? -eq 0 ]; then
exit 0
else
exit 255
fi
2. Keepalived 业务配置文件添加 VRRP 健康检查脚本配置
vrrp_script haproxy {
script /etc/keepalived/chk_haproxy.sh # 必须要绝对路径
user root # 脚本的用户
interval 1 # 执行脚本间隔,默认是1
fall 5 # 转换fail状态所需次数,脚本退出状态码不为0
rise 3 # 转换success所需次数,脚本退出状态码为0
weight -10 # 将状态转换fail时,vrrp实例权重加该权重
}
3. Keepalived 业务配置文件 VRRP 实例添加健康检查脚本
vrrp_instance haproxy {
# 上述的基础配置内容
...
# vrrp实例添加上检测脚本,实现自动切换VIP
track_script {
haproxy # vrrp_script名称
}
}
03 进阶配置
这些优化配置能帮助你在更复杂的网络环境下保持稳定。
3.1 优化 Gratuitous ARPs 配置
原理:默认情况下,Keepalived 切换 VIP 地址后,会广播两次 gratuitous ARP 数据包,通知二层网络中的所有主机更新 ARP 表。
极端情况:在 VIP 地址切换瞬间,若网络繁忙导致 gratuitous ARP 数据包丢包,可能会导致客户端访问 VIP 地址异常,但 ping VIP 地址却正常。这种情况在云上环境中真实遇到过。
优化方案:
- 调大两次 gratuitous ARP 数据包的广播间隔(默认为 1 秒)。
- 开启持续发送 gratuitous ARP 数据包广播。
# 全局生效
global_defs {
# 转换MASTER后,第1,2次发送gratuitous ARP包个数。默认: 5个
vrrp_garp_master_repeat 3
# 转换MASTER后,第1次发送gratuitous ARP包与第2次间隔时长。默认: 5s
vrrp_garp_master_delay 10
# 定期发送vrrp间隔。默认:0s(转换MASTER,除了发送两次gratuitous ARP后。不再定期发送gratuitous ARP包)
vrrp_garp_master_refresh 60
}
# 特定vrrp实例
vrrp_instance 实例名 {
# 转换MASTER后,第1,2次发送gratuitous ARP包个数
garp_master_repeat 3
# 转换MASTER后,第1次发送gratuitous ARP包与第2次间隔时长
garp_master_delay 10
# 定期发送vrrp间隔。默认:0s(转换MASTER,除了发送两次gratuitous ARP后。不再定期发送gratuitous ARP包)
garp_master_refresh 60
}
抓包分析验证
为了验证上述配置是否生效,我们可以进行 网络抓包 分析。

提示:在 Wireshark 中,可以通过过滤器 arp.isgratuitous 来过滤出 free arp 数据包。
3.2 LVS 配置
如果你同时使用 Keepalived 的负载均衡功能,可以参考以下 LVS 配置示例。
virtual_server VIP地址 端口 {
# 用于检查器轮询的延迟计时器,默认60s
delay_loop 60
# LVS调度
lvs_sched rr
# LVS转发方法,默认NAT
lvs_method DR
# L4协议
protocol TCP
# 真实服务器条目【tcp检查】
real_server 172.139.20.121 31919 {
# 真实服务器权重,默认是1
weight 1
# 当健康检查器检测到故障时,将权重设置为0
inhibit_on_failure
# tcp检查是没有参数
TCP_CHECK {}
}
# 真实服务器条目【http_get检查】
real_server 172.139.20.176 31919 {
weight 1
inhibit_on_failure
# http_get检查参数
HTTP_GET {
# http协议版本,默认1.1
http_protocol 1.1
url {
# 请求路径
path /ping
# 健康检查摘要
# 示例:genhash -s 172.139.20.176 -p 31919 -u /ping
# digest f0a687a32fb5f06a7253e259126fe05a
status_code 200-299
}
}
}
}
提示:http_get 健康检查可以选择使用 digest 或 status_code 作为判断依据。推荐使用 status_code。
如果没有 genhash 命令,可以手动创建一个软链接。
$ ln -s /usr/local/sbin/keepalived /usr/local/bin/genhash
04 终极武器(tcpdump)
当出现问题时,抓包是定位问题最直接的手段。
4.1 心跳检测
抓取 VRRP 协议的心跳包,检查主备节点间通信是否正常。
sudo tcpdump -i any -enn vrrp
命令解析:
-i any: 抓取所有网卡的流量
-enn: 显示 MAC 地址且不解析主机名
vrrp:过滤 VRRP 协议的流量。
4.2 免费 ARP
抓取 gratuitous ARP 包,验证 VIP 切换后是否正常发送了 ARP 通告。
sudo tcpdump -i any -enn 'arp and arp[14:4] == arp[24:4]'
命令解析:
-i any: 抓取所有网卡的流量
-enn: 显示 MAC 地址且不解析主机名
'arp and arp[14:4] == arp[24:4]': 抓取 ARP 协议中,源 IP 地址与目标 IP 地址相同的数据包,即 gratuitous ARP 数据包。
05 附录:Dockerfile
最后,附上用于构建 Keepalived 镜像的 Dockerfile,方便你进行自定义。
FROM ubuntu:24.04 AS build
ARG VERSION=2.3.4
RUN sed -ri 's/(archive|ports).ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list.d/ubuntu.sources && \
apt-get update && apt-get install -y curl gcc make libssl-dev libnfnetlink-dev libnl-genl-3-dev libnl-3-dev
RUN curl -O https://keepalived.org/software/keepalived-${VERSION}.tar.gz && \
tar xf keepalived-${VERSION}.tar.gz && cd keepalived-${VERSION} && ./configure && make && make install
FROM ubuntu:24.04 AS keepalived
LABEL author=jiaxzeng
COPY --from=build /usr/local/sbin/keepalived /usr/local/sbin/keepalived
RUN sed -ri 's/(archive|ports).ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list.d/ubuntu.sources && \
apt-get update && apt-get upgrade -y && apt-get install -y curl libnfnetlink-dev libnl-genl-3-dev libnl-3-dev && \
apt-get -y clean autoclean && rm -rf /var/lib/apt /var/cache/apt /var/log/apt /var/log/dpkg.log
WORKDIR /etc/keepalived
ENTRYPOINT ["/usr/local/sbin/keepalived"]
CMD ["--dont-fork", "--log-console", "--log-detail", "--dump-conf"]
希望这份结合了生产环境经验的 Keepalived 配置指南,能帮助你构建更稳定可靠的高可用服务。如果在实践中遇到其他问题,也欢迎到 云栈社区 与大家一起探讨。
