12.4.6 常见问题与排错思路
常见问题与排错思路#
本节以“现象分类—日志定位—网络验证—配置校验—脚本检查”的顺序进行排错,并给出可执行示例、安装与验证命令、原理草图和练习。
原理草图(VRRP 通告与漂移链路)
基础安装与版本一致性检查(排错前必做)
# 安装(以 Rocky/CentOS 为例)
sudo dnf -y install keepalived
# 启动与自启
sudo systemctl enable --now keepalived
# 版本一致性检查(主备都执行)
keepalived -v
命令解释:keepalived -v 用于确认主备版本一致,避免版本差异导致状态机行为不同。
1. VIP 不漂移或漂移失败
现象:备机未接管 VIP,或漂移后业务不可用。
排错步骤与命令
# 1) 服务状态与配置加载
systemctl status keepalived
# 2) VIP 是否在主机上
ip a | grep -A2 "vip0"
# 3) VRRP 通告抓包(主备均执行)
tcpdump -i eth0 vrrp
命令解释:
- systemctl status 确认进程存活与配置是否加载成功。
- ip a 检查 VIP 是否绑定到正确网卡。
- tcpdump 验证 VRRP 112 协议通告是否互达。
关键配置核对示例(/etc/keepalived/keepalived.conf)
vrrp_instance VI_1 {
state MASTER # 备机为 BACKUP
interface eth0 # 必须是 VIP 所在网卡
virtual_router_id 51 # 主备必须一致
priority 150 # 主高备低
advert_int 1 # 主备一致
authentication {
auth_type PASS
auth_pass 123456 # 主备必须一致
}
virtual_ipaddress {
10.0.0.100/24 dev eth0 label eth0:vip0
}
}
预期效果:主机 ip a 能看到 10.0.0.100/24,备机不绑定;主机停止 keepalived 后,备机绑定 VIP。
2. 频繁主备切换(抖动)
常见原因:健康检查超时、fall/rise 设置过小、网络抖动。
调整示例
vrrp_script chk_nginx {
script "/usr/local/bin/chk_nginx.sh"
interval 2
fall 5
rise 5
timeout 2
}
vrrp_instance VI_1 {
track_script {
chk_nginx
}
garp_master_delay 2
garp_master_repeat 2
}
命令解释:
- fall/rise 增大可降低误判。
- timeout 限制脚本执行时间,避免阻塞。
排错命令
# 监测链路丢包
ping -c 10 -i 0.2 10.0.0.2
# 查看 CPU/IO
top -c
3. 健康检查误判
脚本示例(/usr/local/bin/chk_nginx.sh)
#!/usr/bin/env bash
# 返回 0 表示成功,其它表示失败
curl -fsS http://127.0.0.1/healthz >/dev/null 2>&1
exit $?
# 授权与测试
chmod +x /usr/local/bin/chk_nginx.sh
/usr/local/bin/chk_nginx.sh; echo $?
命令解释:脚本返回码必须严格控制,0 为成功,否则触发降级/切换。
4. 脑裂与双主现象
排查步骤
# 验证 VRRP 是否互达
tcpdump -i eth0 vrrp
# 检查 VRRP 实例冲突
grep -n "virtual_router_id" /etc/keepalived/keepalived.conf
解决策略:
- 若多播被禁用,改为单播:
vrrp_instance VI_1 {
unicast_src_ip 10.0.0.1
unicast_peer {
10.0.0.2
}
}
5. 通知脚本不生效
示例与验证
vrrp_instance VI_1 {
notify_master "/usr/local/bin/notify_master.sh"
notify_backup "/usr/local/bin/notify_backup.sh"
notify_fault "/usr/local/bin/notify_fault.sh"
}
# 脚本权限与执行环境
chmod +x /usr/local/bin/notify_*.sh
# 日志定位
journalctl -u keepalived -f
命令解释:通知脚本必须可执行,日志中可看到脚本调用情况。
6. 系统参数与 ARP 异常
常用参数核查
sysctl -a | egrep "ip_nonlocal_bind|arp_ignore|arp_announce"
# 典型设置
cat >/etc/sysctl.d/99-keepalived.conf <<'EOF'
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
EOF
sysctl --system
预期效果:VIP 绑定后 ARP 行为正确,避免多主冲突。
7. 典型排错流程(命令串联)
# 1) 服务状态
systemctl status keepalived
# 2) 查看日志
journalctl -u keepalived -n 200 --no-pager
# 3) VIP 与路由
ip a; ip r
# 4) 抓包验证 VRRP
tcpdump -i eth0 vrrp -vv
# 5) 健康检查脚本验证
/usr/local/bin/chk_nginx.sh; echo $?
练习与验证(带预期)
1) 模拟主故障切换
# 主机执行
systemctl stop keepalived
预期:备机 ip a 出现 VIP,业务可用。
2) 验证健康检查误判
# 停掉 nginx 或改坏健康检查 URL
systemctl stop nginx
journalctl -u keepalived -f
预期:日志出现脚本失败,触发降级或切换。
3) 验证脑裂防护
# 临时阻断 VRRP 通告
iptables -A INPUT -p vrrp -j DROP
tcpdump -i eth0 vrrp
预期:通告被阻断,可能触发双主;恢复后应回归单主。
通过上述示例与命令串联,可快速定位 VIP 漂移、健康检查与脑裂问题,确保主备切换稳定可控。