1. 什么是Keepalived?
第一次接触Keepalived时,我误以为它只是个简单的心跳检测工具。直到有次线上服务突然中断,才发现这个看似简单的工具背后隐藏着强大的高可用保障能力。Keepalived本质上是一个用C语言编写的路由软件,主要用于Linux平台实现IP故障转移和负载均衡。
提示:虽然Keepalived常与LVS(Linux Virtual Server)搭配使用,但它本身是一个独立运行的服务,不需要依赖LVS也能实现IP漂移等核心功能。
它的核心价值在于:
- 通过VRRP协议实现IP地址自动漂移
- 提供健康检查机制监控服务状态
- 支持主备和主主两种工作模式
- 轻量级且配置简单
在实际生产环境中,我们主要用Keepalived解决以下问题:
- 当主服务器宕机时,备用服务器能在秒级接管服务IP
- 对关键服务(如Nginx、MySQL)进行健康监测
- 避免单点故障导致服务不可用
2. Keepalived核心工作原理
2.1 VRRP协议解析
Keepalived的核心是VRRP(Virtual Router Redundancy Protocol)协议。这个协议的工作原理类似于"值班小组":
- 每个VRRP组有一个虚拟IP(VIP)
- 组内设备分为Master和Backup角色
- Master定期发送心跳(默认1秒)
- Backup监听心跳,超时未收到则发起选举
选举过程特别有意思:
- 每个节点有优先级(priority,默认100)
- 当Master失联,Backup会等待skew time((256-priority)/256秒)
- 优先级高的节点会先发出宣告报文
- 避免多个Backup同时抢占导致的"脑裂"
2.2 健康检查机制
Keepalived的健康检查分为两层:
基础层:通过定期执行脚本检查服务状态
bash复制vrrp_script chk_nginx {
script "/usr/bin/killall -0 nginx" # 检查nginx进程是否存在
interval 2 # 每2秒检查一次
weight -20 # 检查失败时优先级降低20
}
应用层:支持TCP_CHECK/HTTP_GET等高级检查
conf复制real_server 192.168.1.100 80 {
TCP_CHECK {
connect_timeout 10
connect_port 80
}
}
3. 实验环境搭建
3.1 基础环境准备
我建议使用两台CentOS 7虚拟机进行实验:
| 主机 | IP地址 | 角色 |
|---|---|---|
| keepalived1 | 192.168.1.10 | Master |
| keepalived2 | 192.168.1.11 | Backup |
安装步骤:
bash复制# 两台机器都执行
yum install -y keepalived
systemctl enable keepalived
3.2 配置文件详解
主节点配置(/etc/keepalived/keepalived.conf):
conf复制global_defs {
router_id LVS_DEVEL # 唯一标识
}
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 # 密码,主备需一致
}
virtual_ipaddress {
192.168.1.100/24 # 虚拟IP
}
}
备节点只需修改:
conf复制state BACKUP
priority 90
4. 实战演示与故障模拟
4.1 服务启动与验证
启动服务:
bash复制systemctl start keepalived
验证VIP绑定:
bash复制ip addr show eth0
# 主节点应显示:
# inet 192.168.1.100/24 scope global secondary eth0
4.2 故障转移测试
- 在主节点执行:
bash复制systemctl stop keepalived
- 观察备节点日志:
bash复制journalctl -u keepalived -f
# 应看到类似记录:
# VRRP_Instance(VI_1) Transition to MASTER STATE
- 检查备节点的IP地址:
bash复制ip addr show eth0
# 现在VIP应该漂移到了备节点
4.3 脑裂问题预防
在实际环境中,我遇到过因网络分区导致的脑裂问题。解决方案是:
- 添加多播检测:
conf复制global_defs {
...
vrrp_strict # 强制多播检查
}
- 使用单播模式(跨网段时):
conf复制vrrp_instance VI_1 {
...
unicast_src_ip 192.168.1.10 # 本机IP
unicast_peer {
192.168.1.11 # 对端IP
}
}
5. 高级配置技巧
5.1 非抢占模式
默认是抢占模式(Master恢复后自动抢回VIP)。有时我们需要非抢占模式:
conf复制vrrp_instance VI_1 {
...
nopreempt # 启用非抢占
preempt_delay 300 # 抢占延迟(秒)
}
5.2 多实例负载均衡
通过配置多个VRRP实例实现主主模式:
conf复制# 主机配置
vrrp_instance VI_1 {
state MASTER
virtual_ipaddress {
192.168.1.100/24
}
}
vrrp_instance VI_2 {
state BACKUP
virtual_ipaddress {
192.168.1.101/24
}
}
5.3 邮件告警配置
当状态变化时发送邮件通知:
conf复制global_defs {
...
notification_email {
admin@example.com
}
notification_email_from keepalived@example.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
}
vrrp_instance VI_1 {
...
notify_master "/path/to/notify.sh master"
notify_backup "/path/to/notify.sh backup"
notify_fault "/path/to/notify.sh fault"
}
6. 生产环境注意事项
经过多次线上部署,我总结了这些经验:
-
心跳间隔选择:
- 局域网:1秒
- 跨机房:3-5秒(需考虑网络延迟)
-
优先级设置技巧:
- Master通常设为100
- Backup建议90-95
- 权重调整范围±20
-
监控建议:
bash复制# 监控Keepalived进程 pgrep keepalived || systemctl restart keepalived # 监控VIP状态 ip addr show eth0 | grep -q "192.168.1.100" || echo "VIP丢失!" -
常见故障排查:
- 检查防火墙是否放行VRRP协议(IP协议号112)
- 确认虚拟路由ID在同一个子网内唯一
- 使用tcpdump抓包分析:
bash复制
tcpdump -i eth0 vrrp -n
-
性能优化:
conf复制vrrp_instance VI_1 { ... garp_master_delay 10 # Master切换后延迟发送GARP garp_master_refresh 60 # 定期刷新GARP }
在最近的一次金融系统升级中,我们通过Keepalived实现了支付网关的高可用部署。当主节点因硬件故障宕机时,备用节点在1.3秒内完成了切换,整个过程中未丢失任何交易请求。这让我深刻体会到,看似简单的工具,当深入理解其原理并合理配置后,能在关键时刻发挥巨大价值
