链路聚合 - 链路聚合

Linux 绑定提供了一种将多个网络接口(从接口)聚合到单个逻辑绑定接口(bond)的方法。链路聚合对于带宽的线性扩展、负载均衡和故障转移保护非常有用。

Cumulus Linux 支持两种绑定模式

  • IEEE 802.3ad 链路聚合模式将一个或多个链路组合成一个链路聚合组 (LAG),以便媒体访问控制 (MAC) 客户端可以将该组视为单个链路。IEEE 802.3ad 链路聚合是默认模式。
  • Balance-xor 模式根据哈希协议头信息在活动端口之间平衡出站流量,并接受来自任何活动端口的入站流量。所有从接口都处于活动状态,用于负载均衡和容错。这对于 MLAG 部署非常有用。

Cumulus Linux 使用 LAG 控制协议 (LACP) 的版本 1。

  • NVUE 不接受以接口类型 ID 开头的 bond 名称,例如 swethvlanloibfnmvrrp。例如,您不能将 bond 命名为 login123eth2sw1vlan10
  • 一个接口不能属于多个 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

Cumulus Linux 没有为此设置提供 NVUE 命令。

编辑 /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

Cumulus Linux 没有为此设置提供 NVUE 命令。

编辑 /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 中的设置。

  1. 编辑 /etc/cumulus/datapath/traffic.conf 文件
    • 取消注释 lag_hash_config.enable 选项。
    • lag_hash_config.smaclag_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
...
  1. 运行 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 中的设置。

  1. 编辑 /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
    
  2. 运行 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