Keepalived 配置深度解析及最佳实践
一、Keepalived 配置要点深度解析
1. 全局定义:基础参数与通知机制
1.1 全局参数配置
global_defs {notification_email {admin@example.com # 故障通知邮件接收者}notification_email_from keepalived@example.com # 发件人邮箱smtp_server 192.168.1.100 # SMTP 服务器地址smtp_connect_timeout 30 # SMTP 连接超时时间(秒)router_id LVS_DEVEL # 节点标识(需在集群内唯一)vrrp_skip_check_adv_addr # 跳过对通告地址的检查(可选)vrrp_garp_interval 0 # 免费 ARP 发送间隔(0 表示按需发送)
}
-
核心作用:
-
配置故障通知渠道(邮件、SNMP 等)。
-
定义节点标识
router_id
,用于日志记录和故障定位。 -
控制 ARP 通告频率,避免网络拥塞。
-
1.2 进程与文件配置
global_defs {pid_file /var/run/keepalived.pid # 进程 PID 文件路径state_file /var/lib/keepalived/keepalived_state # 状态文件路径vrrp_iptables # 自动管理 iptables 规则(推荐启用)
}
-
最佳实践:
-
确保
pid_file
和state_file
路径可写,避免权限问题导致服务启动失败。 -
启用
vrrp_iptables
自动配置防火墙规则,允许 VRRP 通告(UDP 112 端口)和 VIP 流量。
-
2. VRRP 实例配置:多组冗余的核心
2.1 单实例基础配置模板
vrrp_instance VI_1 {state MASTER # 节点初始状态(MASTER/BACKUP)interface eth0 # 绑定的物理网卡virtual_router_id 51 # VRRP 组 ID(0-255,同一组内需一致)priority 100 # 节点优先级(1-254,MASTER 需高于 BACKUP)advert_int 1 # 通告间隔(秒,建议 1-2 秒)authentication {auth_type PASS # 认证类型(PASS/HA)auth_pass 123456 # 认证密码(同一组内需一致)}virtual_ipaddress {192.168.1.254/24 dev eth0 # VIP 地址及子网掩码192.168.1.255/24 dev eth0 secondary # 辅助 VIP(可选)}
}
2.2 高级配置选项
- 抢占模式控制:
vrrp_instance VI_1 {preempt # 启用抢占(默认开启,MASTER 恢复后自动夺回 VIP)preempt_delay 60 # 抢占延迟(秒,等待服务就绪后再切换)
}
- 多网卡绑定:
vrrp_instance VI_1 {interface bond0 # 绑定虚拟网卡(如 Bonding 或 VLAN 接口)virtual_ipaddress {10.0.0.254/24 dev bond0 label bond0:vip # 为 VIP 指定接口标签}
}
- 负载分担模式:通过多个 VRRP 组实现流量分担(如节点同时作为不同组的 MASTER 和 BACKUP):
# 组 1:主组,VIP 192.168.1.254
vrrp_instance VI_1 { ... priority 100 ... }# 组 2:备份组,VIP 192.168.1.253
vrrp_instance VI_2 { ... priority 90 ... }
3. 健康检查脚本:从端口到业务的多层防护
3.1 脚本触发机制
track_script {check_nginx # 脚本名称
}vrrp_instance VI_1 {track_script {check_nginx # 关联脚本}
}
-
脚本要求:
-
返回值
0
表示健康,非0
表示故障(如1
、2
)。 -
脚本需有执行权限:
chmod +x /etc/keepalived/``check_nginx.sh
。
-
3.2 脚本示例:检测 Nginx 进程存活
#!/bin/bash
# /etc/keepalived/check_nginx.sh
nginx_pid=$(pidof nginx)
if [ -z "$nginx_pid" ]; then# 重启 Nginx(可选)systemctl restart nginx# 若重启失败,返回非 0[ -z "$(pidof nginx)" ] && exit 1
fi
exit 0
3.3 脚本参数传递
通过 weight
参数动态调整优先级:
track_script {check_db {script "/etc/keepalived/check_db.sh"interval 2 # 脚本执行间隔(秒)weight -30 # 脚本返回非 0 时,优先级降低 30(可能触发故障转移)}
}
3.4 复杂场景脚本:检测数据库复制延迟
#!/bin/bash
# 检测 MySQL 主从延迟(适用于备份节点)
DELAY=$(mysql -uroot -pPass -e "SHOW SLAVE STATUS;" | awk '/Seconds_Behind_Master/ {print $2}')
if [ "$DELAY" -gt 10 ]; thenecho "Replication delay too large: $DELAY seconds"exit 1
fi
exit 0
4. 日志与监控:故障排查与性能优化
4.1 日志配置
global_defs {log_file /var/log/keepalived.log # 自定义日志文件路径log_level info # 日志级别(debug/info/warning/error)
}
-
日志分析关键点:
-
VRRP_Instance(VI_1) Entering MASTER STATE
:主节点状态变更。 -
VRRP_Instance(VI_1) Received advert with higher priority
:检测到更高优先级节点。 -
TrackScript[check_nginx]: status=0
:健康检查脚本执行结果。
-
4.2 监控指标采集
- 内置指标:
# 查看 VRRP 组状态
keepalived -S info | grep "VRRP Instance"# 查看 VIP 绑定情况
ip addr show dev eth0 | grep "inet 192.168.1.254"
- SNMP 集成:通过
snmpd
服务暴露指标(需安装keepalived-snmp
插件):
# 配置 snmpd.conf
master agentx
agentAddress udp:127.0.0.1:1610
- Prometheus 监控:使用
keepalived_exporter
采集指标,配置示例:
scrape_configs:- job_name: 'keepalived'static_configs:- targets: ['localhost:9101'] # exporter 端口
5. 配置文件示例:完整高可用集群
# 全局定义
global_defs {router_id MASTER_NODEnotification_email { ops@example.com }smtp_server 10.0.0.2
}# VRRP 实例配置
vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 50priority 100advert_int 1authentication {auth_type PASSauth_pass secure_password}virtual_ipaddress {192.168.1.254/24 dev eth0}track_script {check_application # 自定义健康检查脚本}
}# 健康检查脚本
track_script {check_application {script "/etc/keepalived/check_app.sh"interval 3weight -20}
}
二、配置最佳实践与陷阱规避
1. 安全配置要点
-
认证机制:
-
避免使用默认认证密码(如
123456
),建议使用随机字符串。 -
生产环境优先使用
HA
认证(基于 MD5 哈希):
-
authentication {auth_type HAauth_key $(openssl rand -hex 16) # 生成 16 字节随机密钥
}
- 防火墙规则:
# 允许 VRRP 通告(UDP 112 端口)
iptables -A INPUT -p udp -m udp --dport 112 -j ACCEPT
# 允许 VIP 流量
iptables -A INPUT -d 192.168.1.254 -j ACCEPT
2. 多实例冲突解决
-
VRID 唯一性:不同 VRRP 组的
virtual_router_id
需唯一,避免广播风暴。 -
网卡资源竞争:多个实例绑定同一网卡时,需确保 VIP 网段不重叠。
3. 动态优先级调整场景
- 链路故障降级:
vrrp_instance VI_1 {track_interface {eth0 weight -30 # 若 eth0 故障,优先级降为 70(假设原优先级 100)}
}
- 业务负载感知:通过脚本根据 CPU / 内存使用率动态调整优先级,避免高负载节点成为 MASTER。
三、总结:配置的核心逻辑
Keepalived 的配置体系以 VRRP 实例为中心,通过全局参数定义基础行为,借助健康检查脚本实现智能故障转移,最终通过日志与监控保障可观测性。实际部署中需遵循以下原则:
-
最小化配置:仅定义必要的 VIP 和检查规则,避免冗余配置影响性能。
-
分层验证:先验证单节点配置(如 VIP 绑定、ARP 通告),再测试集群故障转移流程。
-
自动化测试:使用
stress
等工具模拟节点故障,验证切换时间和数据一致性。
通过合理配置,Keepalived 可在不引入复杂架构的前提下,为业务提供高性价比的高可用解决方案,尤其适合中小规模集群和传统数据中心场景。