Linux teamd 的 runner activebackup / loadbalance / lacp 与 bonding 的功能对比

3次阅读

teamd的activebackup与bonding mode=1本质相同但初始化不同:teamd默认不预选主端口,需显式配置runner.active_backup.primary,否则可能因link up顺序导致非预期端口接管流量。

Linux teamd 的 runner activebackup / loadbalance / lacp 与 bonding 的功能对比

teamdactivebackup 和 bonding 的 mode=1 本质一样,但初始化行为不同

两者都只允许一个端口发包,故障时切换;但 teamd 默认不预选主端口,依赖 runner.active_backup.primary 配置或运行时选举,而 bondingprimary 参数在加载时即锁定主设备。没配 primary 时,teamd 可能因 link up 顺序导致非预期端口先接管流量。

  • 常见错误现象:teamdctl team0 state 显示 runner: activebackup,但主备切换后 IP 响应延迟高、ARP 表未刷新
  • 必须显式设置 runner.active_backup.primary "ens3",否则依赖 link_watch 的探测间隔(默认 100ms),比 bonding 的 miimon=100 更易漏判瞬断
  • teamd 不支持 fail_over_mac 类似 bonding 的 MAC 行为控制,切换时交换机 MAC 表老化可能引发短暂丢包

teamdloadbalance 没有 bonding 的 mode=2(balance-xor)哈希粒度控制

两者都按源/目的地址哈希分发包,但 bonding 允许用 xmit_hash_policy 指定 layer2 / layer3+4 等策略,teamdrunner.load_balance.tx_balancer 只支持 basic(仅 MAC)和 xor(MAC + IP + port,但无法单独禁用 port)。

  • 使用场景:后端是多台服务器且希望连接级负载均衡teamdxor 会把同一 TCP 连接始终压到同一物理口,但若对端交换机也做 L4 哈希,可能造成二次偏斜
  • 参数差异:bondingxmit_hash_policy=layer3+4 可应对 NAT 后的源端口变化,teamdxor 在 SNAT 场景下容易让多个内网 IP 被哈希到同一从口
  • 性能影响:两者都不做 per-packet 负载,但 teamd 缺少 resend_igmp 类似机制,组播路由切换后 IGMP 报文可能卡在旧端口

teamdlacp 与 bonding 的 mode=4 兼容性关键在 lacp_rateaggregator_select_policy

表面上都走 802.3ad,但 teamd 默认用 lacp_rate=fast(每秒发 LACPDU),而 bonding 默认 slow(每 30 秒);若交换机只支持 slow,teamd 侧会持续报 LAG not aggregatable 错误。

  • 常见错误现象:teamdctl team0 state 显示 runner: lacp,但 ports 下所有接口状态为 disableddmesg 出现 lacpdu rx timeout
  • 必须同步配置:runner.lacp.lacp_rate "slow"runner.lacp.aggregator_select_policy "stable"(bonding 的 ad_select=stable),否则遇到端口 flapping 时 teamd 可能频繁重建 aggregator
  • 兼容性影响:某些老交换机(如 Cisco IE-3000)不识别 teamd 发出的 LACP actor key 中的扩展字段,需关掉 runner.lacp.port_enabled 的自动协商回退逻辑

替换 bonding 为 teamd 时,sysfs 接口和监控方式彻底不同

不能再查 /proc/net/bonding/bond0/sys/class/net/bond0/bonding/slavesteamd 只暴露 teamdctl CLI 和 D-Bus 接口;脚本中硬编码路径会直接失效。

  • 监控要点:teamdctl team0 state -v 输出是 json-like 结构,但无标准 schema,解析需依赖正则或 jq -r '.runner.port_state.ens3.state' 这类字段路径
  • 容易踩的坑:systemd service 文件里写 ExecStartPost=/bin/sh -c 'echo 1 > /sys/class/net/team0/bonding/miimon' 会报错 —— teamd 根本不创建 bonding 子目录
  • 调试建议:用 teamd -d -c /etc/teamd/team0.conf -o team0 启动看实时日志,重点盯 runner_notifylink_watch 模块输出,而不是查 /var/log/messages

实际部署时最常被忽略的是 link watch 配置粒度 —— teamdethtool 检测默认不启用 delay_up,端口刚 up 就切流量,但 PHY 层实际未稳定;而 bonding 的 updelay 是内置行为。这个时间差在叠交换机环境里容易引发 STP 振荡。

text=ZqhQzanResources