1. Keepalived虚拟路由配置实战指南
在分布式系统架构中,服务的高可用性一直是运维工程师的核心关注点。记得去年我们线上商城的一次大促活动,就因为Nginx主节点突然宕机导致整个网站不可用近20分钟,损失惨重。那次事故后,我们引入了Keepalived解决方案,至今系统已经稳定运行了300多天。今天我就来分享这套经过实战检验的Keepalived配置方案。
Keepalived本质上是通过VRRP协议实现IP地址漂移的高可用方案。与Heartbeat等方案相比,它的配置更简洁,资源占用更低,特别适合Web服务器、数据库中间件等场景。下面我将从原理到实践,详细拆解单主、双主架构的配置方法,以及如何避免常见的"VIP抖动"问题。
2. Keepalived核心机制解析
2.1 VRRP协议工作原理
VRRP(Virtual Router Redundancy Protocol)是Keepalived的基石。这个协议通过多播地址224.0.0.18进行通信,默认每1秒发送一次通告(advertisement)。当备份节点连续3次未收到主节点通告时,就会触发主备切换。
关键参数解析:
- priority(优先级):范围1-254,值越大优先级越高
- advert_int:通告间隔,建议保持默认1秒
- authentication:建议使用PASS类型认证,防止非法节点加入
生产环境经验:在跨机房部署时,需要特别注意防火墙要放行VRRP协议的IP协议号112(不是端口!)
2.2 虚拟IP漂移机制
VIP(Virtual IP)是服务的对外入口。当主节点失效时,备份节点会通过ARP广播更新网络设备的MAC地址表。这里有个关键细节:Linux默认会限制ARP通告频率,需要调整以下参数:
bash复制# 调整ARP相关内核参数
echo "net.ipv4.conf.all.arp_announce = 2" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf
sysctl -p
2.3 健康检查机制
Keepalived支持两种健康检查:
- 内置检查:通过ICMP检测节点网络连通性
- 自定义脚本:通过返回值判断服务状态(0表示健康,非0表示异常)
我们线上使用的Nginx检查脚本示例:
bash复制#!/bin/bash
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
systemctl restart nginx
sleep 3
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
exit 1
fi
fi
exit 0
3. 单主架构配置实战
3.1 基础环境准备
实验环境:
- 系统:CentOS 8.4
- 节点1:KA1 (172.25.254.50)
- 节点2:KA2 (172.25.254.60)
- VIP:172.25.254.100
安装Keepalived:
bash复制dnf install keepalived -y
systemctl enable --now keepalived
3.2 Master节点配置
/etc/keepalived/keepalived.conf完整配置:
bash复制global_defs {
router_id KA1 # 唯一标识符
}
vrrp_instance VI_1 {
state MASTER # 初始状态
interface eth0 # 绑定的网卡
virtual_router_id 51 # 组ID,同一组必须相同
priority 100 # 优先级(1-254)
advert_int 1 # 通告间隔
authentication {
auth_type PASS
auth_pass 1111 # 密码建议超过8位
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
track_script {
chk_nginx # 健康检查脚本名
}
}
3.3 Backup节点配置
Backup配置与Master基本相同,只需修改:
bash复制state BACKUP
priority 90 # 优先级低于Master
3.4 非抢占模式优化
默认的抢占模式会导致VIP频繁漂移,建议改为nopreempt模式:
bash复制vrrp_instance VI_1 {
...
nopreempt # 启用非抢占模式
preempt_delay 300 # 抢占延迟(秒)
...
}
重要提示:在非抢占模式下,所有节点state都应该配置为BACKUP,否则配置不生效!
4. 双主架构高级配置
对于高并发场景,可以采用双主架构实现负载分担:
4.1 KA1节点配置
bash复制vrrp_instance VI_1 {
state MASTER
virtual_router_id 51
priority 100
virtual_ipaddress {
172.25.254.100/24
}
}
vrrp_instance VI_2 {
state BACKUP
virtual_router_id 52
priority 90
virtual_ipaddress {
172.25.254.101/24
}
}
4.2 KA2节点配置
bash复制vrrp_instance VI_1 {
state BACKUP
virtual_router_id 51
priority 90
virtual_ipaddress {
172.25.254.100/24
}
}
vrrp_instance VI_2 {
state MASTER
virtual_router_id 52
priority 100
virtual_ipaddress {
172.25.254.101/24
}
}
这样两个VIP会分别绑定在不同的物理节点上,通过DNS轮询可以实现初步的负载均衡。
5. 生产环境调优技巧
5.1 单播模式配置
多播模式可能引发网络风暴,建议改用单播通信:
bash复制vrrp_instance VI_1 {
...
unicast_src_ip 172.25.254.50 # 本机IP
unicast_peer {
172.25.254.60 # 对端IP
}
...
}
5.2 邮件告警集成
通过notify机制实现状态变更通知:
bash复制vrrp_instance VI_1 {
...
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
...
}
notify.sh脚本示例:
bash复制#!/bin/bash
case "$1" in
master)
echo "$(date) - 切换为MASTER状态" | mail -s "Keepalived状态变更" admin@example.com
/etc/init.d/nginx start
;;
backup)
echo "$(date) - 切换为BACKUP状态" | mail -s "Keepalived状态变更" admin@example.com
/etc/init.d/nginx stop
;;
fault)
echo "$(date) - 进入FAULT状态" | mail -s "Keepalived状态异常" admin@example.com
;;
esac
5.3 与LVS集成实现四层负载均衡
在Keepalived配置中添加IPVS规则:
bash复制virtual_server 172.25.254.100 80 {
delay_loop 6
lb_algo wrr # 加权轮询
lb_kind DR # 直接路由模式
protocol TCP
real_server 172.25.254.31 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.25.254.32 80 {
weight 2
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
6. 常见故障排查指南
6.1 VIP无法漂移
检查步骤:
- 确认防火墙放行了VRRP协议
bash复制
iptables -I INPUT -p vrrp -j ACCEPT - 检查网络连通性
bash复制
tcpdump -i eth0 -nn host 224.0.0.18 - 查看Keepalived日志
bash复制
journalctl -u keepalived -f
6.2 脑裂问题处理
当两个节点都认为自己是Master时:
- 检查网络分区情况
- 验证认证密码是否一致
- 考虑引入第三方仲裁(如ping检测)
bash复制vrrp_script chk_gateway {
script "ping -c 1 -W 1 172.25.254.1"
interval 2
weight -5 # 检测失败时降低优先级
}
track_script {
chk_gateway
}
6.3 性能优化建议
- 调整内核参数提升ARP响应速度:
bash复制echo "net.ipv4.conf.all.arp_announce = 2" >> /etc/sysctl.conf echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf sysctl -p - 对于万兆网卡,建议减小advert_int到0.5秒:
bash复制
advert_int 0.5
经过多次线上实战,我们发现Keepalived的稳定性很大程度上取决于网络质量。建议在部署前先用iperf测试节点间网络延迟,确保在1ms以内。另外,非抢占模式虽然能减少VIP抖动,但在主节点恢复后需要人工干预才能切回,这点需要根据业务特点权衡。