好的,检查 Keepalived 配置是一个常见的运维任务。Keepalived 本身提供了强大的配置检查和排错工具。以下是系统性的方法和步骤:
方法一:使用 Keepalived 自带命令进行语法检查
这是最重要且首先应该做的一步。Keepalived 的二进制文件 (keepalived
) 自带了一个非常实用的 -t
或 --check
参数,它专门用于验证配置文件的语法是否正确,而不会真正启动服务。
命令如下:
sudo keepalived -t -f /path/to/your/keepalived.conf
# 或者,如果你的配置文件在默认位置 (/etc/keepalived/keepalived.conf)
sudo keepalived -t
-t
或--check
:检查模式。-f
:指定配置文件路径(如果使用非默认路径)。
结果分析:
如果配置完全正确,命令执行后只会输出一行关于
Using libnl
的信息,然后直接退出,返回码为0
(成功)。- 示例输出:
Keepalived v2.2.8 (10/12,2023)... Started with no daemon mode and check only mode. Using Libnl
- 示例输出:
如果配置有错误,它会明确地指出错误发生在第几行,以及错误的类型。
- 示例输出:
根据这个提示,你就知道是同步组Configuration error: VRRP instance(s) missing in sync group VG_1 ---------< snip >--------- Configuration file /etc/keepalived/keepalived.conf is invalid!
VG_1
中引用的 VRRP 实例未定义或名称拼写错误。
- 示例输出:
方法二:启用详细日志进行运行时诊断
如果语法检查通过了,但 Keepalived 在运行时行为异常(如无法成为 MASTER、不发送通告等),就需要启用详细日志来观察其内部状态机的变化和网络交互。
修改日志配置: 编辑
/etc/keepalived/keepalived.conf
,在 最顶层(不属于任何vrrp_instance
或vrrp_sync_group
)添加以下行:global_defs { # 启用详细日志。级别从低到高通常是: -4 (仅错误) -> 0 (常规信息) -> 4 (详细调试) # 建议从级别 2 或 3 开始排查 notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 # 【核心配置】设置日志级别和设施 log_file /var/log/keepalived.log # (可选)自定义日志文件路径 log_file syslog # (可选)也可以直接输出到syslog log_facility local0 # syslog设施 log_additional_info on # (可选)记录额外信息 } # 【核心配置】为每个VRRP实例开启详细调试(推荐) vrrp_instance VI_1 { ... debug # <--- 这行很重要!开启此实例的VRRP协议调试 notify_master "/path/to/master_script.sh" notify_backup "/path/to/backup_script.sh" }
更高级别的调试可以在
vrrp_instance
块内使用-v
(verbose):vrrp_instance VI_1 { ... debug -v # Level A (较详细) # debug -vv # Level B (非常详细) ... }
重启服务并查看日志:
sudo systemctl restart keepalived sudo tail -f /var/log/messages # CentOS/RHEL/Fedora sudo tail -f /var/log/syslog # Ubuntu/Debian # or if you used a custom log file: sudo tail -f /var/log/keepalived.log
在日志中寻找关键信息: 在详细的日志中,你可以看到:
- VRRP Advertisement(通告)的接收和发送。
- 状态转换:
Entering BACKUP STATE
->Entering MASTER STATE
。 - 优先级比较。
- IPVS(如果你用了LVS)的规则加载和卸载。
- Script execution results(脚本执行结果)。
⚠️常见问题排查点(Checklist)
即使语法正确,运行时也可能因为环境问题导致故障。请对照检查:
防火墙/SELinux: 确保防火墙允许 VRRP协议(IP协议号112) 和组播地址 224.0.0.18 的通信。
防火墙放行VRRP协议的命令示例(Ubuntu/CentOS):
# Ubuntu ufw
sudo ufw allow proto vrrp
# CentOS firewalld
sudo firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
sudo firewall-cmd --reload
# Or for older iptables systems:
sudo iptables -A INPUT -p vrrp -j ACCEPT
- 临时禁用SELinux测试是否是它导致的:
sudo setenforce Permissive
网络接口名称: 确认
interface eth0
(或ens192
,enp0s3
等)的配置与实际的网卡名 (ip addr
)完全一致。虚拟路由器ID冲突: 在同一广播域内,不同的 Keepalived集群必须使用不同的
virtual_router_id
。优先级设置: 确保你希望成为MASTER的节点拥有更高的
priority
。脚本问题: 在
vrrp_script
或notify_*
中引用的脚本必须有可执行权限 (chmod +x
) ,并且自身逻辑正确。脚本的非零退出会导致状态切换失败。组播问题: 某些云服务商(如AWS, Azure, GCP)不支持组播。在这种情况下,必须使用 单播VRRP(unicast_peer)配置。
9.单播模式下的防火墙规则差异
如果是单播模式(unicast_peer { x.x.x.x }
)需要放行对端IP地址的TCP端口112(或其他自定义端口),而不仅仅是VRRP协议:
# For Unicast Mode on firewalld:
sudo firewall-cmd --add-port=112/tcp --permanent && sudo firewall-cmd --reload
# Or for older iptables systems:
sudo iptables -A INPUT -p tcp --dport <PORT> -s <PEER_IP> -j ACCEPT
###总结排查流程
- 第一步:永远先运行
sudo keepalived -t
进行静态语法检查。 - 第二步:如果语法无误但行为异常,开启
debug
日志并重启服务。 - 第三步:实时跟踪系统日志 (
tail -f /var/log/syslog
) ,观察状态转换和错误信息。 - 第四步:对照上述“常见问题排查点”,逐一检查网络、防火墙、脚本等环境因素。
遵循这个流程,绝大多数Keepalived的配置问题都可以被定位和解决。
内容由零声教学AI助手提供,问题来源于学员提问