在构建高可用网络时,网关冗余是避免单点故障的核心手段。
VRRP(虚拟路由冗余协议)提供了标准化的网关选举与故障切换机制,而Keepalived则是这一协议在Linux系统下最成熟、功能最丰富的开源实现。
一、VRRP协议原理
VRRP将多台物理路由器组合成一个虚拟路由器,对外呈现一个固定的虚拟IP和虚拟MAC,内网主机只需将网关指向该虚拟IP。当Master设备故障时,Backup自动接替,整个过程对终端透明。
1.1 核心概念与角色
| |
|---|
| 虚拟路由器 | 由一个Master和多个Backup组成,对外表现为一台逻辑路由器。 |
| VRID | |
| 虚拟IP | 终端网关地址,可与某台物理接口IP相同(该设备即IP拥有者)。 |
| 虚拟MAC | 00-00-5E-00-01-{VRID}(IPv4)或00-00-5E-00-02-{VRID}(IPv6)。 |
| Master | |
| Backup | |
| 优先级 | 0~255,默认100,用于选举Master。IP拥有者固定为255。 |
| 抢占模式 | 默认开启,高优先级Backup可抢占Master;可配置延迟防止震荡。 |
| 通告间隔 | Master发送VRRP通告的时间间隔,默认1秒。 |
1.2 Master选举与状态切换
- 选举规则: 比较优先级,数值高者胜出;优先级相同时,接口IP较大者成为Master。
- 故障检测: Backup在
Master_Down_Interval内未收到通告即认为Master失效。计算公式:3 × Advertisement_Interval + Skew_time,其中Skew_time = (256 - Priority) / 256,用于错峰选举。 - 状态机:
- Initialize → Master(IP拥有者优先级255 或 选举获胜)
- Initialize → Backup(收到更高优先级报文或非IP拥有者)
- Backup → Master(Master超时 或 被高优先级抢占)
- Master → Backup(收到更高优先级报文且允许抢占)
1.3 VRRP报文
VRRP仅定义一种报文类型:ADVERTISEMENT(通告)。
- 封装在IP协议号112,TTL=255,目的组播地址
224.0.0.18(IPv6为ff02::12)。 - 关键字段:VRID、Priority、Adver Interval、虚拟IP列表等。
- 认证:早期版本支持简单认证,但现代标准(RFC 5798)已废弃,安全应由IPsec等上层机制保障。
1.4 关键机制
| |
|---|
| 抢占延迟 | 高优先级设备加入后等待preempt_delay再切换,避免链路抖动导致频繁倒换。 |
| IP拥有者 | 虚拟IP等于物理接口IP的路由器,优先级恒为255,不会被抢占。 |
| 接口跟踪 | 监视上行链路状态,链路故障时自动降低优先级,触发主备切换。 |
| 负载分担 | 创建多个VRID,不同虚拟组互为主备,使多台设备同时转发不同子网流量。 |
| IPv6支持 | VRRPv3使用虚拟链路本地地址,虚拟MAC以00-00-5E-00-02开头。 |
1.5 典型工作流程
- R1(优先级120)为Master,R2(优先级100)为Backup,虚拟IP为10.0.0.254。
- R1上行接口故障,track功能将其优先级降至80。
- R2在超时后抢占为Master,立即发送免费ARP通知交换机更新MAC表。
- 流量无感切换。R1恢复后,因开启抢占(且优先级恢复为120),重新成为Master。
二、Keepalived:VRRP的Linux增强实现
Linux环境下的主流实现——Keepalived。它不仅完整实现了VRRP状态机和IP漂移,还引入了一套独立的健康检查框架,使故障切换不再仅依赖VRRP心跳,而是可以基于服务真实状态进行决策。
2.1 超越标准VRRP
Keepalived由主进程和两个核心子进程组成:
- VRRP子进程: 负责协议交互、状态维护、VIP添加/移除。
- Healthcheck子进程: 执行多层健康检查,根据结果动态调整VRRP优先级。
这种设计使Keepalived的故障检测能力远强于标准VRRP,支持:
- L3检查: ICMP Ping
- L4检查: TCP端口连接
- L7检查: 自定义脚本,根据退出码判断服务状态
此外,Keepalived还内置了与LVS的集成,可直接配置四层负载均衡。
2.2 核心功能模块
配置文件 /etc/keepalived/keepalived.conf 围绕以下模块组织:
| |
|---|
vrrp_instance | 定义VRRP实例,设置角色、优先级、心跳、虚拟IP等。 |
vrrp_sync_group | |
vrrp_script | 定义健康检查脚本,设定检测间隔、失败阈值和权重调整。 |
virtual_server | |
2.3 配置文件详解
以下为一个典型的Nginx双机热备配置,展示各模块的组合用法。
主节点(Master)配置:
global_defs { router_id SRV_MASTER}# 定义健康检查脚本vrrp_script chk_nginx { script "/etc/keepalived/check_nginx.sh" interval 2 # 每2秒检查 weight -20 # 失败后优先级降低20 fall 3 # 连续失败3次视为异常 rise 2 # 连续成功2次视为恢复}vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 # 生产环境建议开启nopreempt,避免频繁震荡 nopreempt authentication { auth_type PASS auth_pass YourPasswd123 } virtual_ipaddress { 192.168.1.100/24 dev eth0 } track_script { chk_nginx # 关联健康检查脚本 } notify_master "/usr/local/bin/keepalived_notify.sh master" notify_backup "/usr/local/bin/keepalived_notify.sh backup"}
备节点(Backup)配置差异:
global_defs { router_id SRV_BACKUP}vrrp_script chk_nginx { # 与主节点完全一致}vrrp_instance VI_1 { state BACKUP priority 90 # 必须低于Master # 其余参数与主节点相同}
VRRP同步组配置示例(多子网场景):
vrrp_sync_group VG_1 { group { VI_1 # 内网VIP实例 VI_2 # 外网VIP实例 } notify_master "/path/to/notify.sh"}
2.4 高可用模式选择
- 主备模式(Active/Passive): VIP仅存在于Master,Backup闲置。配置简单,适合对资源利用率要求不高的场景。
- 双主/负载分担模式(Active/Active): 创建两个VRRP实例,服务器A为实例1的Master、实例2的Backup;服务器B相反。流量可同时由两台设备处理,但需逻辑隔离。
- 单播通信: 公有云等环境可能禁止多播,Keepalived支持将通告报文通过单播发送至对端,只需在实例中添加
unicast_peer即可。
2.5 运维关键事项
- VIP切换原理: 新Master发送免费ARP,通告本地交换机更新转发表,实现流量瞬间牵引。
- 日志与监控: 默认日志位于
/var/log/messages,所有角色切换、脚本执行失败等事件均可通过日志追溯。 - 配置测试: 修改配置后务必执行
keepalived -t -f /etc/keepalived/keepalived.conf进行语法校验。 - 脚本编写: 健康检查脚本需要有可执行权限,退出码0代表成功,非0代表失败。脚本内容应尽量简单,避免长时间阻塞。
三、协议对比:VRRP vs. HSRP
| | |
|---|
| | |
| | |
| | |
| | |
| 标准VRRP仅接口跟踪;Keepalived支持L3~L7脚本 | |
| | |
结语
VRRP为网关冗余提供了标准化、轻量级的基石,而Keepalived则通过健康检查、同步组、通知脚本等扩展,使其真正成为生产环境中高可用架构的利器。无论是最简单的两台Nginx反向代理,还是复杂的多子网LVS集群,理解其协议原理与配置精髓,都能帮助工程师构建出更稳定、更智能的容错系统。