4、主备模式(Active-Backup)原理:链路监控与故障切换机制
主备模式(Active-Backup,简称 AB)是 Bonding 技术中最基础、最可靠的冗余模式。其核心思想是:同一时间只有一张物理网卡(Active)承担数据收发任务,其余网卡(Backup)处于待命状态。当 Active 链路发生故障时,系统立即将流量切换到 Backup 网卡,从而实现链路级的高可用。
4.1 主备模式的工作模型
在 Active-Backup 模式下,Bonding 驱动对外呈现一个虚拟的网络接口(bond0),内部绑定多张物理网卡。驱动通过特定的监控机制判断链路状态,并决定由哪张网卡作为 Active 成员。
关键特征:
- MAC 地址一致性:所有成员网卡共享同一个 MAC 地址(通常取自第一个 Active 网卡),避免交换机 MAC 表抖动。
- 无负载均衡:所有流量仅通过 Active 网卡收发,Backup 网卡不参与数据转发。
- 切换粒度:切换以物理网卡为单位,切换时间取决于链路监控机制和驱动响应速度。
4.2 链路监控机制
Bonding 驱动提供了两种链路监控方式,用于检测 Active 网卡的链路状态是否正常。监控机制的选择直接影响故障检测的时效性和切换延迟。
| 监控方式 | 原理 | 检测粒度 | 适用场景 |
|---|---|---|---|
| MII 监控 | 轮询读取物理网卡的 MII(Media Independent Interface)状态寄存器,获取 Link Up/Down 信号 | 毫秒级(通常 100ms 轮询间隔) | 直连物理链路故障检测,如网线断开、交换机端口 down |
| ARP 监控 | 通过发送 ARP 请求并等待响应,验证链路层以上的可达性 | 秒级(通常 1s 轮询间隔) | 需要检测三层连通性的场景,如交换机故障、上游路由不可达 |
性能建议:在 DPDK 主备切换测试中,推荐使用 MII 监控。因为 MII 监控直接读取硬件寄存器,不经过网络协议栈,延迟更低、开销更小。ARP 监控虽然能检测更上层的故障,但会引入额外的网络流量和更长的检测延迟。
4.3 故障切换流程
当 Bonding 驱动检测到 Active 网卡链路故障时,会触发完整的切换流程。理解这一流程对于分析切换延迟至关重要。
4.4 切换延迟的组成
主备切换延迟并非单一数值,而是由多个阶段累积而成。在 DPDK 环境下,由于绕过内核协议栈,切换延迟的组成略有不同。
| 延迟阶段 | 描述 | 典型耗时(MII) | DPDK 环境差异 |
|---|---|---|---|
| 检测延迟 | 从链路故障发生到驱动确认链路 Down 的时间 | 100ms(轮询间隔) | DPDK 轮询模式可能更快检测到链路状态变化 |
| 决策延迟 | 驱动从 Backup 列表中选择新 Active 网卡的时间 | < 1ms | 基本一致,取决于 Backup 网卡数量 |
| 切换执行延迟 | 更新 MAC 地址映射、重置网卡队列、刷新 ARP 表的时间 | 10ms ~ 50ms | DPDK 需额外处理 rte_eth_dev 的重新绑定 |
| 流量恢复延迟 | 从切换完成到第一个数据包成功收发的时间 | 0ms ~ 10ms | DPDK 应用需重新配置 RX/TX 队列 |
重要提示:在 DPDK 环境中,Bonding 驱动(rte_eth_bond)的切换逻辑与内核 Bonding 不同。DPDK 的 Bonding PMD 使用用户态轮询线程监控链路状态,不依赖内核中断。这意味着 DPDK 的检测延迟可能更短,但切换执行阶段需要应用层配合重新配置端口,否则可能导致数据包丢失。
4.5 主备模式的优缺点对比
| 维度 | 优点 | 缺点 |
|---|---|---|
| 可靠性 | 切换逻辑简单,不易出现脑裂或环路 | 单网卡承载所有流量,存在带宽瓶颈 |
| 兼容性 | 对交换机无特殊要求,无需配置 LACP | 不支持负载均衡,带宽利用率低 |
| 切换速度 | MII 监控下切换延迟可控,适合高可用场景 | ARP 监控下切换延迟较大,不适合毫秒级故障恢复 |
| DPDK 适配 | DPDK Bonding PMD 原生支持,API 清晰 | 切换时需要应用层配合,增加开发复杂度 |
4.6 内核 Bonding 与 DPDK Bonding 的切换差异
在 DPDK 主备切换延迟测试中,必须区分内核 Bonding 和 DPDK Bonding 的切换行为差异,否则测试结果可能产生误导。
| 对比项 | 内核 Bonding | DPDK Bonding (rte_eth_bond) |
|---|---|---|
| 监控线程 | 内核线程,受调度延迟影响 | 用户态轮询线程,可绑定到特定 CPU 核心 |
| 链路检测 | 通过 MII 寄存器或 ARP 包 | 通过 rte_eth_link_get_nowait() 轮询 |
| 切换触发 | 内核自动完成,对应用透明 | 驱动通知应用,应用需调用 rte_eth_bond_active_slaves_get() 确认 |
| 数据面中断 | 切换期间可能丢包,取决于内核处理速度 | 应用可控制切换时机,减少丢包窗口 |
| 延迟可预测性 | 受系统负载影响较大 | 通过 CPU 隔离和轮询模式,延迟更稳定 |
测试要点:在进行 DPDK 主备切换延迟测试时,建议同时监控以下指标:
- 链路状态变化时间戳(通过 rte_eth_link_get)
- 切换完成时间戳(通过 rte_eth_bond_active_slaves_get 返回值变化)
- 数据面丢包计数(通过 rte_eth_stats 的 imissed 字段)
- 应用层感知到的流量中断时间(通过硬件时间戳或 PTP 同步)