网络层容错:多网卡绑定、链路聚合、网络冗余设计

网络层,说白了就是期货交易系统的「血管」。

行情数据要进来,交易指令要出去,中间任何一个环节断了,轻则丢单,重则穿仓。我见过太多团队在应用层堆了一堆容错逻辑,结果网络一抖,全白搭。

所以今天咱们聊聊网络层怎么扛得住。核心就三招:多网卡绑定、链路聚合、网络冗余设计。

1. 多网卡绑定:让物理链路互为备份

一台交易服务器,至少插两块物理网卡。这不是浪费,是底线。

多网卡绑定(NIC Teaming),就是把两块或更多网卡虚拟成一块逻辑网卡。操作系统看到的是一张网,实际流量走的是多条物理链路。

核心目标: 任何一块网卡、一根网线、一个交换机端口挂了,流量自动切到其他链路,业务零感知。

我在项目中遇到过一种情况:某家期货公司的报单服务器,只配了一块千兆网卡。结果某天下午,机房运维不小心踢掉了网线,整整3分钟没有报单。3分钟,在期货市场里够爆仓好几轮了。

从那以后,我要求所有核心交易节点,至少双网卡绑定起步。

绑定模式怎么选?

Linux下常用的绑定模式有这么几种,我直接给你列个表:

模式 名称 特点 适用场景
mode 0 balance-rr 轮询分发,负载均衡 需要高吞吐的场景
mode 1 active-backup 主备模式,只有一块工作 追求稳定性,不关心带宽
mode 4 802.3ad 动态链路聚合,需交换机支持 兼顾带宽和冗余
mode 6 balance-alb 自适应负载均衡,无需交换机配合 不想动交换机配置的场景

我个人习惯,期货交易服务器用 mode 1(active-backup)。为什么?

因为交易流量对延迟极度敏感。mode 0 虽然能聚合带宽,但轮询分发可能导致报文乱序,某些交易网关处理乱序的能力很差。mode 1 虽然浪费了一块网卡的带宽,但切换干净利落,延迟稳定。

避坑指南: 我曾经在mode 4上栽过跟头。交换机没配好LACP,结果两块网卡都在发数据,但交换机不认,直接丢包。后来我学乖了,生产环境一律先用mode 1跑起来,等网络团队确认交换机配置无误,再考虑切到mode 4。

2. 链路聚合:不只是带宽叠加

链路聚合(Link Aggregation),很多人以为就是为了把两条千兆线合成两G带宽。其实它的核心价值,是让多条链路看起来像一条

你想想看,如果不用链路聚合,两块网卡各自独立,应用层得自己决定走哪条路。一旦某条链路断了,应用层还得感知、切换,这中间的时间窗口足够出事了。

链路聚合在交换机层面就把这事解决了。交换机知道这两条线是绑在一起的,一条断了,流量自动走另一条。

配置示例(Linux + mode 4)

# 加载 bonding 模块
modprobe bonding mode=4 miimon=100 lacp_rate=fast

# 创建 bond 接口
ip link add bond0 type bond mode 802.3ad miimon 100 lacp_rate fast

# 添加物理网卡
ip link set eth0 master bond0
ip link set eth1 master bond0

# 配置 IP
ip addr add 192.168.1.100/24 dev bond0
ip link set bond0 up

这里有个细节:miimon=100 表示每100毫秒检测一次链路状态。我建议不要设得太短,否则链路抖动时频繁切换反而坏事。100ms是个比较稳妥的值。

注意: 链路聚合要求两端(服务器和交换机)配置一致。交换机侧没开LACP,服务器这边mode 4就是白搭。我曾经见过一个团队,服务器配了mode 4,交换机没配,结果流量时通时断,排查了整整一天。

3. 网络冗余设计:从单点到全冗余

多网卡绑定解决的是服务器到交换机的单点故障。但网络拓扑里还有别的单点:交换机本身、上行链路、甚至整个机房。

真正的冗余设计,得从端到端去考虑。

我常用的三层冗余架构

  1. 接入层冗余: 服务器双网卡分别接到两台不同的接入交换机。一台交换机挂了,流量走另一台。
  2. 汇聚层冗余: 两台接入交换机各自上行到两台汇聚交换机。任何一条上行链路断了,不影响。
  3. 核心层冗余: 汇聚交换机再上行到核心交换机。核心层通常已经是全冗余设计。

说白了,就是没有单点。任何一个网络设备、任何一条光纤断了,业务都不应该受影响。

关键指标: 网络切换时间 < 1秒。期货交易里,1秒的断网可能意味着几十万的滑点损失。

SVG 网络冗余架构图

期货交易系统网络冗余架构 核心交换机 A 核心交换机 B 汇聚交换机 A 汇聚交换机 B 接入交换机 A 接入交换机 B 接入交换机 C 接入交换机 D 交易服务器 A 交易服务器 B 核心层 汇聚层 接入层 服务器

STP与快速收敛

冗余拓扑里有个老问题:环路。交换机之间多条链路互联,如果不做防环,广播风暴分分钟把网络打瘫。

STP(生成树协议)就是干这个的。它会逻辑上阻塞一条链路,只留一条活路。一旦活路断了,STP重新计算,把阻塞的链路放开。

但传统STP收敛太慢,要30-50秒。期货交易等不了。所以必须用 RSTP(快速生成树协议)MSTP(多生成树协议),收敛时间可以控制在1秒以内。

我的经验: 曾经有一家客户,网络拓扑配了冗余,但STP用的是默认配置。某次接入交换机重启,网络中断了整整40秒。40秒,行情跳了多少点?后来我帮他们改成RSTP,切换时间降到200毫秒以内。嗯,这才像话。

4. 实战中的几个坑

理论说完了,我分享几个真实踩过的坑。

  • 坑一:网卡固件版本不一致。 两块同型号网卡,固件版本不同,绑定后偶尔出现丢包。后来统一刷成同一版本,问题消失。
  • 坑二:交换机端口配置不一致。 两台接入交换机,一台开了端口安全,一台没开。结果流量切到另一台时,直接被drop。排查了俩小时。
  • 坑三:光模块混用。 多模光纤配了单模模块,或者反之。光衰大,链路不稳定。我后来要求所有光模块统一采购、统一标号。
  • 坑四:MTU不一致。 服务器设了9000的巨型帧,交换机没开。结果大包被分片,性能反而下降。交易链路我建议统一用1500,省心。
最重要的提醒: 网络冗余不是配完就完事了。你得定期做故障演练。拔网线、重启交换机、换光模块,模拟各种故障场景,看系统能不能自动恢复。我见过太多「纸面冗余」——配置看着完美,一拔网线就原形毕露。

好了,网络层容错就聊到这儿。记住一句话:网络没有单点,交易才能安心


专注资料整理