1. Keepalived核心功能解析
Keepalived是一款基于VRRP协议实现的高可用性解决方案,主要解决IP地址单点故障问题。它通过虚拟路由冗余协议(VRRP)来动态管理虚拟IP地址(VIP),确保服务在主机故障时能够无缝切换到备用节点。
1.1 VRRP协议工作原理
VRRP协议通过多播地址224.0.0.18进行通信,使用协议号112。主备节点之间通过Advertisement报文交换状态信息,默认每1秒发送一次心跳检测。当备用节点连续3次未收到主节点的心跳时,会触发主备切换。
VRRP报文包含以下关键字段:
- Virtual Router ID:虚拟路由器标识(1-255)
- Priority:优先级(1-254,值越大优先级越高)
- Authentication Type:认证类型
- Advertisement Interval:通告间隔
关键配置建议:生产环境中建议将Advertisement Interval设置为2秒,将Master_Down_Interval设置为6秒(3倍Advertisement Interval),这样可以在网络抖动时避免不必要的切换。
1.2 健康检查机制
Keepalived提供两种健康检查方式:
-
LVS层健康检查:
- 通过真实服务器(Real Server)的IP:Port进行TCP连接测试
- 可配置检查间隔、超时时间和重试次数
bash复制
real_server 192.168.1.100 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } -
自定义脚本检查:
- 通过用户自定义脚本的返回值判断服务状态
- 脚本退出码为0表示健康,非0表示异常
bash复制vrrp_script chk_nginx { script "/usr/local/bin/check_nginx.sh" interval 2 weight -20 }
2. Keepalived部署实践
2.1 典型双机热备配置
主节点配置示例(/etc/keepalived/keepalived.conf):
bash复制global_defs {
router_id LVS_MASTER # 唯一标识
}
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.200/24 # 虚拟IP
}
track_script {
chk_nginx # 关联健康检查脚本
}
}
备用节点只需修改state为BACKUP和降低priority值(如90)。
2.2 脑裂问题预防
脑裂(Split-Brain)是高可用系统中的常见问题,可通过以下方式预防:
-
多播检测:
bash复制vrrp_instance VI_1 { unicast_peer { 192.168.1.101 # 对端IP地址 } } -
第三方仲裁:
- 使用ping检测网关可达性
- 通过脚本检测共享存储状态
bash复制
track_script { chk_gateway } -
优先级动态调整:
bash复制vrrp_script chk_gateway { script "ping -c 2 192.168.1.1" interval 2 weight -50 # 当脚本检测失败时降低优先级 }
3. 高级应用场景
3.1 多VIP负载均衡
单个Keepalived实例可管理多个VIP,实现服务分离:
bash复制vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 52
priority 100
advert_int 1
virtual_ipaddress {
192.168.1.201/24
192.168.1.202/24
}
}
3.2 与LVS集成
Keepalived原生支持LVS(Linux Virtual Server),可配置DR/NAT/TUN模式:
bash复制virtual_server 192.168.1.200 80 {
delay_loop 6
lb_algo rr # 轮询算法
lb_kind DR # 直接路由模式
persistence_timeout 50
real_server 192.168.1.100 80 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}
3.3 容器化部署
在Docker环境中部署Keepalived需要注意:
- 使用
--net=host网络模式 - 挂载
/proc文件系统 - 配置正确的capabilities:
bash复制docker run -d --name keepalived \
--net=host --cap-add=NET_ADMIN \
-v /proc:/proc \
-v /path/to/keepalived.conf:/etc/keepalived/keepalived.conf \
keepalived
4. 故障排查指南
4.1 常见问题分析
-
VIP无法切换:
- 检查防火墙是否放行VRRP协议(IP协议号112)
- 确认网卡配置支持多播
- 使用tcpdump抓包分析VRRP报文:
bash复制
tcpdump -i eth0 vrrp -n
-
健康检查失效:
- 确认检查脚本有执行权限
- 检查脚本返回值是否符合预期
- 查看Keepalived日志:
bash复制
journalctl -u keepalived -f
-
性能问题:
- 减少不必要的健康检查频率
- 对于大量Real Server,考虑使用轻量级检查方式
- 调整内核参数:
bash复制echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
4.2 日志分析技巧
Keepalived日志级别可通过配置文件调整:
bash复制global_defs {
log_file /var/log/keepalived.log
log_local0 # 日志工具
log_local0.info # 日志级别
}
关键日志事件:
- "Entering MASTER STATE":主节点接管VIP
- "VRRP_Instance(x) Received higher prio advert":收到更高优先级通告
- "VRRP_Instance(x) Transition to MASTER STATE":状态切换事件
5. 性能优化建议
-
网络参数调优:
bash复制# 减少ARP响应延迟 echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce # 提高多播包处理能力 echo 1024 > /proc/sys/net/core/netdev_max_backlog -
CPU亲和性设置:
对于高性能场景,可以绑定Keepalived进程到特定CPU核心:bash复制taskset -cp 0,1 `pidof keepalived` -
内存管理:
调整Keepalived内存分配策略:bash复制echo 50 > /proc/sys/vm/overcommit_ratio echo 1 > /proc/sys/vm/overcommit_memory -
监控指标:
关键监控指标包括:- VRRP状态切换次数
- 健康检查成功率
- VIP切换延迟时间
- 资源使用率(CPU/内存/网络)
实际部署中,我们曾遇到因默认ARP缓存时间过长导致VIP切换延迟的问题,通过调整以下参数解决:
bash复制echo 300 > /proc/sys/net/ipv4/neigh/default/gc_stale_time
echo 500 > /proc/sys/net/ipv4/neigh/default/gc_thresh1
