keepalived虽不支持原生模块化,但可通过职责分离(全局设置、vrrp实例、健康检查脚本)、脚本化检测逻辑、主备配置变量化及严格验证流程实现高可维护的类模块化管理。

Keepalived 配置文件本身不支持原生模块化(如 include 指令),但可通过合理组织结构、外部脚本联动和配置拆分策略,实现逻辑清晰、便于维护的“类模块化”管理。关键不是强行拆文件,而是让配置职责分明、可复用、易验证。
按功能职责拆分配置逻辑
虽然 keepalived.conf 是单文件,但内容应明确划分为三块:
- 全局基础设置(global_defs):仅含 router_id、通知邮箱(可注释)、SMTP 设置(生产环境慎用);避免冗余字段,如 vrrp_strict 在非严格合规场景下可关闭以提升兼容性
- VRRP 实例主体(vrrp_instance):专注 VIP 漂移逻辑——state、interface、virtual_router_id、priority、advert_int、authentication、virtual_ipaddress;不混入健康检查细节
- 健康检查脚本定义(vrrp_script + track_script):独立声明检测逻辑(如 check_nginx),再在实例中引用;脚本路径统一放在 /etc/keepalived/script/ 下,便于权限管理和版本控制
用脚本替代硬编码检查逻辑
把 Nginx 状态判断、服务启停、日志记录等操作全部下沉到 Shell 脚本中,配置文件只负责调用和参数控制:
- 脚本示例:/etc/keepalived/script/chk_nginx.sh 中用
pgrep -f "nginx: master"判断进程,比ps -C nginx更可靠(兼容多版本启动方式) - 配置中通过
interval 3、fall 3、rise 2控制检测节奏,避免频繁抖动;weight 值用于动态调整优先级,不建议直接 kill 进程,应先尝试 reload - 所有脚本需加执行权限:
chmod +x /etc/keepalived/script/*.sh,并确保script_user root明确指定运行身份
主备配置差异化最小化
两台机器共用同一份配置模板,仅通过少量变量区分角色:
- 使用 Ansible/Jinja2 或简单 sed 替换:将
state MASTER、priority 100、router_id lb01抽离为变量,部署时注入 - virtual_router_id 和 auth_pass 必须完全一致;virtual_ipaddress 写法统一(如
192.168.1.100/32),避免掩码差异导致 ARP 异常 - 禁用
vrrp_skip_check_adv_addr(默认开启)可减少误判,但若网络存在二层干扰,可临时启用跳过校验
配置生效前必须做的验证动作
每次修改后不直接重启,而分步确认:
- 执行
keepalived -t -f /etc/keepalived/keepalived.conf检查语法;返回 “Configuration is OK” 才继续 - 手动运行检测脚本:
/etc/keepalived/script/chk_nginx.sh && echo $?,确认 exit code 为 0(正常)或非 0(异常触发切换) - 用
ip addr show dev eth0 | grep 192.168.1.100观察 VIP 是否已绑定;再模拟 kill nginx,观察 VIP 是否在 3–5 秒内漂移到备用节点











