具有 2 个 NIC 的 LACP 在其中一个发生故障时工作,而不是在两个都启动时工作

具有 2 个 NIC 的 LACP 在其中一个发生故障时工作,而不是在两个都启动时工作

我在 Ubuntu 12.04.2 LTS 上使 LACP 中继正常运行时遇到了问题。

我的设置是一台主机,通过两个 10 Gbe 接口连接到两个独立的 Nexus 5548 交换机,并将 vPC 配置为启用多机箱 LACP。Nexus 配置符合 Cisco 指南,Ubuntu 配置符合https://help.ubuntu.com/community/UbuntuBonding

服务器连接到每个 Nexus 交换机上的 Ethernet1/7 端口,这些端口的配置相同,并位于端口通道 15 中。端口通道 15 配置为 VPC 15,VPC 输出看起来不错。这些是简单的接入端口,即不涉及 801.1q 中继。

图表:

    +----------+      +----------+      +----------+      +----------+
    | client 1 |------| nexus 1  |------| nexus 2  |------| client 2 |
    +----------+      +----------+      +----------+      +----------+
                           |                  |
                           |    +--------+    |
                           +----| server |----+
                           eth4 +--------+ eth5

当任一链路断开时,客户端 1 和 2 都能够访问服务器。但是,当我打开辅助链路时,连接到具有新启用链路的交换机的客户端无法访问服务器。请参阅下表了解状态转换和结果:

   port states (down by means of "shutdown")
     nexus 1 eth1/7        up     up    down   up
     nexus 2 eth1/7       down    up     up    up

   connectivity
    client 1 - server      OK     OK     OK   FAIL
    client 2 - server      OK    FAIL    OK    OK

现在,我相信我已经将问题隔离到了 Linux 端。当处于 up-up 状态时,每个 nexus 都使用本地链接到服务器来传送数据包,这可以通过查看 mac 地址表来验证。我在服务器上能够看到的是,通过使用 tcpdump -i ethX,来自每个客户端的数据包都在 ethX 接口上接收(来自客户端 1 的数据包在 eth4 上,来自客户端 2 的数据包在 eth4 上),但是当我运行 tcpdump -i bond0 时,我只能从任一主机传输流量(根据我上面所述)。

我观察到 ARP 和 ICMP(IP)流量的相同行为;当两个链接都处于开启状态时,客户端的 ARP 会失败;当其中一个链接关闭时,ARP 会工作(与 ping 一起);当我再次启用链接时,ping 会失败(仍然在 eth 接口上接收数据包,但不在 bond0 上接收)。

需要澄清的是,我在这种配置下设置了多台服务器,并且都显示相同的症状,因此似乎与硬件无关。

所以 - 弄清楚如何解决这个问题是我正在处理的事情;到目前为止,我的谷歌搜索还没有给我带来任何运气。

非常感谢任何指点。

/etc/网络/接口

    auto eth4
    iface eth4 inet manual
    bond-master bond0

    auto eth5
    iface eth5 inet manual
    bond-master bond0

    auto bond0
    iface bond0 inet static
    address 10.0.11.5
    netmask 255.255.0.0
    gateway 10.0.0.3
    mtu 9216
    dns-nameservers 8.8.8.8 8.8.4.4
    bond-mode 4
    bond-miimon 100
    bond-lacp-rate 1
    #bond-slaves eth4
    bond-slaves eth4 eth5

/proc/net/bonding/bond0

    A little further information:
    Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

    Bonding Mode: IEEE 802.3ad Dynamic link aggregation
    Transmit Hash Policy: layer2 (0)
    MII Status: up
    MII Polling Interval (ms): 100
    Up Delay (ms): 0
    Down Delay (ms): 0

    802.3ad info
    LACP rate: fast
    Min links: 0
    Aggregator selection policy (ad_select): stable
    Active Aggregator Info:
    Aggregator ID: 1
    Number of ports: 1
    Actor Key: 33
    Partner Key: 1
    Partner Mac Address: 00:00:00:00:00:00

    Slave Interface: eth4
    MII Status: up
    Speed: 10000 Mbps
    Duplex: full
    Link Failure Count: 8
    Permanent HW addr: 90:e2:ba:3f:d1:8c
    Aggregator ID: 1
    Slave queue ID: 0

    Slave Interface: eth5
    MII Status: up
    Speed: 10000 Mbps
    Duplex: full
    Link Failure Count: 13
    Permanent HW addr: 90:e2:ba:3f:d1:8d
    Aggregator ID: 2
    Slave queue ID: 0

编辑:从 Nexus 添加配置

    vpc domain 100
      role priority 4000
      system-priority 4000
      peer-keepalive destination 10.141.10.17 source 10.141.10.12
      peer-gateway
      auto-recovery
    interface port-channel15
      description server5
      switchport access vlan 11
      spanning-tree port type edge
      speed 10000
      vpc 15
    interface Ethernet1/7
      description server5 internal eth4
      no cdp enable
      switchport access vlan 11
      channel-group 15

编辑:添加了同一台服务器的 nexus1 上的非 VPC 端口通道的结果,包括 IP 更改前后的结果(更改 IP 以影响负载平衡算法)。这仍然在服务器上使用相同的设置。

      port states (down by means of "shutdown")
        nexus 1 eth1/7        up     up    down   up
        nexus 1 eth1/14      down    up     up    up <= port moved from nexus 2 eth1/7

   connectivity (sever at 10.0.11.5, hashing uses Eth1/14)
       client 1 - server      OK     OK     OK   FAIL
       client 2 - server      OK     OK     OK   FAIL

更改IP后的结果正如预期,未使用的接口被启动导致失败。

      connectivity (sever at 10.0.11.15, hashing uses Eth1/7)
       client 1 - server      OK    FAIL    OK    OK
       client 2 - server      OK    FAIL    OK    OK

答案1

我在 Ubuntu 中设法运行的唯一 LACP 配置是:

auto bond0
iface bond0 inet dhcp
  bond-mode 4
  bond-slaves none
  bond-miimon 100
  bond-lacp-rate 1
  bond-updelay 200 
  bond-downdelay 200

auto eth0
iface eth0 inet manual
  bond-master bond0

auto eth1
iface eth1 inet manual
  bond-master bond0

即我不使用 bond-slave,而是使用 bond-master。我不确定有什么区别,但我发现这个配置对我有用。

尽管这是采用 1Gbe 网络,但我的设置下 LACP 没有任何问题。

此外,如果仍然遇到问题,请尝试将两根电缆插入同一交换机并配置 LACP 端口。这只是为了消除多机箱 LACP 出现问题的可能性。

答案2

问题不在于 Linux 端,而在于 nexus 端以及它在 vPC 配置中的工作方式。

要在 nexus 上配置 vPC,首先您需要连接两个 nexus 交换机并将该链接配置为“peer-link”。

正常情况下,当从交换机到服务器的两条链路都处于 UP 状态时,在 vPC 上配置的 vlan 11 中的流量会在对等链路上被丢弃。

仅当 vPC 中的一个接口关闭时,对等链路上才允许 VLAN 11 中的流量。

这就是 vPC 在 nexus 交换机上的工作方式。

为了解决这个问题,您可以运行 fabric-path 并在交换机 nexus-1 和 nexus-2 之间建立另一个连接。

相关内容