链路聚合 - 链路聚合
Linux 绑定提供了一种将多个网络接口(从接口)聚合到单个逻辑绑定接口(bond)的方法。链路聚合对于带宽的线性扩展、负载均衡和故障转移保护非常有用。
Cumulus Linux 支持两种绑定模式
- IEEE 802.3ad 链路聚合模式将一个或多个链路组合成一个链路聚合组 (LAG),以便媒体访问控制 (MAC) 客户端可以将该组视为单个链路。IEEE 802.3ad 链路聚合是默认模式。
- Balance-xor 模式根据哈希协议头信息在活动端口之间平衡出站流量,并接受来自任何活动端口的入站流量。所有从接口都处于活动状态,用于负载均衡和容错。这对于 MLAG 部署非常有用。
Cumulus Linux 使用 LAG 控制协议 (LACP) 的版本 1。
- NVUE 不接受以接口类型 ID 开头的 bond 名称,例如
sw
、eth
、vlan
、lo
、ib
、fnm
或vrrp
。例如,您不能将 bond 命名为login123
、eth2
、sw1
或vlan10
。 - 一个接口不能属于多个 bond。
- 一个 bond 可以有子接口,但子接口不能有 bond。
- 一个 bond 不能绑定 VLAN 子接口。
- 一个 bond 内的所有从端口必须具有相同的速度或双工模式,并且与链路伙伴的从端口匹配。
创建 Bond
要创建 bond,请指定 bond 成员。在下面的示例中,前面板端口接口 swp1 到 swp4 是 bond1 的成员,但 swp5 和 swp6 不是 bond1 的一部分。

