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 表变化。