资讯详情

CentOS 7源码编译keepalived-1.2.13双机热备与VIP漂移排障

📅 2026/10/28 1:15:31 | 华诺云谱 👁 阅读
CentOS 7源码编译keepalived-1.2.13双机热备与VIP漂移排障
简介这是 keepalived-1.2.13.tar.gz 开源软件源码包面向网络运维、系统管理员与高可用架构学习者聚焦 VRRP 虚拟路由冗余协议、服务健康检查与 LVS 负载均衡支撑可用于搭建主备故障切换实验环境、研读 1.2.13 版本的实现细节并对照配置样例理解实际部署方式。压缩包共 188 个文件约 334KB以 62 个 C 源文件与 61 个头文件为主体并辅以 configure、install-sh 等构建安装脚本init、conf、sample 等配置与示例文件pem 证书和 readme、changelog 等说明文档目录结构便于按模块查阅源码、编译验证和排查配置问题。已有 369 人学习下载。读者可从中获取 VRRP 状态机与报文处理、TCP/HTTP/ICMP 等健康检查机制、虚拟服务器组配置、日志与监控相关实现等具体内容也能结合 Nginx、MySQL 高可用场景理解 Keepalived 的配置组织与故障切换逻辑适合需要从源码和样例入手掌握网络服务连续性的中高级读者。1. 一套跑在旧内网里的双机热备为什么还在装 keepalived-1.2.13去年帮某公司内网做业务迁移对方甩过来一句「两台机器要做 VIP 漂移版本必须跟老集群一致keepalived-1.2.13源码包我发你」。我第一反应是这版本够老yum 源里随便装个新版不香吗结果把新版编译上去之后健康检查脚本因为权限校验直接不执行VIP 该切的时候纹丝不动业务在凌晨断了十几分钟。那次之后我就老实了老环境里版本锁死不是保守是拿事故换来的。这篇记录按「装什么、怎么装、怎么配、坏了怎么救」走一遍适合还在维护 CentOS 7 老集群、需要源码编译 keepalived-1.2.13 的人照着复现。2. 装前把环境列清系统版本、编译依赖和源码包校验动手之前先把环境盘清楚这一步偷懒后面编译报错能让你怀疑人生。keepalived 本身是用户态程序VRRP 协议在应用层跑不依赖特殊内核模块但如果你还要用它的 LVS/IPVS 那部分能力就得有对应的内核头文件。所以环境清单要分两块看一块是「能编译出来」一块是「能跑起来」。2.1 系统与 OpenSSL 版本决定编译顺不顺的第一道坎keepalived-1.2.13 是 2015 年前后的代码它对 OpenSSL 的调用方式是 1.0.x 时代的写法。CentOS 7 自带 openssl-devel 1.0.2 系列编译基本一路绿灯换到 OpenSSL 1.1.1 及以上的发行版make 阶段会抛出一串EVP_MD_CTX相关的结构体不完整错误因为 1.1 之后这些结构体被改成不透明指针了。这不是你参数写错是代码和库的代差。我把常见系统的适配情况列成表选机器前先对一眼操作系统OpenSSL 版本编译 keepalived-1.2.13备注CentOS 71.0.2顺利推荐本文以此为例CentOS 8 / Stream1.1.1大概率失败需自行处理兼容问题Ubuntu 18.04 及以上1.1.1 / 3.0大概率失败不建议作为编译机老版 CentOS 61.0.1顺利内核较老注意 IPVS 头文件如果生产机必须是新系统常见做法是找一台 CentOS 7 的构建机编译好把/usr/local/keepalived整个目录打包分发再补齐运行时的popt、openssl动态库依赖。注意 glibc 版本差异跨大版本分发前先在目标机ldd一下二进制确认没有not found。2.2 编译依赖gcc、openssl-devel、popt-devel 一个都不能少最小依赖集我一般就装这几个别嫌少多装的包只会让编译机的状态越来越不可复现# CentOS 7 编译 keepalived-1.2.13 的最小依赖集 yum -y install gcc gcc-c make openssl-devel popt-devel kernel-devel # 如果后续要用 IPVS/LVS 能力再补这两个 yum -y install ipvsadm libnl-devel逐项说清楚gcc、make是编译底座openssl-devel提供 VRRP 认证和加密相关头文件缺了 configure 阶段就过不去popt-devel提供命令行参数解析库缺了会在 configure 末尾报Popt libraries not found这个报错很靠后第一次见容易懵kernel-devel是给 IPVS 用的只做 VIP 漂移可以不装。libnl-devel在 CentOS 7 上装的是 libnl3而 1.2.13 检测的是 libnl1 那套 pkg-config 名字两者对不上所以这个包装了也未必被识别后面 configure 参数里我会直接用开关绕开。提示编译机和生产机的openssl-devel版本尽量一致否则编译出来的二进制在目标机可能因为符号版本差异起不来。2.3 源码包落地路径、校验和解压习惯源码包统一放/usr/local/src这个目录就是给编译源码用的权限和环境都干净。拿到keepalived-1.2.13.tar.gz之后先校验再解压别小看这一步传输不完整导致的解压报错能浪费你半小时# 进入源码目录并核对包完整性 cd /usr/local/src ls -lh keepalived-1.2.13.tar.gz sha256sum keepalived-1.2.13.tar.gz # 与提供方给出的校验值比对一致再解压 tar -zxvf keepalived-1.2.13.tar.gz cd keepalived-1.2.13解压后先别急着 configure花十秒看一眼目录结构configure在根目录keepalived/etc/init.d/keepalived和keepalived/etc/sysconfig/keepalived是自带的启动脚本模板这两个文件后面装服务时会用到。版本号也顺手确认一下grep VERSION configure.in | head能看出是不是你要的 1.2.13避免拿到改名过的包。3. 编译安装 keepalived-1.2.13configure 参数和安装路径怎么定源码编译最怕的就是「一路回车」装完发现配置跑到/usr/local/etc去了服务脚本找不到配置文件。这一章把三个关键参数、安装产物位置和服务托管方式一次定死后面就不用再回头改。3.1 configure 的三个参数--prefix、--sysconfdir、--disable-libnl我用的 configure 命令是这样参数不多但每个都有明确目的# 在源码根目录执行 ./configure \ --prefix/usr/local/keepalived \ --sysconfdir/etc \ --disable-libnl--prefix/usr/local/keepalived把二进制、库、文档全部收在一个目录下卸载时rm -rf就干净了不会像默认安装那样散落到/usr/local/sbin、/usr/local/lib各处。--sysconfdir/etc是关键它决定配置文件默认读哪里加上这个参数后 keepalived 会去/etc/keepalived/keepalived.conf找配置和你后面写 systemd 单元、写运维脚本时的路径习惯一致不加的话默认落在/usr/local/etc很多「改了配置不生效」的案子都是这个原因。--disable-libnl是 CentOS 7 上的保命参数。1.2.13 的 configure 脚本检测的是老版 libnl 的 pkg-config 名CentOS 7 装的是 libnl3检测逻辑对不上有的环境会直接报库找不到。VRRP 的 VIP 漂移功能不依赖 libnl关掉它不影响核心能力只有你要用某些基于 netlink 的高级特性时才需要处理这个依赖。configure 跑完会打印一张汇总表逐行看Use OpenSSL应该是 yesUse Popt应该是 yesUse Libnl是 no 属于预期。3.2 make 与 make install产物落在哪、PATH 怎么补configure 通过之后就是常规两步# 编译并安装-j 按 CPU 核数并行加快速度 make -j$(nproc) make install装完去/usr/local/keepalived下看一眼产物通常有这几个关键位置sbin/keepalived是主程序bin/genhash用来生成 VRRP 认证密码的哈希etc/keepalived/下可能有示例配置etc/sysconfig/keepalived是启动参数文件。主程序不在系统 PATH 里直接敲keepalived会提示 command not found两种补法一是在/etc/profile.d/下加一个脚本把/usr/local/keepalived/sbin加进 PATH二是做个软链ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived。我倾向软链因为 systemd 单元和 init 脚本里写绝对路径更稳不依赖登录 shell 的环境变量。还有个细节make install不会自动创建/etc/keepalived目录。首次安装时手动建一下不然后面启动会因为配置文件路径不存在直接退出mkdir -p /etc/keepalived chmod 700 /etc/keepalived权限给 700 是有意的配置文件里可能有 VRRP 认证密码普通用户不该读。3.3 服务托管1.2.13 没有 --with-initsystemd 单元得自己写新版 keepalived 的 configure 带了--with-initsystemd这类开关1.2.13 没有所以服务脚本要自己落地。源码包里其实带了 SysV 风格的脚本可以拷过来用# 复用源码包自带的启动脚本和参数文件 cp /usr/local/src/keepalived-1.2.13/keepalived/etc/init.d/keepalived /etc/init.d/keepalived cp /usr/local/src/keepalived-1.2.13/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived chmod x /etc/init.d/keepalived如果系统是 CentOS 7 且习惯用 systemctl 管直接写一个 unit 文件更清爽# /etc/systemd/system/keepalived.service [Unit] DescriptionKEEPALIVED for VRRP Afternetwork.target [Service] Typeforking # -D 表示把日志写到 syslog-f 指定配置文件路径 ExecStart/usr/local/keepalived/sbin/keepalived -D -f /etc/keepalived/keepalived.conf ExecReload/bin/kill -HUP $MAINPID PIDFile/var/run/keepalived.pid KillModeprocess [Install] WantedBymulti-user.targetTypeforking是因为 keepalived 启动后会自己 daemon 化-D参数让日志进 syslog排查时journalctl -u keepalived和/var/log/messages都能看到状态切换记录PIDFile的路径 1.2.13 用的就是/var/run/keepalived.pid写错会导致systemctl stop停不干净。写完执行systemctl daemon-reload systemctl enable keepalived先别 start配置还没写起了也会因为找不到配置文件退出。4. 配置双机热备keepalived.conf 里真正决定漂移的参数配置文件是这套东西的大脑1.2.13 的配置语法和老版本一脉相承但有几个参数的行为和新版不同照着新文档抄会踩坑。下面按「一份能跑的最小配置」拆开讲。4.1 global_defs 与 vrrp_instance最小可用配置长什么样两台机器的配置只有state、priority、router_id和单播地址不同其余保持一致。先看节点 A# 全局段router_id 用来标识本机建议写主机名或业务名 global_defs { router_id LVS_NODE_A } # 健康检查脚本定义后面在 vrrp_instance 里引用 vrrp_script chk_app { script /etc/keepalived/check_app.sh interval 2 weight -20 fall 3 rise 2 } vrrp_instance VI_1 { state MASTER # 初始角色最终由 priority 决定 interface eth0 # 必须和实际网卡名一致 virtual_router_id 51 # 同网段内必须唯一 priority 100 # 数值大的为主 advert_int 1 # 通告间隔单位秒 authentication { auth_type PASS auth_pass Kp2015 # 最长 8 位超出会被截断 } track_script { chk_app } virtual_ipaddress { 192.168.10.100/24 dev eth0 } }节点 B 把router_id改成LVS_NODE_B、state改成BACKUP、priority降到 90其余不动。几个参数值得单独说state只是启动时的初始状态真正决定谁是主的是priority和抢占逻辑所以两台都写BACKUP也能选出主来这种写法在防止双主时反而更稳virtual_router_id在同一個二层网络里必须唯一两个不相干的集群用同一个 ID 会互相收到对方通告日志里能看到莫名的状态切换auth_pass在 1.2.13 里最长 8 个字符多写的部分会被静默截断两端都截断成一样还能通但一旦一端写 8 位一端写 10 位认证失败会导致一直处于 BACKUP。interface这一项特别容易错。CentOS 7 默认启用一致性网络命名网卡可能叫ens33、ens192你在配置里还写eth0keepalived 启动时不会报致命错误但 VIP 加不上去日志里是一行不起眼的Cannot find interface eth0。装之前先ip addr看清楚网卡名。4.2 vrrp_script 健康检查interval、fall、rise 和 weight 的正负号健康检查是 VIP 漂移的触发器脚本返回非 0 就判定节点异常。脚本本身很简单关键是写全路径、给执行权限#!/bin/bash # /etc/keepalived/check_app.sh # 检查本机业务端口是否存活返回 0 表示正常 /usr/bin/curl -s -o /dev/null -m 2 http://127.0.0.1:8080/health exit $?chmod 755 /etc/keepalived/check_app.sh参数的含义要掰开interval 2是每 2 秒执行一次fall 3表示连续失败 3 次才判定节点故障也就是最快 6 秒触发切换rise 2表示连续成功 2 次才恢复weight -20表示脚本失败时优先级减 20。这里有个反直觉的点权重为负值时减完的优先级如果低于对端就触发切换如果两台优先级差距大于权重绝对值减完还是比对方高VIP 就不会漂。比如主 100、备 90权重 -20主挂掉脚本后变成 80低于 90正常切换如果权重只写 -5减完是 95仍然高于备机VIP 就赖着不走。所以权重绝对值要大于两机优先级差值这是最常见的配置失误。还有一点1.2.13 没有新版那套script_user和enable_script_security机制脚本默认以启动 keepalived 的用户通常是 root执行不需要额外配用户。好处是省事坏处是脚本里如果用到了非 root 才能访问的资源排查时容易想不到这一层。4.3 组播还是单播unicast_peer 的写法与适用场景默认情况下 VRRP 走组播目的地址 224.0.0.18协议号 112。很多内网环境的安全策略会拦组播或者两台机器跨了网段、中间有设备不做组播转发这时候就得改成单播。1.2.13 支持单播写法是在vrrp_instance里加两块vrrp_instance VI_1 { # 其余配置省略 unicast_src_ip 192.168.10.11 # 本机用于发送通告的地址 unicast_peer { 192.168.10.12 # 对端地址可写多个 } }单播的好处是流量可控、能过大多数安全策略缺点是配置里写死了 IP机器换网段要同步改。用单播时注意unicast_src_ip必须是本机真实存在的地址写错了 keepalived 起不来或者通告发不出去两台机器要互相把对方写进unicast_peer只写一边等于单相思对端收不到通告状态永远起不来。另外 1.2.13 的单播不支持指定端口源码里 VRRP 端口是写死的别想着改端口绕过安全策略。5. 避坑与排查VIP 不漂移、双主、脚本不生效的五条血泪记录这一章是我这些年攒下来的排错笔记每条都按「看到什么现象、根子在哪、怎么修」写遇到问题直接对号入座。5.1 现象两台都显示 BACKUPVIP 谁都不加原因通常是 VRRP 通告根本没通。先在主备两台同时抓包确认# 抓 VRRP 协议IP 协议号 112看有没有收到对端通告 tcpdump -i eth0 -nn proto 112 -c 10如果本机只看到自己发出的包、看不到对方的基本就是链路或策略拦了。CentOS 7 的 firewalld 默认不放行 VRRP组播地址 224.0.0.18 也常被安全组忽略。解决方式是放行协议# firewalld 放行 VRRP 协议 firewall-cmd --permanent --add-rich-rulerule protocol valuevrrp accept firewall-cmd --reload如果中间有安全设备或者跨网段直接切单播更省事按 4.3 的写法加unicast_peer即可。5.2 现象两台机器同时持有 VIP业务时通时断这是双主最危险的一种。常见根因有三个一是virtual_router_id和同网段另一套集群撞了双方互相收通告状态来回跳二是两台机器之间网络时断时续各自以为对方挂了同时抢主三是用了state MASTER且没配nopreempt加上防火墙只放行单向流量。排查时先tcpdump看有没有收到非预期来源的 VRRP 包确认 ID 冲突就换一个网络抖动导致的把advert_int适当调大、配合fall参数增加容错实在不行两台都写state BACKUP加nopreempt让先起来的那台一直占着主位减少来回切。5.3 现象脚本明明返回失败VIP 还是不切先看脚本是不是真的被执行了。在脚本里加一行写文件的操作观察有没有输出再看 keepalived 日志里有没有VRRP_Script(chk_app) failed这类记录。常见的坑脚本没有执行权限keepalived 静默跳过脚本里用了相对路径或者没写全/usr/bin/curl在非交互环境 PATH 不全导致命令找不到返回值恰好是 0weight设成正值1.2.13 里正权重只在 BACKUP 状态生效主节点上脚本失败反而加了优先级逻辑正好反了。解决办法就是把脚本写成绝对路径、chmod 755、权重用负值并且绝对值大于优先级差。5.4 现象编译到一半报 OpenSSL 结构体错误前面提过这是 OpenSSL 1.1 及以上版本和 1.2.13 老代码的代差报错关键词是EVP_MD_CTX、dereferencing pointer to incomplete type。别去改源码打补丁除非你有长期维护的打算。最省事的做法是换一台 CentOS 7 编译或者用系统自带的 openssl 1.0.2 环境重新构建。如果生产环境必须是新系统就在 CentOS 7 上编好之后连同依赖库一起打包目标机用ldd /usr/local/keepalived/sbin/keepalived检查动态库是否齐全。5.5 现象改完配置 reload 不生效甚至进程直接退出systemctl reload keepalived发的是 HUP 信号1.2.13 对配置文件的语法检查不算严格有些错误 reload 时才暴露进程直接挂掉VIP 随之丢失。所以改配置前先做语法自检用keepalived -t -f /etc/keepalived/keepalived.conf做测试模式输出Configuration file ... validation successful再 reload。另外改virtual_router_id、interface这类底层参数reload 不一定能完全生效稳妥做法是systemctl restart但重启会短暂丢 VIP安排在维护窗口做。6. 验证跑通从抓包到手动切一次主的验收清单装完不验证等于没装。我的验收顺序是固定的一套先看进程和日志再看 VIP再抓包最后手动切一次主四步都过才算交付。第一步确认进程和配置加载正常systemctl status keepalived # 日志里应该能看到 Entering MASTER STATE 或 BACKUP STATE journalctl -u keepalived -n 50 --no-pager主节点日志里出现Entering MASTER STATE备节点出现Entering BACKUP STATE说明 VRRP 协商通了。如果两边都是 BACKUP回第 5 章第一条排查。第二步确认 VIP 落在正确的位置ip addr show eth0 | grep 192.168.10.100只在主节点上有输出备节点上查不到这是正确状态。第三步抓包确认通告是双向的。在主备两台各执行十秒看能不能同时看到来源为对方 IP 的 VRRP 包timeout 10 tcpdump -i eth0 -nn proto 112第四步手动制造一次故障验证漂移和回切。最直接的方式是在主节点停服务systemctl stop keepalived # 到备节点上确认 VIP 是否漂过来 ip addr show eth0 | grep 192.168.10.100VIP 应该在几秒内出现在备节点上业务侧用curl访问 VIP 能通。然后再把主节点起回来观察是否按预期回切。如果配了nopreempt主节点恢复后不会抢回 VIP这是正常的别当成故障。验证健康检查脚本时我一般直接改脚本让它返回 1观察fall次数到达后是否触发切换比停服务更贴近真实故障场景。验收项通过标准不通过先看哪进程状态主备均 active (running)journalctl 日志角色状态一主一备无来回跳VRRP 通告是否互通VIP 位置仅主节点持有interface 网卡名故障切换停主后 VIP 数秒内漂移weight 与优先级差业务连通访问 VIP 返回正常本机服务与回环地址从那以后我每次交付这类环境都会在最后强制走一遍「停主、看漂、起主、看回切」不靠日志里那句 MASTER 就下结论。这套 keepalived-1.2.13 的源码包我一直留在内部制品库里版本固定、校验值固定省得每次换机器又去满世界找同版本的 tar.gz需要复现这套环境的话直接拿这份包按上面的顺序走一遍就行。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