4、RoCE多路径架构:多路径拓扑设计、多路径网卡配置、多路径路由策略、多路径故障域隔离
多路径,说白了就是给数据流多修几条路。你想想看,一条路堵死了,另一条还能走。RDMA网络对延迟极其敏感,一旦链路故障,丢包重传的代价非常高。我当年在数据中心调优时,遇到过一条40G链路闪断,整个集群的存储IO直接卡死——嗯,从那以后,我再也不敢轻视多路径设计了。
这一节,我们重点聊四个维度:拓扑怎么搭、网卡怎么配、路由怎么走、故障怎么隔离。每个点我都会结合实战经验来讲。
4.1 多路径拓扑设计
拓扑设计是地基。地基不稳,后面全白搭。我个人习惯把多路径拓扑分为两类:对称拓扑和非对称拓扑。
- 对称拓扑:每个服务器到每个交换机的路径数相同,延迟均衡。适合高性能计算场景。
- 非对称拓扑:部分路径带宽高,部分路径带宽低。适合混合流量场景。
我在项目中遇到过一种典型场景:客户要求所有存储节点和计算节点之间至少有4条物理路径。我们最终采用了Spine-Leaf + 双网卡绑定的方案。每个服务器插两块100G网卡,分别连接到两台Leaf交换机,Leaf再上行到两台Spine。这样任意单点故障都不会断流。
核心原则:路径数 = 网卡数 × 上行链路数。路径数越多,容错性越好,但路由复杂度也越高。
下面这张图是我常用的多路径拓扑结构,你可以直观感受一下:
4.2 多路径网卡配置
网卡配置是很多人容易翻车的地方。我曾经帮一个团队排查性能问题,发现他们虽然插了两块网卡,但流量全走一条路——因为没配多路径绑定。
RoCE场景下,我推荐两种主流配置方式:
- Active-Backup(主备模式):一条链路工作,另一条待命。故障时切换,但切换有延迟。
- Active-Active(负载均衡模式):两条链路同时工作,流量分担。延迟更低,但需要上层路由策略配合。
我的建议:RDMA场景尽量用Active-Active。主备模式切换时会导致QP(队列对)重连,对延迟敏感的应用影响很大。
配置示例(基于Mellanox网卡):
# 创建绑定接口
nmcli connection add type bond con-name bond0 ifname bond0 mode balance-xor
# 添加物理网卡到绑定
nmcli connection add type ethernet con-name eth0 ifname ens1f0 master bond0
nmcli connection add type ethernet con-name eth1 ifname ens1f1 master bond0
# 启用RoCE
nmcli connection modify bond0 ethtool.features-rx-gro-hw off
nmcli connection modify bond0 ethtool.features-tx-gro-hw off
# 设置MTU(RDMA推荐9000)
nmcli connection modify bond0 mtu 9000
这里有个坑:bonding模式不能选broadcast,否则会产生大量重复包,RDMA直接崩溃。我见过有人配错,整个集群的存储IO直接打满——嗯,排查了整整两天。
4.3 多路径路由策略
路由策略决定了流量走哪条路。RoCE多路径的核心是等价多路径(ECMP)。ECMP会根据五元组(源IP、目的IP、源端口、目的端口、协议)哈希,把流量分散到不同路径上。
但ECMP有个问题:哈希冲突。如果多条大流哈希到同一条路径,那条路就会拥塞,其他路却空闲。我在项目中遇到过这种情况,一条100G链路跑到95%,另一条只有20%。
注意:ECMP的哈希算法可以调优。Mellanox交换机支持对称哈希和非对称哈希。对称哈希适合双向流量,非对称哈希适合单向流量。我个人习惯用对称哈希,因为RDMA流量通常是双向的。
配置示例(基于Cumulus Linux交换机):
# 启用ECMP
net add routing route 10.0.0.0/8 ecmp 64
# 设置哈希算法(对称哈希)
net add forwarding ecmp hash-keys symmetric
# 查看ECMP状态
net show forwarding ecmp
还有一个技巧:调整哈希种子。如果发现哈希不均匀,可以改种子值重新分布。我一般从0试到10,选一个最均衡的。
4.4 多路径故障域隔离
故障域隔离,说白了就是让一个故障不要扩散到整个网络。RDMA对丢包零容忍,一旦某个交换机挂了,所有经过它的流都得重传。
我常用的隔离策略有:
- 物理隔离:不同租户或不同业务用不同的物理网络。成本高,但最安全。
- VLAN隔离:同一物理网络,不同VLAN。适合中小规模。
- VXLAN + ECMP:通过VXLAN隧道隔离,ECMP做负载均衡。适合大规模云数据中心。
举个例子,我曾经帮一个金融客户设计多路径架构。他们的交易系统和存储系统共用同一套RoCE网络。我建议用VXLAN隔离:交易系统用VNI 100,存储系统用VNI 200。这样即使存储系统出现广播风暴,也不会影响交易系统。
关键点:故障域隔离的粒度要细。每个故障域内的路径数建议≥2,这样单点故障不影响业务。
配置示例(VXLAN + ECMP):
# 创建VXLAN接口
ip link add vxlan100 type vxlan id 100 dstport 4789 dev bond0
ip link set vxlan100 up
# 添加路由(走ECMP)
ip route add 10.100.0.0/16 dev vxlan100
ip route add 10.200.0.0/16 dev vxlan100
# 查看多路径路由
ip route show | grep ecmp
最后说一句:多路径不是越多越好。路径太多,路由表膨胀,转发延迟反而增加。我一般控制在4-8条路径之间,既保证容错,又不牺牲性能。
避坑指南:我曾经在一个项目中配了16条路径,结果交换机CPU负载飙到80%。后来减到8条,一切正常。记住:多路径是手段,不是目的。
公众号:蓝海资料掘金营,微信deep3321