Bond 主动备份 Linux

Bond 主动备份 Linux

我正在尝试在我的 4.4 proxmox 服务器上建立一个绑定。

我选择了主动备份,因为该结合将链接到不使用生成树协议的 Linux 桥。

Bond(bond1) 将有 2 个从属设备:Bond0 是 3 个链路(eth0、eth1、eth2) 的 LACP,连接到 1 个交换机,eth3 连接到另一个交换机。

我的问题是,当我拔下 Bond0(Bond1 的主接口)时,我会拔下(eth0 eth1 eth2)上的所有电缆

Bond1 保持 bond0 作为活动链路,效果为:服务器无法从本地网络访问。

我认为这是因为即使 3 个从属设备关闭,Bond0 仍保持 UP。

因为当我执行 ifconfig bond0 down 时。

Bond1 使用另一条链路(eth3)进行连接。服务器回到本地网络。

这就是它应该工作的方式。

因此,我尝试了 bond0 中的多个参数,以强制它在 eth0 eth1 和 eth2 处于 DOWN 状态时处于 DOWN 状态。

我没能找到答案。

我甚至在 /etc/network/interface 中的 eth0 eth1 和 eth2 上使用了 post-down、post-up、.... 参数,以触发一个脚本,当这些端口处于 DOWN 状态时执行 ifdown bond0,当其中一个端口恢复工作时执行 ifup bond0。

但这不起作用,我尝试拔掉 bond0。bond1 仍使用 bond0 作为活动链接。脚本未运行。

这时候我真想拔掉我的头发……

该脚本未被触发,因为仅当我执行 ifdown eth0 ifdown eth1 或 ifdown eth2 时才会执行它们...

(post-down,post-up):现在我知道这些参数仅在我们运行 ifdown 或 ifup 时才会发出命令,而不会在我们拔掉插头时发出命令。(说真的,这个功能的意义何在)。

我想在接口关闭时执行一项操作,但当我拔下以太网电缆时它不起作用.....

这根本不是我想要的。

我在更改之间重新启动。

我现在有点绝望,我花了 9 个小时在这上面。

所以我请求你的帮助。

我找到了一个 debian 软件包“ifplugd”,当接口被拔出时,它会执行一些操作。我明天会试试

我真的不知道这里的最佳做法是什么。

我正在听取任何建议。谢谢。

更新

这是 /etc/network/interface:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual
        post-down do_i_bring_bond0_down.sh
        post-up do_i_bring_bond0_up.sh

auto eth1
iface eth1 inet manual
        post-down do_i_bring_bond0_down.sh
        post-up do_i_bring_bond0_up.sh

auto eth2
iface eth2 inet manual
        post-down do_i_bring_bond0_down.sh
        post-up do_i_bring_bond0_up.sh

iface eth3 inet manual


auto bond0
iface bond0 inet manual
        slaves eth0 eth1 eth2
        bond_miimon 100
        bond_mode 802.3ad
        bond_xmit_hash_policy layer3+4
        bond_min_links 1

auto bond1
iface bond1 inet manual
        slaves bond0 eth3
        bond_miimon 100
        bond_mode active-backup
        bond_primary bond0
        bond_updelay 100
        bond_downdelay 100

auto vmbr0
iface vmbr0 inet static
        address  10.4.2.4
        netmask  255.255.255.192
        gateway  10.4.2.1
        bridge_ports bond1.20
        bridge_stp off
        bridge_fd 0

auto vmbr1
iface vmbr1 inet manual
        bridge_ports bond1
        bridge_stp off
        bridge_fd 0
        bridge_vlan_aware yes

/proc/net/bonding/bond1

Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: bond0 (primary_reselect always)
Currently Active Slave: bond0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 100
Down Delay (ms): 100

Slave Interface: bond0
MII Status: up
Speed: Unknown
Duplex: Unknown
Link Failure Count: 0
Permanent HW addr: c8:1f:66:c2:dc:3b
Slave queue ID: 0

Slave Interface: eth3
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:15:17:3a:a9:bf
Slave queue ID: 0

/proc/net/bonding/bond0

Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

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: slow
Min links: 0
Aggregator selection policy (ad_select): stable
System priority: 65535
System MAC address: c8:1f:66:c2:dc:3b
Active Aggregator Info:
        Aggregator ID: 2
        Number of ports: 3
        Actor Key: 9
        Partner Key: 67
        Partner Mac Address: 80:2a:a8:df:42:b1

