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 漂移、健康检查与脑裂问题,确保主备切换稳定可控。