Keepalived 与故障转移
Keepalived 原理
Keepalived 使用 VRRP(虚拟路由冗余协议)在多台服务器间共享一个虚拟 IP(VIP)。Master 持有 VIP 处理流量,Master 故障时 Backup 自动接管 VIP。
配置示例
Master: /etc/keepalived/keepalived.conf
vrrp_script chk_nginx {
script "/usr/bin/systemctl is-active nginx"
interval 2
weight -20 # 检查失败时降低优先级 20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass mysecret
}
virtual_ipaddress {
10.0.0.100/24
}
track_script {
chk_nginx
}
# 切换时执行脚本(可选)
notify_master "/opt/scripts/notify.sh MASTER"
notify_backup "/opt/scripts/notify.sh BACKUP"
}
Backup: 仅修改 state 和 priority
vrrp_instance VI_1 {
state BACKUP
priority 90
# 其余配置相同
}
提示
track_script 关键:当 Nginx 挂了但主机还活着时,通过降低优先级触发 VIP 漂移,避免 VIP 指向无服务的机器。
常见故障转移方案
| 方案 | 切换速度 | 适用场景 |
|---|---|---|
| Keepalived VIP | 秒级 | 同 VLAN 内 |
| DNS 切换 | 分钟级(受 TTL 影响) | 跨机房 |
| 云 LB 健康检查 | 秒级 | 云环境 |
| K8s Service | 秒级 | 容器化 |
常见面试问题
Q1: Keepalived 脑裂怎么处理?
答案:
脑裂:Master 和 Backup 都认为自己是 Master,同时持有 VIP。
- 原因:网络分区导致 VRRP 心跳丢失
- 预防:
- 使用多条心跳线路(双网卡)
unicast_peer单播替代组播(更可靠)- 仲裁机制:通过第三方(如 ping 网关)判断网络是否正常,异常时自降 priority
- 检测:监控 VIP 归属,两台同时有 VIP 时告警