简介
随着网络技术的飞速发展,高带宽、高可靠性的网络需求日益增长。链路聚合(Link Aggregation)作为一种提升网络性能和可靠性的重要技术,得到了广泛应用。本文将深入探讨基于 DPDK Bond 实现链路聚合,重点介绍 LACP 模式的原理和应用。
PortChannel
PortChannel,也称为 Eth-Trunk 或链路聚合组(LAG),是一种将多个物理以太网接口捆绑成一个逻辑接口的技术。它通过增加链路带宽、实现链路冗余和负载均衡,提高了网络的性能和可靠性。
PortChannel 主要包括以下几个方面:
- 带宽聚合: 将多个物理链路的带宽叠加,提供更高的带宽。
- 链路冗余: 当某个成员链路发生故障时,流量可以自动切换到其他正常链路,提高网络的可靠性。
- 负载均衡: 根据一定的算法,将流量均匀地分配到各个成员链路,提高链路利用率。
LACP
LACP(Link Aggregation Control Protocol,链路聚合控制协议)是一种动态链路聚合协议,它允许交换机之间自动协商链路聚合。
LACP 协议通过交换 LACP 数据包,实现以下功能:
- 链路发现: 自动发现可以聚合的链路。
- 参数协商: 协商链路聚合的参数,如系统优先级、端口优先级等。
- 链路选择: 根据协商结果,选择活动链路。
- 链路监控: 监控链路的状态,及时发现故障。
LACP 数据包的格式如下:
- 目的 MAC 地址: 01:80:C2:00:00:02(LACP 多播地址)
- 源 MAC 地址: 本地端口的 MAC 地址
- 以太网类型: 0x8809(Slow 协议类型)
- 协议子类型: 0x01(LACP 协议类型)
- LACPDU(LACP 数据单元-部分主要字段):
- Actor System Priority(发起者系统优先级)
- Actor System ID(发起者系统 ID)
- Actor Port Priority(发起者端口优先级)
- Actor Port Number(发起者端口号)
- Partner System Priority(伙伴系统优先级)
- Partner System ID(伙伴系统 ID)
- Partner Port Priority(伙伴端口优先级)
- Partner Port Number(伙伴端口号)
- 状态字段
LACP 协商过程主要包括以下几个步骤:
- 链路发现: 交换机之间互相交换 LACP 数据包,发现可以聚合的链路。
- 参数协商: 交换机之间协商系统优先级、端口优先级等参数。
- 链路选择: 交换机根据协商结果,选择活动链路。
- 链路监控: 交换机监控链路的状态,及时发现故障。
DPDK 示例
examples/bond/main.c
- 修改模式为BONDING_MODE_8023AD,表示lacp模式
- 需要先初始化物理网口
- 再初始化bond虚拟口
- 可以完全调用api来实现
- 也可以通过启动参数--vdev='net_bonding0'来实现
- 以及--vdev方式下,不支持的选项再通过api来实现
- 注意LACP通过报文在驱动层处理,不会上送到(即rx不能收到LACP报文)
retval = rte_eth_bond_create("net_bonding0", BONDING_MODE_8023AD,0 /*SOCKET_ID_ANY*/);
- 普通模式(不开专有队列),循环调用rte_eth_tx_burst(BOND_PORT, 0, NULL, 0);触发驱动发送LACP通告报文
while (global_flag_stru_p->LcoreMainIsRunning) {
rte_spinlock_unlock(&global_flag_stru_p->lock);
rx_cnt = rte_eth_rx_burst(BOND_PORT, 0, pkts, MAX_PKT_BURST);
is_free = 0;
rte_eth_tx_burst(BOND_PORT, 0, NULL, 0);
- 专有队列模式(开专有队列),不需要上层去循环调用rx/tx来触发驱动lacp报文发送
- 优点:不受上层影响,避免定时通告不准导致波动
- 缺点:需硬件支持,部分网卡可能不支持
int rte_eth_bond_8023ad_dedicated_queues_enable(uint16_t port)
- 运行
交换机
配置
- mode lacp-dynamic 开启lacp模式,也可lacp-static
- lacp timeout fast 更快地检测到链路故障(1s),对应slow为30s
- lacp preempt enable 开启抢占,当一个优先级更高的链路从故障状态恢复到可用状态时,它会抢占当前活动的低优先级链路,成为新的活动链路