Slave Interface: eth0
MII Status: down
Speed: Unknown
Duplex: Unknown
Link Failure Count: 1
Permanent HW addr: c8:1f:66:c2:dc:3b
Slave queue ID: 0
Aggregator ID: 2
Actor Churn State: none
Partner Churn State: none
Actor Churned Count: 1
Partner Churned Count: 1
details actor lacp pdu:
    system priority: 65535
    system mac address: c8:1f:66:c2:dc:3b
    port key: 0
    port priority: 255
    port number: 1
    port state: 61
details partner lacp pdu:
    system priority: 32768
    system mac address: 80:2a:a8:df:42:b1
    oper key: 67
    port priority: 128
    port number: 8
    port state: 61

Slave Interface: eth1
MII Status: down
Speed: Unknown
Duplex: Unknown
Link Failure Count: 1
Permanent HW addr: c8:1f:66:c2:dc:3c
Slave queue ID: 0
Aggregator ID: 2
Actor Churn State: none
Partner Churn State: none
Actor Churned Count: 0
Partner Churned Count: 0
details actor lacp pdu:
    system priority: 65535
    system mac address: c8:1f:66:c2:dc:3b
    port key: 0
    port priority: 255
    port number: 2
    port state: 61
details partner lacp pdu:
    system priority: 32768
    system mac address: 80:2a:a8:df:42:b1
    oper key: 67
    port priority: 128
    port number: 7
    port state: 61

Slave Interface: eth2
MII Status: down
Speed: Unknown
Duplex: Unknown
Link Failure Count: 1
Permanent HW addr: 00:15:17:3a:a9:be
Slave queue ID: 0
Aggregator ID: 2
Actor Churn State: none
Partner Churn State: none
Actor Churned Count: 1
Partner Churned Count: 1
details actor lacp pdu:
    system priority: 65535
    system mac address: c8:1f:66:c2:dc:3b
    port key: 0
    port priority: 255
    port number: 3
    port state: 61
details partner lacp pdu:
    system priority: 32768
    system mac address: 80:2a:a8:df:42:b1
    oper key: 67
    port priority: 128
    port number: 9
    port state: 61

答案1

您无法绑定债券,此配置错误。

请参阅我的其他答案,了解仅使用 LACP 实现“绑定之间的故障转移”的方法,这是正确的配置:https://unix.stackexchange.com/questions/82569/bonds-vs-aggregators/172232#172232

答案2

问题似乎是这样的:“最小链接数:0”。从min_links 参数的绑定文档

最小链接数

这允许设置在将绑定设备标记为启动(载波开启)之前必须启动(链路启动状态)的最小成员端口数

默认值为 0。只要有活动的聚合器,这将导致载波被断言(对于 802.3ad 模式),而不管该聚合器中可用链路的数量。

然而,这部分有点令人困惑:

请注意,由于聚合器在没有至少一个可用链接的情况下无法处于活动状态,因此将此选项设置为 0 或 1 具有完全相同的效果。

在您的 bond0 示例中,所有三个 eth 接口的 MII 状态(链路状态)均为关闭,但它们所在的聚合器 (2) 处于活动状态,这似乎与文档相矛盾。让我们看看源代码。

bond_3ad_set_carrier() 的代码调用 __agg_active_ports(),它只是检查每个设备的“is_enabled”标志的值,似乎与链接状态无关。

此补丁似乎表明情况确实如此:

目前,补丁使用活动从属设备的数量与 min_links 进行比较,以了解何时开启/关闭 Bond Carrier。建议将 min_links 设置为 1,而不是默认的零。使用 min_links=1 表示 Bond 内必须至少有 1 个从属设备处于活动状态,Bond 才能开启。

据我所知,该补丁尚未集成到主线中,或者可能以我无法辨别的修改形式集成到主线中。

尝试将 min_links 设置为 1 或 2,看看会发生什么。如果不起作用,您可以从 miimon 切换到 arp 监控(设置 arp_interval apr_ip_target 等)。

PS 如果您最终使用 LACP,我会将 lacp_rate 从默认值(每 30 秒传输一次慢速 LACPDU - 即检测故障的时间为 30 秒)更改为快速或 1(请求合作伙伴每 1 秒传输一次 LACPDU)。

编辑:进一步研究代码让我开始质疑我的答案。当链接状态发生变化时,bond_3ad_handle_link_change() 函数应该禁用设备。也许你没有等待 30 多秒让 LACP 状态机工作?尽管如此,我还是会留下答案,因为我花了太多时间。:)

相关内容