首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
keepalived-1.2.13源码编译与高可用实战:VRRP、VIP漂移与健康检查
📅 2026/10/15 17:47:38
✍️ 爱科研究院
👁 阅读 3,247
简介Keepalived 1.2.13 源码包面向运维工程师、系统架构师及高可用方案学习者用于搭建基于 VRRP 协议的服务故障自动切换环境解决主备节点流量接管与健康检查问题。压缩包共 188 个文件约 334KB以 62 个 .h 头文件与 61 个 .c 源文件为主体涵盖 vrrp.c、check_snmp.c、command.c 等核心实现另含 configure 构建脚本、keepalived.conf.5 与 keepalived.8 手册、sample 配置样例及 pem 证书文件便于从源码层面理解协议栈与检查器机制。已有 367 人学习下载。读者可借此掌握 VRRP 实例、虚拟服务器组、track_script 等配置模块的底层逻辑结合手册与样例快速完成编译部署并借助日志与报文监控思路排查切换异常适合作为深入研读 Keepalived 高可用原理的实践素材。1. 为什么今天还有人翻出 keepalived-1.2.13.tar.gz 这个老包如果你手里有一台跑着老内核的物理机或者维护着一套不允许随便升级中间件的遗留系统那你大概率会遇到一个尴尬想用 keepalived 做 VIP 漂移和 LVS 高可用但新版源码在编译时各种报错依赖对不上configure 直接卡死。这时候翻出 keepalived-1.2.13.tar.gz 这个包反而能一把编过。它不是什么新东西是 keepalived 早期一个相当稳定的分支核心功能——VRRP 协议实现、虚拟 IP 管理、LVS 后端健康检查——全都在代码量比现在的新版小得多依赖也干净适合在 CentOS 6/7 这类老环境里直接源码编译部署。这篇文章就是把这个包拆开从编译参数、配置文件结构、VRRP 实例怎么调、健康检查脚本怎么写一路讲到实际跑起来之后最容易翻车的几个点。适合两类人一类是被老环境绑住、必须用源码编译的运维另一类是想搞明白 keepalived 底层到底怎么工作、不想只抄配置的工程师。2. 编译与安装从 tar.gz 到可执行文件的完整路径2.1 先看清这个包里到底有什么拿到 keepalived-1.2.13.tar.gz 之后别急着 tar 解压就 configure。先看一眼目录结构心里有数。解压后你会看到几个关键目录keepalived/下面放的是核心守护进程的源码lib/是它自己带的一套基础库内存管理、调度器、网络封装check/里是 LVS 后端健康检查相关的代码vrrp/就是 VRRP 协议实现的主体。这个版本的构建系统还是经典的 autotools 那一套configure脚本加Makefile.in没有用 CMake 或者 meson。这意味着你在编译之前得先把 gcc、make、openssl-devel、popt-devel 这几个包装上。尤其是 openssl-devel因为 keepalived 要支持 VRRP 的认证功能没这个头文件 configure 会直接告诉你找不到 SSL 库。我一般会先跑一遍./configure --help看看这个版本支持哪些开关。1.2.13 这个版本支持的选项不算多但有几个很关键--with-kernel-dir用来指定内核源码路径如果你要用 LVS 的同步功能--disable-lvs-syncd可以关掉 LVS 同步守护进程--disable-fwmark关掉防火墙标记支持。在老内核上编译最常见的问题就是内核头文件对不上这时候要么装对应版本的 kernel-devel要么直接用--with-kernel-dir指到你手动准备的内核源码目录。2.2 编译参数怎么选一份能直接抄的 configure 命令下面这条命令是我在 CentOS 7 最小化安装环境里实测能过的配置你可以直接拿去用只需要把内核路径换成你自己的# 解压源码包 tar -zxvf keepalived-1.2.13.tar.gz cd keepalived-1.2.13 # 配置编译选项 ./configure \ --prefix/usr/local/keepalived \ --with-kernel-dir/usr/src/kernels/$(uname -r) \ --disable-lvs-syncd \ --disable-fwmark \ --sysconfdir/etc \ --mandir/usr/local/share/man # 编译并安装 make make install这里逐项说一下参数的含义。--prefix决定安装根目录我习惯放在/usr/local/keepalived下面方便和系统自带的包区分开。--with-kernel-dir指向当前运行内核的头文件目录这个路径必须存在否则 configure 会报错说找不到内核源码。--disable-lvs-syncd关掉 LVS 同步守护进程如果你不需要做 LVS 主备之间的连接同步关掉它能少编译一个模块也少一个出问题的点。--disable-fwmark关掉防火墙标记这个功能在老内核上经常因为 iptables 版本不匹配而编译失败不用就直接关。--sysconfdir/etc让配置文件装到/etc/keepalived/下面而不是默认的/usr/local/etc/这样 systemd 或者 init 脚本找配置的时候路径更标准。编译过程中如果报openssl/ssl.h: No such file or directory那就是缺 openssl-devel装一下就行。如果报popt.h找不到装 popt-devel。这两个是最常见的依赖缺失。还有一个坑是--with-kernel-dir指向的目录里必须有include/linux/和include/net/这些子目录如果你只装了 kernel-headers 而没有完整的 kernel-devel这个路径下可能是空的configure 会通过但 make 的时候报错。2.3 安装后的目录布局与启动方式make install跑完之后文件会分散到几个位置。二进制文件在/usr/local/keepalived/sbin/keepalived配置文件默认在/etc/keepalived/keepalived.conf但 1.2.13 这个版本不会自动帮你创建这个目录和文件需要你手动建。另外它不会自动生成 systemd unit 文件在老系统上一般用 init 脚本或者直接命令行启动。我一般会做这么几件事先mkdir -p /etc/keepalived然后从源码目录里把keepalived/etc/keepalived/keepalived.conf这个样例配置拷过去改。启动的时候直接用完整路径/usr/local/keepalived/sbin/keepalived -D -f /etc/keepalived/keepalived.conf-D是打印详细日志-f指定配置文件路径。如果要开机自启就在/etc/rc.local里加一行或者写一个简单的 init 脚本。注意这个版本没有--dont-fork这种选项调试的时候想看前台输出可以用-n参数让它不 fork 到后台日志直接打在终端上。提示1.2.13 的 keepalived 在启动时如果找不到配置文件不会报错退出而是用一套内置的默认值继续跑。这意味着你可能以为它读了你的配置实际上它跑的是默认参数。启动后一定要用ps aux | grep keepalived确认进程在再用ip addr show看 VIP 有没有挂上去。3. 配置文件拆解VRRP 实例、虚拟 IP 与健康检查3.1 keepalived.conf 的整体结构这个版本的配置文件是扁平的没有 include 机制所有东西都写在一个文件里。整体分三大块global_defs全局定义、vrrp_instance虚拟路由实例、virtual_server虚拟服务器LVS 相关。如果你只用 VRRP 做 VIP 漂移那virtual_server那块可以完全不写。global_defs里最常用的几个参数是notification_email报警邮件老版本用 sendmail 发现在基本没人配了、router_id本机标识一般写主机名、vrrp_mcast_group4VRRP 组播地址默认 224.0.0.18一般不用改。vrrp_instance是核心。每个实例代表一组高可用关系里面要定义stateMASTER 或 BACKUP、interface绑定的网卡名、virtual_router_idVRID同一组里必须一致不同组不能冲突、priority优先级MASTER 要比 BACKUP 高、advert_int通告间隔默认 1 秒、authentication认证方式和密码、virtual_ipaddressVIP 列表。这几个参数里最容易出问题的是virtual_router_id和interface。VRID 在同一个二层网络里必须唯一如果你有两组 keepalived 跑在同一个交换机下VRID 撞了就会互相抢 VIP现象是 VIP 在两台机器之间反复漂移日志里能看到状态不停在 MASTER 和 BACKUP 之间切换。3.2 一个最小可用的 VRRP 配置示例下面这份配置是两台机器做 VIP 漂移的最小集合MASTER 和 BACKUP 只有state和priority不同# MASTER 节点配置 global_defs { router_id node-master } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1234abcd } virtual_ipaddress { 192.168.1.100/24 dev eth0 } }BACKUP 节点把state改成BACKUPpriority改成 90router_id改成node-backup其他保持一致。authentication里的密码最长 8 位超过会被截断这个在 1.2.13 里没有明确报错但实际生效的只有前 8 位所以如果你设了很长的密码两边不一致的话认证会失败现象是 BACKUP 一直收不到 MASTER 的通告然后自己变成 MASTER造成双主。virtual_ipaddress后面的dev eth0是可选的不写的话 keepalived 会自己找但在多网卡机器上建议显式指定避免 VIP 挂到错误的网卡上。3.3 健康检查脚本怎么挂进 VRRP 实例光有 VRRP 还不够如果 MASTER 上的业务进程挂了但机器还活着VIP 不会漂走。这时候需要vrrp_script加track_script。vrrp_script定义在vrrp_instance外面里面写检查脚本的路径和间隔track_script在实例里面引用它。脚本的返回值决定权重变化返回 0 表示健康返回非 0 表示异常keepalived 会根据weight参数调整优先级。# 定义一个检查 nginx 是否存活的脚本 vrrp_script chk_nginx { script /usr/bin/killall -0 nginx interval 2 weight -20 fall 2 rise 2 } vrrp_instance VI_1 { # ... 其他配置同上 ... track_script { chk_nginx } }interval 2表示每 2 秒执行一次脚本。weight -20表示脚本失败时优先级减 20如果 MASTER 原本是 100减完变成 80低于 BACKUP 的 90就会触发切换。fall 2表示连续失败 2 次才认为真的挂了rise 2表示连续成功 2 次才恢复。这几个参数在 1.2.13 里都支持但要注意weight的正负号正数表示脚本成功时加权重负数表示失败时减权重。我一般用负数因为这样 MASTER 正常时优先级不变出问题时才降下来。脚本本身要注意权限和路径。keepalived 是以 root 跑的所以脚本里如果有相对路径或者依赖环境变量可能会找不到。建议脚本里全用绝对路径并且手动chmod x确保可执行。另外killall -0 nginx这种写法依赖 psmisc 包最小化安装的系统里可能没有换成pidof nginx或者pgrep nginx更通用。4. 避坑与排查那些让你半夜爬起来重启的瞬间4.1 VIP 漂移后原 MASTER 恢复但 VIP 不回来现象是 MASTER 挂了一阵BACKUP 接管了 VIP等 MASTER 恢复后VIP 还在 BACKUP 上MASTER 变成了 BACKUP 状态。原因是 1.2.13 默认没有开启nopreempt的反向逻辑——它默认是抢占模式但抢占的前提是 MASTER 的优先级要高于当前持有 VIP 的节点。如果你在 MASTER 上配了track_script并且脚本失败导致优先级降过恢复后优先级可能还没回到原值或者 BACKUP 在接管后优先级被临时提升了。解决办法是在两个节点上都显式配好priority并且不要在 BACKUP 上配track_script的加权重逻辑。如果确实需要非抢占在 MASTER 的实例里加nopreempt但注意nopreempt要求初始state必须是 BACKUP否则不生效。4.2 日志里全是 “VRRP_IS_INITIALIZED” 但 VIP 就是不上这种情况一般是virtual_router_id冲突或者组播被挡了。先检查同一网段里有没有其他 keepalived 用了同一个 VRID用tcpdump -i eth0 vrrp抓一下包看看有没有别的机器在发同一个 VRID 的通告。如果抓不到任何 VRRP 包那可能是交换机或者防火墙挡了 224.0.0.18 的组播。有些云环境或者虚拟化平台默认禁止组播这时候要么改用单播模式1.2.13 支持unicast_peer配置要么让网络组开通组播。单播的配法是在vrrp_instance里加unicast_src_ip和unicast_peer { 对端IP }这样就不依赖组播了。4.3 健康检查脚本返回 0 但 keepalived 认为失败脚本手动跑没问题但 keepalived 一调就失败。最常见的原因是脚本里用了相对路径或者依赖了某个只在交互式 shell 里才有的环境变量。keepalived 调脚本的时候用的是干净环境PATH 可能只有/sbin:/bin:/usr/sbin:/usr/bin。解决办法是在脚本开头显式设置 PATH或者所有命令都写绝对路径。另一个原因是脚本执行时间超过了intervalkeepalived 会认为超时然后按失败处理。如果你的检查逻辑比较重把interval调大或者把脚本改成异步的——先写个标记文件让 keepalived 只检查标记文件的存在性。4.4 编译时 make 报错 “undefined reference to pthread_...””这是链接阶段缺 pthread 库。1.2.13 的 Makefile 在某些发行版上不会自动加-lpthread。解决办法是在 configure 的时候加LDFLAGS-lpthread或者直接改 Makefile 在LIBS变量里补上。更省事的做法是./configure ... LDFLAGS-lpthread让 configure 生成的 Makefile 带上这个链接选项。这个坑在 CentOS 6 上尤其常见因为那个年代的 gcc 默认不链接 pthread。4.5 用 killall 发信号导致 keepalived 直接退出有些人习惯用killall keepalived来重启服务但在 1.2.13 里keepalived 收到 SIGTERM 后会直接退出并且不清理 VIPVIP 会留在网卡上变成“孤儿 IP”。正确的做法是用kill -HUP让 keepalived 重新加载配置或者用service keepalived restart这种带 stop 和 start 的脚本。如果已经出现了孤儿 VIP手动ip addr del删掉然后再启动 keepalived。我一般会在启动脚本里加一段清理逻辑启动前先把可能残留的 VIP 删一遍避免地址冲突。5. 进阶技巧用 notify 脚本做切换时的自定义动作5.1 notify 脚本的触发时机与参数1.2.13 支持notify_master、notify_backup、notify_fault三个通知脚本分别在节点进入 MASTER、BACKUP、FAULT 状态时触发。脚本会收到三个参数$1是实例名比如 VI_1$2是新状态MASTER/BACKUP/FAULT$3是优先级。这个机制可以用来做切换时的 DNS 更新、告警发送、或者调整后端服务的监听地址。配置写法是在vrrp_instance里加一行notify_master /path/to/script.sh脚本必须有可执行权限。我一般会用 notify 脚本做两件事一是往监控系统推一个事件记录切换时间和节点二是在 MASTER 上启动业务进程在 BACKUP 上停掉业务进程。这样即使 VIP 漂移了业务进程的状态也能跟着走。脚本里要注意幂等性因为 keepalived 在某些情况下可能会重复触发同一个状态的通知脚本里最好先判断当前状态再决定要不要执行动作。5.2 一个带日志和状态判断的 notify 脚本模板#!/bin/bash # notify.sh - keepalived 状态切换通知脚本 # 参数: $1实例名 $2新状态 $3优先级 INSTANCE$1 STATE$2 PRIORITY$3 LOG_FILE/var/log/keepalived-notify.log NOW$(date %Y-%m-%d %H:%M:%S) echo $NOW | $INSTANCE | $STATE | priority$PRIORITY $LOG_FILE case $STATE in MASTER) # 进入 MASTER 状态启动业务进程 /usr/bin/systemctl start nginx 2/dev/null echo $NOW | nginx started $LOG_FILE ;; BACKUP) # 进入 BACKUP 状态停掉业务进程 /usr/bin/systemctl stop nginx 2/dev/null echo $NOW | nginx stopped $LOG_FILE ;; FAULT) # 故障状态记录并告警 echo $NOW | FAULT detected $LOG_FILE ;; *) echo $NOW | unknown state: $STATE $LOG_FILE ;; esac exit 0这个脚本的逻辑很直白先记日志然后根据状态决定启停 nginx。exit 0很重要如果脚本返回非 0keepalived 会认为通知失败虽然不会直接导致状态切换但会在日志里刷错误。脚本里的systemctl命令在 CentOS 6 上要换成service nginx start/stop。另外注意脚本的执行用户是 root所以不需要 sudo。5.3 验证切换是否真的生效配完之后不能只看 keepalived 的日志说 MASTER 就信了。我习惯用一套组合拳验证先在 MASTER 上ip addr show eth0确认 VIP 在然后curl -I http://VIP看业务是否可达。接着手动把 MASTER 的 keepalived 停掉用kill -HUP或者service keepalived stop等 2 到 3 秒再去 BACKUP 上ip addr show看 VIP 有没有漂过来同时curl一下 VIP 确认业务也跟过来了。最后把 MASTER 的 keepalived 拉起来观察 VIP 是否按预期回切或者保持不动。这一套走完基本能覆盖 90% 的配置问题。注意测试的时候如果 VIP 和你的 SSH 连接在同一个网卡上VIP 漂走可能会导致你的 SSH 断连。建议在带外管理或者控制台里做切换测试别把自己关在门外。5.4 从 1.2.13 迁移到新版本时要注意什么如果你后面有机会升级到 keepalived 2.x配置文件大体兼容但有几个变化virtual_router_id的范围从 0-255 扩展到了 0-255没变但authentication的密码长度限制放宽了vrrp_script的weight行为有微调正负号的含义在新版里更严格notify脚本的参数顺序没变但新增了notify_master_rx_lower_pri这类更细粒度的通知。迁移前先把旧配置里的authentication密码统一改成 8 位以内避免新版直接拒绝加载。另外新版默认开启了vrrp_strict会检查 VIP 是否在同一个子网、VRID 是否合法旧配置里一些不规范的地方在新版里会直接报错退出。我一般会在迁移前用keepalived -t -f /etc/keepalived/keepalived.conf做一次配置语法检查这个-t选项在 1.2.13 里没有是新版才加的。从那以后我每次配 keepalived不管多急都会先tcpdump抓一轮 VRRP 包确认组播通不通再手动触发一次切换看 VIP 和业务是不是一起走。这个习惯帮我省掉了至少三次半夜被叫起来查“VIP 怎么没漂”的麻烦。希望帮到你。本文还有配套的精品资源点击获取
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/15 17:42:38
开合帘电机RS485调试:串口助手从接线到CRC16地址修改全攻略
2026/10/15 17:42:38
深入.NET内存管理:GC原理与诊断实战指南
2026/10/15 17:42:38
IEC 104规约客户端与服务端仿真工具:从协议原理到自动化联调
2026/10/15 21:54:32
AI工程化日报:模型换代与具身智能的实操指南
2026/10/15 21:54:32
make clean先行:增量编译原理与编译错误排查指南
2026/10/15 21:54:32
每日AI行业简报制作全流程:从信息降噪到判断输出
2026/10/15 21:54:32
C程序设计课后答案:算法、流程图与调试技巧详解
2026/10/15 21:54:32
Java动态权重调度器:从救护车优先通行到线程协作式抢占
2026/10/15 21:49:31
串口调试助手2.2实战指南:从最小连通到自动化测试
2026/10/15 0:02:59
AI Coding时代的柔性之美:从静态软件到自演化软件,软件研发正在重新进化
2026/10/15 0:02:59
亨得利客户服务中心官方网点分布一览:2026年全国多城门店地址与最新联系电话公布
2026/10/15 0:02:59
防关联浏览器哪个好?三款产品实测差异解析
2026/10/13 12:25:09
流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南
2026/10/14 18:35:19
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别
2026/10/14 14:52:59
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容
2026/10/15 1:07:55
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/15 5:07:59
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/15 8:10:01
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)