cumulus@switch:~$ nv set interface bond1 bond member swp1-4
cumulus@switch:~$ nv config apply
在 NVUE 中,如果您创建的 bond 接口名称以 bond
开头,NVUE 会自动将接口类型设置为 bond
。如果您创建的 bond 接口名称不以 bond
开头,您必须使用 nv set interface <interface-name> type bond
命令将接口类型设置为 bond
。
编辑 /etc/network/interfaces
文件以添加 bond 的节,然后运行 ifreload -a
命令。
cumulus@switch:~$ sudo nano /etc/network/interfaces
...
auto bond1
iface bond1
bond-slaves swp1 swp2 swp3 swp4
...
cumulus@switch:~$ ifreload -a
- 默认情况下,bond 使用 IEEE 802.3ad 链路聚合模式。要在 balance-xor 模式下配置 bond,请参阅下面的可选配置。
- 如果 bond 不会成为桥接的一部分,则必须指定 IP 地址。
- 确保 bond 的名称符合 Linux 接口命名约定,并且在交换机内是唯一的。
- 即使没有 LACP 伙伴,要临时启动 bond,请使用 LACP Bypass。
当您启动网络时,交换机将 bond1 创建为 MASTER,接口 swp1 到 swp4 以 SLAVE 模式启动
cumulus@switch:~$ ip link show
...
3: swp1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond1 state UP mode DEFAULT qlen 500
link/ether 44:38:39:00:03:c1 brd ff:ff:ff:ff:ff:ff
4: swp2: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond1 state UP mode DEFAULT qlen 500
link/ether 44:38:39:00:03:c1 brd ff:ff:ff:ff:ff:ff
5: swp3: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond1 state UP mode DEFAULT qlen 500
link/ether 44:38:39:00:03:c1 brd ff:ff:ff:ff:ff:ff
6: swp4: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond1 state UP mode DEFAULT qlen 500
link/ether 44:38:39:00:03:c1 brd ff:ff:ff:ff:ff:ff
...
55: bond1: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT
link/ether 44:38:39:00:03:c1 brd ff:ff:ff:ff:ff:ff
一个 bond 内的所有从接口都具有与 bond 相同的 MAC 地址。通常,您添加到 bond 的第一个从接口将其 MAC 地址捐赠为 bond MAC 地址。bond MAC 地址是所有离开 bond 的流量的源 MAC 地址,并提供单个目标 MAC 地址以寻址到 bond 的流量。
从 bond 派生其 MAC 地址的 bond 从接口中删除接口会影响流量,因为 bond 接口会闪断以更新 MAC 地址。
可选配置
您可以为 bond 设置以下配置选项。
选项 | 描述 |
---|---|
链路聚合模式 | Cumulus Linux 支持 IEEE 802.3ad 链路聚合模式 (802.3ad) 和 balance-xor 模式。默认模式为 802.3ad。 仅当您无法使用 LACP 时才设置 balance-xor 模式;LACP 可以检测 bond 成员之间不匹配的链路属性,甚至可以检测错误连接。 当您在 MLAG 环境中使用 balance-xor 模式双连接面向主机的 bond 时,您必须在两个 MLAG 交换机上配置具有相同值的 MLAG ID。否则,MLAG 交换机对会将 bond 视为单连接。 |
MII 链路监控频率 | 您希望检查每个从接口的链路状态以查找故障的频率(以毫秒为单位)。 您可以指定介于 0 到 255 之间的值。默认值为 100。 |
miimon 链路状态模式 | miimon 链路状态模式。您可以将模式设置为 netif_carrier_ok()、MII 或 ethtool ioctls。默认设置为 netif_carrier_ok()。 |
LACP bypass | 在 802.3ad 模式下,在 bond 上设置 LACP bypass,使其即使在没有 LACP 伙伴的情况下也能激活并转发流量。您可以指定 on 或 off。默认设置为 off。请参阅 LACP Bypass。 |
传输速率 | 链路伙伴传输 LACP 控制报文的速率。您可以指定 slow 或 fast。默认设置为 fast。 |
最少链路数 | 在 bond 进入服务之前必须处于活动状态的最少链路数。您可以设置介于 0 到 255 之间的值。默认值为 1,表示 bond 必须至少有一个活动成员。 如果您需要更高级别的服务来确保在激活 bond 之前达到最小聚合带宽级别,请使用大于 1 的值。 如果活动成员的数量降至低于此设置,则 bond 对上层协议显示为链路断开 (link-down)。当活动链路的数量恢复到大于或等于此值时,bond 变为链路连接 (link-up)。 |
Cumulus Linux 默认情况下将 bond 配置选项设置为建议值;更改设置时请谨慎。
要将 bond1 上的链路聚合模式设置为 balance-xor 模式
cumulus@switch:~$ nv set interface bond1 bond mode static
cumulus@switch:~$ nv config apply
要将 bond1 的链路聚合模式重置为默认值 802.3ad,请运行 nv set interface bond1 bond mode lacp
命令。
编辑 /etc/network/interfaces
文件,并将 balance-xor
参数添加到 bond 节,然后运行 ifreload -a
命令
cumulus@switch:~$ sudo nano /etc/network/interfaces
...
auto bond1
iface bond1
bond-mode balance-xor
bond-slaves swp1 swp2 swp3 swp4
...
cumulus@switch:~$ ifreload -a
要将 bond1 的 bond 模式重置为默认值 802.3ad,请使用 bond-mode 802.3ad
参数
cumulus@switch:~$ sudo nano /etc/network/interfaces
...
auto bond1
iface bond1
bond-mode 802.3ad
bond-slaves swp1 swp2 swp3 swp4
...
要启用 LACP bypass
cumulus@switch:~$ nv set interface bond1 bond lacp-bypass on
cumulus@switch:~$ nv config apply
编辑 /etc/network/interfaces
文件,并将 bond-lacp-bypass-allow
参数添加到 bond 节,然后运行 ifreload -a
命令
cumulus@switch:~$ sudo nano /etc/network/interfaces
...
auto bond1
iface bond1
bond-lacp-bypass-allow
bond-slaves swp1 swp2 swp3 swp4
...
cumulus@switch:~$ ifreload -a
要将 miimon 链路状态模式设置为 MII 或 ethtool ioctls
编辑 /etc/network/interfaces
文件,并将 bond-use-carrier no
参数添加到 bond 节,然后运行 ifreload -a
命令
cumulus@switch:~$ sudo nano /etc/network/interfaces
...
auto bond1
iface bond1
bond-use-carrier no
bond-slaves swp1 swp2 swp3 swp4
...
cumulus@switch:~$ ifreload -a
要将 miimon 链路状态模式重置为默认值 netif_carrier_ok(),请使用 bond-use-carrier yes
参数。
要将链路伙伴传输 LACP 控制报文的速率设置为 slow
cumulus@switch:~$ nv set interface bond1 bond lacp-rate slow
cumulus@switch:~$ nv config apply
要将速率重置为默认值 fast,请运行 nv set interface bond1 bond lacp-rate fast
命令。
编辑 /etc/network/interfaces
文件,并将 bond-lacp-rate slow
参数添加到 bond 节,然后运行 ifreload -a
命令
cumulus@switch:~$ sudo nano /etc/network/interfaces
...
auto bond1
iface bond1
bond-lacp-rate slow
bond-slaves swp1 swp2 swp3 swp4
...
cumulus@switch:~$ ifreload -a
要将速率重置为默认值 (fast),请使用 bond-lacp-rate fast
参数
要将 bond 进入服务之前必须处于活动状态的最少链路数设置为 50
编辑 /etc/network/interfaces
文件,并将 bond-min-links 50
参数添加到 bond 节,然后运行 ifreload -a
命令
cumulus@switch:~$ sudo nano /etc/network/interfaces
...
auto bond1
iface bond1
bond-min-links 50
bond-slaves swp1 swp2 swp3 swp4
...
cumulus@switch:~$ ifreload -a
自定义哈希
交换机基于数据包哈希计算,通过 bond 将出站流量分配给从接口,从而在从接口上提供负载均衡;交换机将对话流分配到所有可用的从接口,以平衡总流量。单个对话流的流量始终哈希到同一个从接口。在故障转移事件中,交换机调整哈希计算以将流量引导到可用的从接口。
哈希计算使用数据包头数据来选择将数据包传输到哪个从接口
- 对于 IP 流量,交换机在计算中使用 IP 报头源和目标字段。
- 对于 IP 和 TCP 或 UDP 流量,交换机在哈希计算中包含源端口和目标端口。
为了在作为同一 bond 成员的多个接口之间进行负载均衡,您可以在以下字段上进行哈希
字段 | 默认设置 | NVUE 命令 | traffic.conf |
---|---|---|---|
IP 协议 | 开启 | nv set system forwarding lag-hash ip-protocol on nv set system forwarding lag-hash ip-protocol off | lag_hash_config.ip_prot |
源 MAC 地址 | 开启 | nv set system forwarding lag-hash source-mac on nv set system forwarding lag-hash source-mac off | lag_hash_config.smac |
目标 MAC 地址 | 开启 | nv set system forwarding lag-hash destination-mac on nv set system forwarding lag-hash destination-mac off | lag_hash_config.dmac |
源 IP 地址 | 开启 | nv set system forwarding lag-hash source-ip on nv set system forwarding lag-hash source-ip off | lag_hash_config.sip |
目标 IP 地址 | 开启 | nv set system forwarding lag-hash destination-ip on nv set system forwarding lag-hash destination-ip off | lag_hash_config.dip |
源端口 | 开启 | nv set system forwarding lag-hash source-port on nv set system forwarding lag-hash source-port off | lag_hash_config.sport |
目标端口 | 开启 | nv set system forwarding lag-hash destination-port on nv set system forwarding lag-hash destination-port off | lag_hash_config.dport |
以太网类型 | 开启 | nv set system forwarding lag-hash ether-type on nv set system forwarding lag-hash ether-type off | lag_hash_config.ether_type |
VLAN ID | 开启 | nv set system forwarding lag-hash vlan on nv set system forwarding lag-hash vlan off | lag_hash_config.vlan_id |
TEID(请参阅 GTP 哈希) | 关闭 | nv set system forwarding lag-hash gtp-teid on nv set system forwarding lag-hash gtp-teid off | lag_hash_config.gtp_teid |
以下示例命令从哈希计算中省略了源 MAC 地址和目标 MAC 地址
cumulus@switch:~$ nv set system forwarding lag-hash source-mac off
cumulus@switch:~$ nv set system forwarding lag-hash destination-mac off
cumulus@switch:~$ nv config apply
当 NVUE 未启用时,请使用以下说明。如果您正在使用 NVUE 配置交换机,则 NVUE 命令会更改 /etc/cumulus/datapath/nvue_traffic.conf
中的设置,这些设置优先于 /etc/cumulus/datapath/traffic.conf
中的设置。
- 编辑
/etc/cumulus/datapath/traffic.conf
文件- 取消注释
lag_hash_config.enable
选项。 - 将
lag_hash_config.smac
和lag_hash_config.dmac
选项设置为false
。
- 取消注释
cumulus@switch:~$ sudo nano /etc/cumulus/datapath/traffic.conf
...
#LAG HASH config
#HASH config for LACP to enable custom fields
#Fields will be applicable for LAG hash
#calculation
#Uncomment to enable custom fields configured below
lag_hash_config.enable = true
lag_hash_config.smac = false
lag_hash_config.dmac = false
lag_hash_config.sip = true
lag_hash_config.dip = true
lag_hash_config.ether_type = true
lag_hash_config.vlan_id = true
lag_hash_config.sport = true
lag_hash_config.dport = true
lag_hash_config.ip_prot = true
#GTP-U teid
lag_hash_config.gtp_teid = false
...
运行
echo 1 > /cumulus/switchd/ctrl/hash_config_reload
命令。此命令不会导致任何流量中断。cumulus@switch:~$ echo 1 > /cumulus/switchd/ctrl/hash_config_reload
Cumulus Linux 默认启用对称哈希。确保源 IP 和目标 IP 字段的设置匹配,并且源端口和目标端口字段的设置匹配;否则 Cumulus Linux 会自动禁用对称哈希。如有必要,您可以在 /etc/cumulus/datapath/traffic.conf
文件中通过设置 symmetric_hash_enable = FALSE
手动禁用对称哈希。
您还可以为每个交换机设置唯一的哈希种子,以避免哈希极化。请参阅 唯一哈希种子。
GTP 哈希
GTP 在移动运营商网络的核心内承载移动数据。5G 移动核心集群中的流量(从蜂窝站点到计算节点)具有相同的源 IP 地址和目标 IP 地址。识别单个流的唯一方法是使用 GTP TEID。启用 GTP 哈希将 TEID 添加为哈希参数,并帮助网络中的 Cumulus Linux 交换机在 ECMP 路由上均匀分配移动数据流量。
Cumulus Linux 支持基于 TEID 的负载均衡,用于从 bond 出站的流量,并且仅当从端口出站的外部报头是 GTP 封装的,并且入站数据包是 GTP-U 数据包或 VXLAN 封装的 GTP-U 数据包时才适用。
- Cumulus Linux 在 NVIDIA Spectrum-2 及更高版本上支持 GTP 哈希。
- GTP-C 数据包不属于 GTP 哈希的一部分。
要启用基于 TEID 的负载均衡
cumulus@switch:~$ nv set system forwarding lag-hash gtp-teid on
cumulus@switch:~$ nv config apply
要禁用基于 TEID 的负载均衡,请运行 nv set system forwarding lag-hash gtp-teid off
命令。
当 NVUE 未启用时,请使用以下说明。如果您正在使用 NVUE 配置交换机,则 NVUE 命令会更改 /etc/cumulus/datapath/nvue_traffic.conf
中的设置,这些设置优先于 /etc/cumulus/datapath/traffic.conf
中的设置。
编辑
/etc/cumulus/datapath/traffic.conf
文件- 取消注释
hash_config.enable = true
行。 - 将
lag_hash_config.gtp_teid
参数更改为true
。
cumulus@switch:~$ sudo nano /etc/cumulus/datapath/traffic.conf ... # Uncomment to enable custom fields configured below hash_config.enable = true ... #GTP-U teid lag_hash_config.gtp_teid = true
- 取消注释
运行
echo 1 > /cumulus/switchd/ctrl/hash_config_reload
命令。此命令不会导致任何流量中断。cumulus@switch:~$ echo 1 > /cumulus/switchd/ctrl/hash_config_reload
要禁用基于 TEID 的负载均衡,请将 lag_hash_config.gtp_teid
参数设置为 false
,然后重新加载配置。
故障排除
要显示 bond 的信息,请运行 NVUE nv show interface <bond> bond
命令
cumulus@leaf01:mgmt:~$ nv show interface bond1 bond
operational applied description
----------- ----------- ------- ------------------------------------------------------
down-delay 0 0 bond down delay
lacp-bypass on on lacp bypass
lacp-rate fast fast lacp rate
mode lacp bond mode
up-delay 0 0 bond up delay
[member] swp1 swp1 Set of bond members
mlag
enable on Turn the feature 'on' or 'off'. The default is 'off'.
id 1 1 MLAG id
status single Mlag Interface status
您还可以运行 Linux sudo cat /proc/net/bonding/<bond>
命令
cumulus@leaf01:mgmt:~$ sudo cat /proc/net/bonding/bond1
...
Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer3+4 (1)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
802.3ad info
LACP rate: fast
Min links: 1
Aggregator selection policy (ad_select): stable
System priority: 65535
System MAC address: 44:38:39:be:ef:aa
Active Aggregator Info:
Aggregator ID: 1
Number of ports: 1
Actor Key: 9
Partner Key: 1
Partner Mac Address: 00:00:00:00:00:00
Slave Interface: swp1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 44:38:39:00:00:37
Slave queue ID: 0
Aggregator ID: 1
Actor Churn State: none
Partner Churn State: churned
Actor Churned Count: 1
Partner Churned Count: 2
...
要显示特定的 bond 信息,请使用 nv show interface <bond> <option>
命令
cumulus@switch:~$ nv show interface bond1 TAB
acl bridge ip lldp ptp router
bond evpn link pluggable qos
cumulus@leaf02:mgmt:~$ nv show interface bond1 link
operational applied description
--------------------- ----------------- ------- ----------------------------------------------------------------------
auto-negotiate off on Link speed and characteristic auto negotiation
duplex full full Link duplex
fec auto Link forward error correction mechanism
mtu 9000 9000 interface mtu
speed 1G auto Link speed
dot1x
mab off bypass MAC authentication
parking-vlan off VLAN for unauthorized MAC addresses
state up up The state of the interface
stats
carrier-transitions 1 Number of times the interface state has transitioned between up and...
in-bytes 0 Bytes total number of bytes received on the interface
in-drops 0 number of received packets dropped
in-errors 0 number of received packets with errors
in-pkts 0 total number of packets received on the interface
out-bytes 3.65 MB total number of bytes transmitted out of the interface
out-drops 0 The number of outbound packets that were chosen to be discarded eve...
out-errors 0 The number of outbound packets that could not be transmitted becaus...
out-pkts 51949 total number of packets transmitted out of the interface
mac 44:38:39:00:00:37 MAC Address on an interface