1. 项目概述:IPVS与VRRP Script的高可用架构设计
在分布式系统架构中,服务的高可用性始终是核心诉求。IPVS(IP Virtual Server)作为Linux内核级的负载均衡解决方案,配合Keepalived的VRRP协议,能够构建出企业级的高可用负载均衡集群。但传统方案存在健康检测机制单一、故障切换不够灵活等问题,这正是VRRP Script的用武之地。
我曾在金融支付系统的架构升级中,采用IPVS+Keepalived+VRRP Script的方案替代了昂贵的硬件负载均衡设备。这套组合不仅实现了4个9的可用性指标,还将故障切换时间控制在秒级以内。关键在于VRRP Script的引入,它打破了Keepalived原生只能做端口检测的限制,允许我们通过自定义脚本实现应用层健康检查、资源监控等复杂逻辑。
2. 核心组件解析
2.1 IPVS的工作原理
IPVS工作在网络传输层(L4),通过内核空间的Netfilter框架实现高效流量分发。其核心优势体现在:
- 连接哈希表:维护在内存中的哈希表记录连接状态,处理百万级并发时仍保持微秒级响应
- 调度算法多样化:支持轮询(rr)、加权轮询(wrr)、最少连接(lc)等10余种算法
- DNAT转发模式:真实服务器无需配置网关,简化网络拓扑
实际部署时需要注意:
# 查看当前IPVS规则(调试用) ipvsadm -Ln # 典型配置示例(DR模式) ipvsadm -A -t 192.168.1.100:80 -s wrr ipvsadm -a -t 192.168.1.100:80 -r 192.168.2.1:80 -g -w 3 ipvsadm -a -t 192.168.1.100:80 -r 192.168.2.2:80 -g -w 12.2 Keepalived的VRRP机制
VRRP(Virtual Router Redundancy Protocol)通过多播协议选举Master节点,其核心参数包括:
- priority:取值范围1-254,决定节点选举优先级
- advert_int:心跳间隔,通常设为1秒
- authentication:建议使用AH协议防止ARP欺骗
典型配置示例:
vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type AH auth_pass secret123 } virtual_ipaddress { 192.168.1.100/24 dev eth0 label eth0:0 } }2.3 VRRP Script的扩展能力
这是方案中最具创新性的部分,通过vrrp_script指令可以定义自定义检测逻辑。其工作流程:
- 脚本按设定间隔执行(interval参数)
- 返回0表示成功,非0表示失败
- 失败次数超过fall阈值触发节点降级
实际案例:我们曾用Python脚本实现以下检测:
- 应用API的HTTP 200验证
- MySQL主从复制状态检查
- 磁盘空间监控(超过90%预警)
3. 完整实施方案
3.1 基础环境准备
硬件建议配置:
- 至少2台x86服务器(物理机或VM)
- 双网卡(管理流量与业务流量分离)
- 相同硬件配置避免性能瓶颈
软件依赖:
# CentOS/RHEL yum install -y ipvsadm keepalived # Ubuntu/Debian apt-get install ipvsadm keepalived网络拓扑建议:
+-------------+ | Client | +------+------+ | +-------------+-------------+ | Virtual IP | | 192.168.1.100 | +-------------+-------------+ | +-------------+-------------+ | Load Balancer Master | (Priority 100) | Keepalived + IPVS | +-------------+-------------+ | +-------------+-------------+ | Load Balancer Backup | (Priority 90) | Keepalived + IPVS | +-------------+-------------+3.2 Keepalived深度配置
完整配置示例(/etc/keepalived/keepalived.conf):
global_defs { router_id LVS_DEVEL } vrrp_script chk_nginx { script "/usr/bin/curl -s http://localhost/health" interval 2 fall 2 rise 3 timeout 2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 track_script { chk_nginx } authentication { auth_type AH auth_pass secret123 } virtual_ipaddress { 192.168.1.100/24 dev eth0 label eth0:0 } } virtual_server 192.168.1.100 80 { delay_loop 6 lb_algo wrr lb_kind DR protocol TCP real_server 192.168.2.1 80 { weight 3 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.2.2 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }3.3 高级脚本开发技巧
实战中积累的脚本编写经验:
健康检查脚本示例(/usr/local/bin/check_service.sh):
#!/bin/bash # 检查Nginx状态 if ! systemctl is-active --quiet nginx; then exit 1 fi # 检查HTTP端口 if ! nc -z localhost 80; then exit 1 fi # 检查API端点 HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost/api/health) if [ "$HTTP_CODE" != "200" ]; then exit 1 fi # 检查磁盘空间 DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | cut -d'%' -f1) if [ "$DISK_USAGE" -gt 90 ]; then exit 1 fi exit 0日志增强技巧:
# 在脚本中添加日志记录 LOGFILE="/var/log/keepalived_checks.log" echo "$(date) - Running health check" >> $LOGFILE # 记录详细错误信息 if ! systemctl is-active --quiet nginx; then echo "$(date) - Nginx is not running" >> $LOGFILE journalctl -u nginx -n 20 >> $LOGFILE exit 1 fi4. 故障排查与优化
4.1 常见问题速查表
| 故障现象 | 可能原因 | 排查命令 |
|---|---|---|
| VIP不切换 | 防火墙阻断VRRP | tcpdump -i eth0 vrrp |
| 负载不均衡 | IPVS规则未生效 | ipvsadm -Ln |
| 脚本不执行 | 权限问题 | ls -l /path/to/script |
| 脑裂问题 | 网络分区 | ping backup_node |
4.2 性能优化参数
内核参数调整(/etc/sysctl.conf):
# 提高ARP相关参数 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.default.arp_ignore = 1 net.ipv4.conf.default.arp_announce = 2 # 提高连接跟踪表大小 net.ipv4.vs.conn_tab_bits = 20Keepalived调优:
vrrp_instance { # 减少广告间隔(需网络稳定) advert_int 0.5 # 启用快速故障检测 track_script { chk_service { weight -20 } } }4.3 监控集成方案
建议监控指标:
- VRRP状态(通过keepalived.stats接口)
- IPVS连接数(ipvsadm -ln --stats)
- 脚本执行成功率(解析日志)
Prometheus监控示例:
- job_name: 'keepalived' static_configs: - targets: ['localhost:9650'] metrics_path: '/metrics'5. 生产环境实战经验
在电商大促期间,我们通过以下配置实现零故障:
多级检测机制:
- 基础进程检测(systemd)
- 端口检测(nc)
- 业务API检测(curl)
- 资源监控(df, free)
优雅切换策略:
# 在vrrp_script中添加预处理 pre_stop() { # 先将节点从IPVS摘除 ipvsadm -d -t $VIP:$PORT -r $LOCAL_IP sleep 2 # 等待现有连接完成 }- 日志分析技巧:
# 实时监控切换事件 tail -f /var/log/messages | grep -E "VRRP|IPVS" # 统计切换历史 grep "Transition to MASTER" /var/log/messages | wc -l这套方案在多个金融级场景中验证,最关键的收获是:VRRP Script的灵活性让高可用方案真正实现了从"网络可达性"到"服务可用性"的质变。比如我们曾通过脚本检测到Redis内存溢出前兆,提前触发切换避免了缓存雪崩。