Linux 网卡 Bonding 配置实战:bond0 主备与负载均衡 - 夜莺博客

Linux 网卡 Bonding 配置实战:bond0 主备与负载均衡

服务器双网卡做 Bonding(链路聚合)是 Linux 运维的必修课:一根网线断掉不丢业务、带宽翻倍,还能配合交换机做链路冗余。但很多运维第一次配置 bond 都栽在模式选择上——mode 0 和 mode 4 都叫"负载均衡",行为却完全不同,配错模式轻则带宽不叠加,重则造成广播风暴。本文从 bond 的七种模式讲起,给出 mode 1(主备)和 mode 4(LACP 动态聚合)两套完整配置,并总结最常见的排障命令。

Bond 七种模式速览

模式 名称 特点 交换机要求
mode 0 balance-rr 轮询负载均衡,所有口收发 需要静态链路聚合
mode 1 active-backup 主备冗余,只有一块口工作 无要求
mode 2 balance-xor 按 XOR 哈希分流 需要静态链路聚合
mode 3 broadcast 所有口同时收发(广播) 需要静态链路聚合
mode 4 802.3ad 动态 LACP,按哈希分流 必须支持 LACP
mode 5 balance-tlb 发送负载均衡(自适应) 无要求
mode 6 balance-alb 收发都均衡(自适应) 无要求

实战中最常用的是 mode 1(纯冗余,随便哪台交换机都行)和 mode 4(LACP,带宽叠加,交换机需配置 Eth-Trunk/Bridge-Aggregation)。

配置一:mode 1 主备(最稳妥)

加载 bonding 内核模块并设置参数:

# vim /etc/modprobe.d/bonding.conf
alias bond0 bonding
options bond0 mode=1 miimon=100

配置 bond0 与两块物理网卡(以 RHEL/CentOS 为例):

# /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
ONBOOT=yes

# ifcfg-eth0
DEVICE=eth0
MASTER=bond0
SLAVE=yes
ONBOOT=yes

# ifcfg-eth1(内容与 eth0 相同)

重启网络或 systemctl restart network 生效。Ubuntu 用 netplan 配置更简洁:

# /etc/netplan/01-netcfg.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0: {dhcp4: no}
    eth1: {dhcp4: no}
  bonds:
    bond0:
      interfaces: [eth0, eth1]
      addresses: [192.168.1.100/24]
      parameters:
        mode: active-backup
        mii-monitor-interval: 100

配置二:mode 4 LACP 负载均衡

mode 4 需要交换机侧配合(华为:interface Eth-Trunk1 + mode lacp-static;H3C:link-aggregation mode dynamic),服务器侧:

# /etc/modprobe.d/bonding.conf
options bond0 mode=4 miimon=100 lacp_rate=1 xmit_hash_policy=layer3+4

Ubuntu netplan 版本:

  bonds:
    bond0:
      interfaces: [eth0, eth1]
      addresses: [192.168.1.100/24]
      parameters:
        mode: 802.3ad
        lacp-rate: fast
        mii-monitor-interval: 100
        transmit-hash-policy: layer3+4

xmit_hash_policy=layer3+4 按 IP+端口哈希分流,避免单条大流量(如备份)把流量压在一个口上。

验证与排障

cat /proc/net/bonding/bond0
ip link show bond0
ip -s link show bond0
ethtool eth0

关键检查点:

  • cat /proc/net/bonding/bond0 看 MII Status 是否 up、Bonding Mode 是否正确、当前 Currently Active Slave 是哪块。
  • mode 4 下出现大量 multi 或流量不均匀,检查交换机聚合模式是否为动态 LACP、两端 lacp_rate 是否一致。
  • 拔掉主用网卡测试切换:mode 1 应秒级切换到备用口(miimon=100 时约 100ms 检测周期)。

模式怎么选:三个问题定答案

模式选择其实只需要回答三个问题,回答完答案基本唯一:

  1. 交换机能不能配合?不能配合(或两根线接在不同交换机、跨机架)就直接选 mode 1。mode 0/2/3/4 在两端配置不一致时会产生环路与广播风暴,风险远大于收益。
  2. 需要带宽叠加还是只要冗余?只要"一根线断业务不断",mode 1 足够;需要单台服务器突破单口带宽上限,才需要 mode 4。
  3. 流量是单一会话还是多会话?mode 4 按流做哈希,单条大流量(rsync 备份、NFS 大文件、单线程压测)永远只走一个物理口,带宽不会叠加,这种情况要么拆分多会话,要么改用 mode 6。

补充一点:mode 5 与 mode 6 不需要交换机配合也能在发送侧做负载均衡,但接收侧依赖 ARP 应答改写,在跨网段、有网关的环境中容易出问题,因此生产环境用得较少。

