12.7.4 性能与稳定性调优

性能与稳定性调优围绕 VRRP 通告稳定、健康检查开销、网络链路与内核参数展开,目标是降低误切换、提升故障收敛速度,并保证业务流量稳定转发。

0. 原理草图(VRRP 通告与健康检查影响切换)

文章图片

1. VRRP 稳定性参数优化(含完整配置示例)
示例路径:/etc/keepalived/keepalived.conf
目标:降低抖动误切换,提升收敛速度。

global_defs {
  router_id KA_MASTER
  vrrp_skip_check_adv_addr
  vrrp_garp_interval 1
  vrrp_gna_interval 1
}

vrrp_instance VI_1 {
  state MASTER
  interface eth0
  virtual_router_id 51
  priority 150
  advert_int 1
  nopreempt
  authentication {
    auth_type PASS
    auth_pass 12345678
  }
  virtual_ipaddress {
    10.0.0.100/24 dev eth0
  }
  track_script {
    chk_nginx
  }
}

命令解释与预期效果:
- advert_int 1:1 秒发送一次 VRRP 广告包,提高故障收敛速度。
- priority 150:主备差距建议≥20,减少短时抖动造成抢占。
- nopreempt:避免恢复后立即抢占,降低“抖动—切换—抖动”。

验证:

# 查看 VIP 是否在主节点
ip addr show dev eth0 | grep 10.0.0.100
# 观察 VRRP 广告包
tcpdump -ni eth0 vrrp

2. 健康检查与切换策略(含脚本示例与超时控制)
脚本路径:/etc/keepalived/chk_nginx.sh

#!/usr/bin/env bash
# 检查 Nginx 进程与端口存活,超时 2 秒
timeout 2 bash -c 'pidof nginx >/dev/null' || exit 1
timeout 2 bash -c 'curl -sf http://127.0.0.1:80/health >/dev/null' || exit 1
exit 0

keepalived.conf 里绑定:

vrrp_script chk_nginx {
  script "/etc/keepalived/chk_nginx.sh"
  interval 2
  timeout 2
  weight -30
  fall 3
  rise 2
}

命令解释与预期效果:
- interval 2:每 2 秒检查一次,降低系统负载。
- fall 3:连续 3 次失败才触发权重下降,减少误判。
- weight -30:权重降低但不立即剥夺 VIP,可配合 priority

3. 系统与网络内核参数(含完整落地步骤)
示例路径:/etc/sysctl.d/99-keepalived.conf

net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.all.arp_ignore=1
net.ipv4.ip_forward=1
net.netfilter.nf_conntrack_max=262144
net.netfilter.nf_conntrack_tcp_timeout_established=600

应用与验证:

sysctl -p /etc/sysctl.d/99-keepalived.conf
sysctl -a | egrep 'rp_filter|arp_announce|arp_ignore|ip_forward|nf_conntrack'

命令解释与预期效果:
- rp_filter=0:避免因源地址校验导致回包异常。
- arp_announce/arp_ignore:加速 VIP 漂移,减少 ARP 表震荡。
- nf_conntrack_max:并发大时避免连接跟踪表耗尽。

4. 进程与资源保障(含 systemd 优先级示例)
示例路径:/etc/systemd/system/keepalived.service.d/override.conf

[Service]
Nice=-5

应用:

mkdir -p /etc/systemd/system/keepalived.service.d
systemctl daemon-reload
systemctl restart keepalived
systemctl status keepalived

预期效果:高负载时 keepalived 仍能及时发送 VRRP 通告。

5. 日志与监控联动(含日志切换与排错命令)
日志级别设置(keepalived.conf):

global_defs {
  vrrp_garp_interval 1
  vrrp_gna_interval 1
  log_file /var/log/keepalived.log
  log_detail
}

排错命令:

tail -f /var/log/keepalived.log
journalctl -u keepalived --since "10 min ago"

常见日志与解释:
- Entering MASTER STATE:切为主节点。
- VRRP_Instance(VI_1) Received higher prio advert:收到更高优先级,可能发生抢占。

6. 典型排错流程(示例)
场景:VIP 频繁漂移
步骤:

# 1) 检查 VRRP 包是否丢失
tcpdump -ni eth0 vrrp

# 2) 检查脚本失败率
grep -i "script" /var/log/keepalived.log | tail -n 20

# 3) 检查网卡丢包
ip -s link show dev eth0

可能原因与处理:
- VRRP 丢包:检查交换机 ACL、端口镜像与 MTU。
- 脚本超时:提升脚本超时或减少探测项。

7. 稳定性验证与演练(可执行步骤)

# 模拟服务异常
systemctl stop nginx

# 观察 VIP 漂移
ip addr show dev eth0 | grep 10.0.0.100
ssh backup-node "ip addr show dev eth0 | grep 10.0.0.100"

# 恢复服务并观察是否抢占(nopreempt时应保持在备机)
systemctl start nginx

8. 练习题(带预期目标)
1) 将 advert_int 从 1 调整为 2,观察切换收敛时间变化并记录。
2) 将 fall 从 3 调整为 1,制造一次 curl 超时,观察是否误切换。
3) 关闭 arp_ignore 后测试 VIP 漂移速度差异并记录 ARP 表变化。