第三篇:keepalived 配置排障篇:keepalived.conf 全参数剖析 + 常见坑大全
开篇不少同学第一次接触 Keepalived面对/etc/keepalived/keepalived.conf里密密麻麻的配置一脸懵。有的参数看起来像英文但意思完全不是那回事比如advert_int不是广告有的配置错了能启动但就是不漂移让人抓狂。本文作为 Keepalived 系列第 3 篇把所有配置参数掰开揉碎每个都讲清楚是什么、怎么写、坑在哪最后给出完整的排障命令清单和高频问题速查表。看完你就能独立排查 90% 的 Keepalived 问题。一、配置文件整体结构keepalived.conf由几个顶层块组成结构如下conf! Configuration File for keepalivedglobal_defs { # ① 全局配置...}static_ipaddress { # ②可选静态地址一般不配...}vrrp_script chk_xxx { # ③可选健康检查脚本声明...}vrrp_instance VI_1 { # ④ VRRP 实例核心...}习惯#和!都表示注释。配置改动后必须systemctl restart keepalived生效改动前建议先keepalived -t语法校验。二、global_defs 全局配置详解confglobal_defs {router_id KEEPALIVED_1 # 路由器标识仅日志区分用可随意notification_email { # 报警邮箱列表需配 sendmailadminexample.com}notification_email_from keepalivedexample.comsmtp_server 127.0.0.1 # SMTP 服务器smtp_connect_timeout 30enable_script_security # 安全加固脚本必须以绝对路径、且属主为 root 或非rootscript_user root # 指定健康检查脚本运行用户vrrp_skip_check_adv_addr # 跳过对通告地址合法性的检查防止误报vrrp_strict # 严格模式限制较严调试期建议注释vrrp_garp_interval 0 # 主备切换后发送免费ARP的最小间隔vrrp_gna_interval 0}易坑点router_id各节点可以不同不影响协同只是日志标识。vrrp_strict一开很多合法配置会报错调试阶段先注释。老配置里notification_email若没配好 sendmailKeepalived 启动可能报错甚至起不来生产可整段删掉。三、vrrp_instance 核心参数逐个讲confvrrp_instance VI_1 {state MASTER # ① 初始角色声明interface eth0 # ② 绑定网卡virtual_router_id 51 # ③ 虚拟路由器IDpriority 150 # ④ 优先级advert_int 1 # ⑤ 通告间隔nopreempt # ⑥ 非抢占可选preempt_delay 10 # ⑦ 抢占延迟可选authentication { # ⑧ 认证auth_type PASSauth_pass 123456}unicast_src_ip 192.168.1.11 # ⑨ 单播源IP云环境unicast_peer { # ⑩ 单播对端192.168.1.12}virtual_ipaddress { # ⑪ 虚拟IP192.168.1.100/24 dev eth0 label eth0:0}track_interface { # ⑫ 跟踪网卡eth0}track_script { # ⑬ 跟踪脚本chk_nginx}notify_master ... # ⑭ 状态切换通知notify_backup ...notify_fault ...}① state —— 初始角色声明confstate MASTER # 或 BACKUP坑它只是初始声明不决定最终结果。真正决定谁是 Master 的是priority 心跳状态。备节点哪怕写 BACKUPpriority 更高也能当上 Master。② interface —— 绑定网卡confinterface eth0VIP 要绑定在这块网卡上。坑网卡名必须正确ip a确认是 eth0、ens33 还是 ens160写错则 VIP 起不来。③ virtual_router_id —— 虚拟路由器 IDconfvirtual_router_id 51 # 0~255同组所有节点必须一致。不同业务组必须不同。坑同一局域网内两台不同服务若撞了 ID会互相干扰导致漂移异常。④ priority —— 优先级选举核心confpriority 150 # 1~255越大越优先主备必须不同且结合 weight 算清楚主挂后还比备高不高详见系列第 1 篇。⑤ advert_int —— 通告间隔confadvert_int 1 # 单位秒Master 每隔该秒数广播一次 VRRP 通告。坑这是秒不是毫秒。改成 2 会让故障检测变慢3×26秒才判主失效。追求快速切换可设为 0.x——不允许小数v2 只能是整数秒。⑥ nopreempt —— 非抢占confnopreempt开启后即使 Backup priority 更高Master 恢复后也不抢回 VIP。必须两台都配 nopreempt 且 state 都写 BACKUP才生效否则主恢复仍会抢占。适用于不想频繁主备抖动的场景。⑦ preempt_delay —— 抢占延迟confpreempt_delay 10开启抢占时成为 Master 前延迟 N 秒避免刚启动时抢占抖动。⑧ authentication —— 认证confauthentication {auth_type PASS # PASS 简单认证 / AH IPSEC认证auth_pass 123456}坑auth_pass最多 8 位且同组必须一致。用 AH 类型在部分网卡上会被丢弃默认 PASS 即可。⑨⑩ unicast_src_ip / unicast_peer —— 单播云环境必配confunicast_src_ip 192.168.1.11unicast_peer {192.168.1.12}unicast_src_ip本机真实 IP。unicast_peer对端真实 IP 列表。配置了单播后Keepalived 不再用组播云服务器、多播被禁环境必须用。⑪ virtual_ipaddress —— 虚拟 IPconfvirtual_ipaddress {192.168.1.100/24 dev eth0 label eth0:0# 也可以写多行配置多个VIP192.168.1.101/24 dev eth0 label eth0:1}dev绑定的网卡。label子接口名eth0:0便于ip addr识别。坑掩码/24必须写否则路由可能异常。⑫ track_interface —— 跟踪网卡状态conftrack_interface {eth0}网卡 down 时即使本机还活着也主动降低优先级甚至放弃 Master防止网卡挂了还硬撑。多网卡建议把承载关键流量的都加进来。⑬ track_script —— 跟踪健康检查脚本conftrack_script {chk_nginx}关联下面声明的vrrp_script业务进程挂了自动减分让位详见下节。⑭ notify_* —— 状态切换通知confnotify_master /path/to/script.sh masternotify_backup /path/to/script.sh backupnotify_fault /path/to/script.sh fault状态切换时执行脚本常用于业务接管动作如 MySQL 重启后把从库提为主库、脚本里执行replication master。脚本返回值非 0 不影响状态机。四、vrrp_script 健康检查详解这是高可用是否真的可靠的关键。语法confvrrp_script chk_nginx {script /etc/keepalived/check_nginx.sh # 检查脚本绝对路径interval 2 # 每2秒执行一次timeout 2 # 脚本执行超时超时视为失败weight -60 # 失败时 priority 减60fall 2 # 连续2次失败才判定失败防抖动rise 1 # 连续1次成功即恢复}脚本返回值约定返回0健康Master 可保持。返回非 0不健康priority 减去weight。脚本要可执行chmod x /etc/keepalived/check_nginx.sh。weight 的三种用法必懂weight效果适用正数如 5健康时 priority增加Backup 想身体好就加分负数如 -60失败时 priority减少最常用让位给备机0失败直接放弃 Master进 Fault要求严格的主备切换坑高频主 priority150weight -20→ 失败变 130备 priority100。130 100VIP 不会漂移必须保证主失败后 priority 仍低于备正确示例主 150 配weight -60→90 备 100或主配weight 0直接让位。检查脚本怎么写才对错误示范只查进程Nginx 卡死也查不出bash#!/bin/bashpgrep -x nginx /dev/null推荐真正探测业务可用性。bash#!/bin/bash# 探测 Nginx 首页返回码0则健康curl -sf http://127.0.0.1/index.html /dev/nullexit $?bash# 检查 MySQL 是否可连mysqladmin ping -uroot -p密码 /dev/null 21exit $?五、配置正确性校验上线前必做改完配置先校验别直接 restartbash# 语法校验不启动服务keepalived -t# 查看配置解析结果keepalived -t -f /etc/keepalived/keepalived.conf校验通过再启动/重启bashsystemctl restart keepalivedsystemctl status keepalived六、排障命令速查复制即用6.1 看状态与日志bash# 进程是否在跑ps -ef | grep keepalived# 实时日志最关键tail -f /var/log/messages | grep -i keepalived# 或journalctl -u keepalived -f# 当前角色是 Master 还是 Backupip addr show eth0 | grep 192.168.1.100 # 有VIP当前是Master6.2 判断主备是否正常协商bash# 抓 VRRP 报文确认心跳在走tcpdump -i eth0 -nn proto 112 # 组播模式tcpdump -i eth0 -nn host 192.168.1.12 # 单播模式# 看多播是否通组播模式下ping 224.0.0.186.3 强制触发主备切换测试用bash# 方法1停掉业务触发健康检查减分systemctl stop nginx# 方法2手动释放 VIP谨慎ip addr del 192.168.1.100/24 dev eth06.4 手动刷新 ARP免费ARP失败的补救basharp -d 192.168.1.100七、高频问题速查表直接对号入座现象根因解决起不来配置语法错keepalived -t检查两台都是 Master心跳不通多播被禁改单播unicast_*Nginx 挂了 VIP 不漂移weight 减分后主仍高于备主 weight-60 或 weight 0VIP 能起但不通掩码/网卡 label 错确认/24与dev eth0主恢复后不切回nopreempt 生效想抢占就去掉 nopreempt频繁抖动抢占 心跳不稳加nopreemptpreempt_delay日志提示 auth 失败auth_pass 超8位或两端不一改 ≤8 位且一致云上 VIP 漂移失败多播被云商丢弃必须用单播安全组放行免费 ARP 未刷新网关/交换机缓存旧 MACarp -d手动清切换后业务要额外动作业务侧需接管脚本用notify_master写接管动作八、一个套路化的完整配置模板主节点 node1192.168.1.11可直接改参数复用conf! 主节点 node1global_defs {router_id KEEPALIVED_NODE1}vrrp_script chk_nginx {script /etc/keepalived/check_nginx.shinterval 2timeout 2weight -60fall 2rise 1}vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 51priority 150advert_int 1authentication {auth_type PASSauth_pass 123456}unicast_src_ip 192.168.1.11unicast_peer {192.168.1.12}virtual_ipaddress {192.168.1.100/24 dev eth0 label eth0:0}track_interface {eth0}track_script {chk_nginx}}备节点 node2192.168.1.12只需改router_id、state BACKUP、priority 100、unicast_src_ip 192.168.1.12、unicast_peer { 192.168.1.11 }。九、总结Keepalived 配置的核心其实就围绕priority选举 weight动态加减分 心跳advert_int/单播三者展开。记住三条铁律同组参数必须一致virtual_router_id、auth_pass、advert_int。weight 必须算清主挂后是否让位这是漂移失败的元凶。云环境必用单播多播在云上基本必被弃。掌握了配置逻辑再配合上面的排障命令Keepalived 基本不再有玄学问题。本文为 Keepalived 高可用系列第 3 篇。下一篇Keepalived MySQL 主从高可用实战。