Keepalived 是一个基于 VRRP(Virtual Router Redundancy Protocol)协议 实现的高可用性解决方案,主要用于构建无单点故障的服务集群。其核心目标是确保服务的持续可用性,当主节点故障时自动切换到备用节点,对外提供透明的故障转移。
一、核心原理
VRRP 协议基础:
- 多个节点(至少1主1备)组成一个虚拟路由器组,共享一个虚拟IP(VIP)。
- 主节点(Master)持有VIP并对外提供服务,备用节点(Backup)处于待命状态。
- 节点间通过组播心跳报文(默认组播地址
224.0.0.18)通信。
选举与优先级:
- 节点通过优先级(
priority,范围1-254)竞选Master角色,优先级高者胜出。 - 若主节点停止发送心跳(默认间隔1秒),备用节点检测到超时(默认3秒)后触发选举,新Master接管VIP。
- 节点通过优先级(
健康检查(Health Checking):
- 关键特性:Keepalived 可自定义脚本监控服务状态(如Nginx/MySQL进程)。
- 若主节点的服务异常,Keepalived 主动降低自身优先级,触发主备切换(无需等待心跳超时)。
二、核心应用场景
1. 负载均衡器高可用(最常见)
- 场景:为 Nginx、HAProxy 等负载均衡器提供故障转移。
- 架构:
- 主备节点均部署负载均衡器 + Keepalived。
- VIP 指向活跃节点,客户端始终访问VIP。
- 效果:主节点故障时,VIP秒级切换至备用节点,服务无感知。
2. 数据库主从高可用
- 场景:MySQL、Redis 主从架构的VIP漂移。
- 流程:
- Keepalived 监控主库状态。
- 主库故障时,VIP切换到从库(需配合脚本提升从库为主)。
3. LVS(Linux Virtual Server)集成
- Keepalived 原生支持LVS,可管理LVS的负载均衡规则及节点健康检查,构建高可用四层负载均衡集群。
4. 轻量级服务故障转移
- 适用于任何需VIP的高可用服务,如:
- FTP服务器
- Web应用服务器
- 自定义TCP/UDP服务
三、典型架构示例(Nginx高可用)
# 拓扑结构:
# VIP: 192.168.1.100
# Master: 192.168.1.10 (priority=100)
# Backup: 192.168.1.20 (priority=90)
# Keepalived 主节点配置片段 (keepalived.conf)
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51 # 集群ID,主备必须一致
priority 100 # 优先级
advert_int 1 # 心跳间隔(秒)
authentication {
auth_type PASS
auth_pass 1111 # 节点间认证密码
}
virtual_ipaddress {
192.168.1.100/24 # 虚拟IP
}
track_script {
chk_nginx # 关联Nginx健康检查脚本
}
}
# 定义Nginx监控脚本
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2 # 检查间隔
weight -20 # 失败时优先级降低20
}
四、优势与局限
✅ 优势:
- 轻量级,配置简单。
- 毫秒级故障切换(依赖心跳超时时间)。
- 支持自定义健康检查脚本。
⚠️ 局限:
- 脑裂问题(需配置多播或单播防裂)。
- 不适用于跨地域高可用(延迟敏感)。
- 无状态服务友好,有状态服务需额外同步机制(如DRBD)。
五、关键运维命令
# 查看Keepalived状态及VIP归属
ip addr show eth0 | grep "192.168.1.100"
# 手动切换主备(在Master节点执行)
systemctl stop keepalived # 强制触发切换
# 日志排查
tail -f /var/log/messages | grep Keepalived
💡 最佳实践:结合监控系统(如Prometheus)告警+日志分析,避免静默故障。对关键服务建议部署至少3节点(如1主2备),防止单点故障。
如果需要具体配置案例或故障排查技巧,欢迎进一步提问!