bond 与 VLAN、Bridge 的组合

虚拟化与多网段场景下,bond 很少单独存在,通常要在 bond 之上再建 VLAN 子接口或桥接口。要点是"先聚合、后划分":物理口 → bond0 → bond0.100(VLAN 100)→ 桥接或直接配 IP。

# bond0 之上划分 VLAN 子接口
ip link add link bond0 name bond0.100 type vlan id 100
ip addr add 10.0.100.10/24 dev bond0.100
ip link set bond0.100 up
# 让 VLAN 接口在 bond 起来后自动 UP(RHEL 系)
echo 'VLAN=yes' >> /etc/sysconfig/network-scripts/ifcfg-bond0.100

顺序做反就会出现"bond 起来了但业务不通":先给物理网卡配了 IP,再把它设为 bond 的 slave,从口的 IP 会被忽略并且容易造成回包异常。正确做法是 slave 网卡不要保留任何 IP、网关与路由配置,所有三层配置只留在 bond 或其 VLAN 子接口上。

性能调优:哈希策略与网卡特性

cat /proc/net/bonding/bond0 | grep -E "Hash|Mode|MII"
ethtool -k eth0 | grep -E "generic-receive-offload|tcp-segmentation"
iperf3 -c 192.168.1.101 -P 4 -t 30

xmit_hash_policy 决定流量如何落到物理口:layer2(默认)按 MAC 哈希,跨三层流量容易集中在一个口;layer3+4 按源/目的 IP 加端口哈希,分流最均匀;layer2+3 兼顾两者但不看端口。用 iperf3 -P 4 开多并发才测得出叠加后的带宽,单流测试永远只有单口速率。mode 4 下还可以把 LACP 速率设为 fast(lacp_rate=1),把故障切换从 30 秒级缩短到 1 秒级。

另外要注意网卡 offload 特性:部分驱动在 bond 场景下聚合校验和会出问题,表现为随机丢包或校验错误,排查时可临时 ethtool -K eth0 tx off rx off 做对比验证。

故障切换验证与压测

ping -i 0.2 -c 300 192.168.1.1 | tee /tmp/ping.log   # 持续 ping 观察切换影响
ip link set eth0 down                                # 手动 down 掉主用网卡
cat /proc/net/bonding/bond0 | grep "Currently Active Slave"

切换时间与 miimon 直接相关:miimon=100 表示每 100ms 检测一次链路,正常切换在毫秒到百毫秒级,业务基本无感。如果切换失败或耗时数秒,先确认 miimon 是否配置,再从口是否被正确识别为 UP。跨交换机的 mode 1(两块网卡接不同交换机)需要交换机侧配合,否则可能出现 MAC 表震荡导致短时丢包。

用 nmcli 与 systemd-networkd 配置

nmcli con add type bond con-name bond0 ifname bond0 mode active-backup miimon 100
nmcli con add type bond-slave ifname eth0 master bond0
nmcli con add type bond-slave ifname eth1 master bond0
nmcli con mod bond0 ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1
nmcli con up bond0

systemd-networkd 用户则用一份 .netdev 加两份 .network 文件描述同一个 bond,关键字段是 [NetDev] Bond= 与 [Bond] 段里的 Mode=、MIIMonitorSec=。无论用哪种方式,配置完都要用 networkctl status bond0 或 nmcli dev show bond0 回读一次,确认运行态与配置文件一致,而不是只看命令没有报错。

常见内核日志与报错

  • bonding: bond0: link status definitely up for interface eth0:正常的链路建立日志,可用于确认切换时间点。
  • bonding: bond0: no active slave:两块从口都不可用,检查网线、交换机端口与 miimon 配置。
  • bonding: bond0: Warning: setting eth0 as slave but it is already up:从口上还残留 IP 或路由配置,清掉后再重启网络。
  • mode 4 下出现 LACP partner mac address is 00:00:00:00:00:00:交换机侧没有开启 LACP 或聚合组未激活,服务器侧协商不到对端。
  • mode 0/2/3 出现广播风暴、MAC 表持续漂移:交换机侧未配静态链路聚合,两端行为不一致,必须停机调整。

常见坑位

  • 两块网卡 MAC 地址相同导致交换机端口学不到 MAC:bond 默认使用第一块口的 MAC,属正常现象。
  • mode 0/2/3/4 交换机侧必须配聚合,否则可能环路广播风暴。
  • 忘加 miimon:链路断开但口状态仍 up 时不会切换,等于没有冗余。

延伸阅读:Linux Bonding 七种模式与 active-backup 对比、802.3ad 的 LACP 速率与哈希策略、systemd-networkd 配置 VLAN/Bond/Bridge、iperf3 带宽测试方法。

原文链接:https://www.kernel.org/doc/Documentation/networking/bonding.txt