1. 为什么你的数据中心网络需要一个“双胞胎”?
大家好,我是老张,在数据中心网络这块摸爬滚打了十几年,见过太多因为单点故障导致的业务中断。想象一下,你公司的核心业务服务器,只通过一根网线连到一台核心交换机上。某天,这台交换机突然宕机,或者那根网线被哪个冒失的同事不小心踢掉了,结果是什么?整个业务停摆,老板的电话直接打到你手机上,那感觉可不好受。
这就是传统网络架构的“阿喀琉斯之踵”——单点故障。为了解决这个问题,我们通常会采用双机热备或者堆叠技术。但这两者都有各自的“坑”。双机热备(比如VRRP)虽然能实现主备切换,但备机平时是“睡大觉”的,资源浪费严重,而且切换时间通常在秒级,对于一些金融、交易类业务来说,这“一秒”可能就是“一个亿”。堆叠技术呢,是把两台或多台物理交换机虚拟成一台逻辑设备,管理是方便了,但风险也集中了。一旦堆叠分裂,或者主控板故障,整个逻辑设备都可能出问题,搞不好就是“团灭”。
那么,有没有一种技术,既能像堆叠一样让两台设备同时干活、负载分担,又能像双机热备一样故障隔离、快速收敛呢?这就是我们今天要聊的华为M-LAG(Multichassis Link Aggregation Group,跨设备链路聚合组)。你可以把它理解为给下游设备(比如服务器、接入交换机)创造了一个“双胞胎”上游。在下游设备看来,它只是用标准的链路聚合协议(如LACP)连接到了一个“逻辑交换机”上,完全感知不到背后其实是两台独立的物理设备。而对于这两台物理设备来说,它们互为备份,任何一台故障,流量都能在毫秒级内切换到另一台,业务几乎无感知。
我去年帮一个电商客户改造他们的数据中心网络,核心诉求就是“既要高可用,又要高性能,还不能太复杂”。最后就是靠M-LAG方案搞定的。实测下来,切换时间在50毫秒以内,业务流量没有任何中断,客户的技术负责人直呼“真香”。接下来,我就带你从零开始,手把手搭建一个这样的高可用网络。
2. 动手之前:摸清家底与规划蓝图
在开始敲命令之前,准备工作做得好,能省掉后面80%的麻烦。这一步的核心是:设备选型、版本核对、拓扑规划。
2.1 设备与版本:别让兼容性坑了你
M-LAG功能对设备型号和软件版本有严格要求。不是所有华为交换机都支持,也不是所有版本都能互通。根据我的经验,CE系列数据中心交换机是部署M-LAG的主力,比如CE68系列、CE88系列等。我们这次实战就以比较经典的CE6857E-48T6CQ-B作为Spine节点(核心层),用一台S5720S-28P-LI作为Leaf节点(接入层)来模拟下游设备。
版本是关键中的关键! 我强烈建议你登录设备,用 display version 命令仔细核对。我踩过最大的一个坑就是,两台CE6857E,一台是V200R019C10,另一台是V200R020C10,结果M-LAG死活建不起来,各种奇葩报错。后来统一升级到V200R020C10SPC600才解决。所以,请务必确保两台做M-LAG的设备(我们称为Spine-1和Spine-2)软件版本完全一致。接入层设备的版本可以稍有不同,但最好也保持在一个大版本内。
这里给你一个我整理的小表格,方便你快速核对:
| 设备角色 | 推荐型号 | 关键版本要求 | 作用 |
|---|---|---|---|
| M-LAG 主设备 (Spine-1) | 华为 CE6857E-48T6CQ-B | V200R020C10SPC600 | 构成M-LAG双活系统的一端 |
| M-LAG 备设备 (Spine-2) | 华为 CE6857E-48T6CQ-B | 必须与主设备版本一致 | 构成M-LAG双活系统的另一端 |
| 接入设备 (Leaf) | 华为 S5720S-28P-LI | V200R011C10SPC600 | 通过标准Eth-Trunk连接M-LAG系统 |
| 心跳链路 | - | 建议万兆光口 | 用于M-LAG双活检测(DAD) |
| Peer-Link链路 | - | 必须万兆及以上,且至少两条做聚合 | 用于同步表项、备份数据 |
2.2 拓扑与连线:物理连接是基石
规划清晰的拓扑就像建筑的地基。我们这次搭建的是一个最经典、也最实用的双Spine单Leaf模型。别看简单,它已经涵盖了M-LAG的所有核心要素。
-
Peer-Link链路:这是M-LAG的“生命线”。你需要用两条(最少两条,推荐四条)万兆或更高速率的光纤或电缆,将Spine-1和Spine-2直连起来。我习惯用设备最后面的端口,比如Spine-1的
10GE1/0/47和10GE1/0/48,与Spine-2对应的端口相连,并捆绑成Eth-Trunk 0。这条链路的作用极其重要,它负责同步两台设备之间的MAC表、ARP表、以及一些协议状态信息。务必保证这条链路的带宽和可靠性,绝对不能和业务流量共用。 -
心跳链路(DAD链路):这是M-LAG的“心跳检测线”。用于检测对端设备是否存活。你可以单独用一对三层接口(比如
10GE1/0/1和10GE1/0/2)做心跳,也可以利用Peer-Link链路所在的VLAN进行检测(增强模式)。为了最可靠,我们采用独立的三层链路。将Spine-1的10GE1/0/1和10GE1/0/2做成Eth-Trunk 1,与Spine-2的对应端口相连,并配置一个独立的IP地址段,比如10.0.51.0/30。 -
下行链路(M-LAG成员口):这是面向业务的“高速公路”。在Spine-1和Spine-2上,各选一个端口(比如
10GE1/0/13)连接到Leaf交换机(S5720)的两个端口上。在Leaf上,这两个端口会捆绑成一个标准的Eth-Trunk。对于Leaf来说,它觉得自己只是连到了一台“大交换机”的一个聚合口上,完全不知道上游是两台设备。
把这几条线连好,你的物理拓扑就清晰了:一个“倒三角”形状,上面两个点是Spine-1和Spine-2(中间通过Peer-Link和心跳链路紧密相连),下面一个点是Leaf,分别有两根线上连到两个Spine。
3. 核心配置实战:一步步构建双活大脑
好了,线接好了,我们开始给设备注入灵魂。配置顺序很重要,我建议你先配Spine-1,再配Spine-2,最后配Leaf。每配完一部分,记得用 display current-configuration 看看,或者直接 commit 提交。
3.1 Spine-1 配置详解
我们登录Spine-1,进入系统视图开始操作。下面每一条命令,我都会解释它的“江湖地位”。
system-view
sysname Spine-1
首先,给设备起个名字,方便管理。
stp mode rstp
stp v-stp enable
stp bridge-address 1-1-1
生成树协议是必须处理的。M-LAG环境下,我们启用RSTP(快速生成树),并开启V-STP(虚拟生成树)。stp bridge-address 1-1-1 这个命令是关键,它让两台Spine在生成树计算中拥有相同的桥MAC地址,这样下游Leaf就会把它们当成一台设备,从而避免环路。这是M-LAG能实现“单逻辑设备”视图的魔法之一。
ip vpn-instance DAD
ipv4-family
route-distinguisher 1:1
#
创建一个VPN实例,名字叫DAD。这个实例是专门给我们的心跳链路用的,目的是把心跳流量和业务流量彻底隔离,避免相互影响。route-distinguisher 1:1是它的标识符。
dfs-group 1
vlan reserved for main-interface 2 to 3
进入DFS-Group 1(动态故障切换组),这是M-LAG的逻辑组。vlan reserved for main-interface 2 to 3 这条命令是个版本依赖的坑点!在我用的这个V200R020C10版本上,必须配置这个,否则后面的三层Eth-Trunk口(我们的心跳口)会起不来。它大概是告诉系统为某些内部接口预留VLAN资源。如果你在别的版本上看到类似问题,可以查查手册,这条命令可能就是钥匙。
interface Eth-Trunk1
description DAD_Link
trunkport 10GE1/0/1
trunkport 10GE1/0/2
undo portswitch
ip binding vpn-instance DAD
ip address 10.0.51.1 255.255.255.252
mode lacp-static
m-lag unpaired-port reserved
配置心跳链路接口。undo portswitch是把端口从二层模式切换到三层模式。ip binding vpn-instance DAD 把接口绑定到刚才创建的DAD VPN实例。m-lag unpaired-port reserved 标记这个Eth-Trunk为M-LAG的“非配对端口保留接口”,专门用于双活检测。
dfs-group 1
priority 150
dual-active detection enhanced enable source ip 10.0.51.1 vpn-instance DAD peer 10.0.51.2 authentication-mode hmac-sha256 password dfs-group@M-LAG
在DFS-Group下,设置本设备优先级为150(数字越大优先级越高,越容易成为Master)。然后启用增强型双活检测,指定用自己的IP10.0.51.1,在DAD实例内,去ping对端的10.0.51.2。还加了HMAC-SHA256的认证和密码,防止非法设备冒充对端,这是生产环境的安全必备项。
interface Eth-Trunk0
description Peer_Link
trunkport 10GE1/0/47
trunkport 10GE1/0/48
mode lacp-static
peer-link 1
port vlan exclude 1
配置Peer-Link。peer-link 1 是核心命令,宣告这个Eth-Trunk为M-LAG的Peer-Link。port vlan exclude 1 是为了避免VLAN 1的流量从Peer-Link通过,通常VLAN 1作为管理VLAN,我们不想让它占用宝贵的Peer-Link带宽。
interface eth-trunk 13
description To_Leaf
trunkport 10GE1/0/13
port link-type trunk
undo port trunk allow-pass vlan 1
port trunk allow-pass vlan 100
mode lacp-static
dfs-group 1 m-lag 1
配置下行连接到Leaf的M-LAG成员口。dfs-group 1 m-lag 1 是点睛之笔,它把这个Eth-Trunk 13加入到DFS-Group 1的M-LAG组1中。对端的Spine-2上也需要有一个接口加入同一个M-LAG组(比如也是m-lag 1),这样它们俩在Leaf看来就是一个聚合组。
vlan batch 100
interface Vlanif100
ip address 10.1.100.1 255.255.255.0
mac-address 3cc7-8618-382c
创建业务VLAN 100,并配置其三层接口地址。注意这里的MAC地址 3cc7-8618-382c,它需要手动指定,并且必须与Spine-2上Vlanif100的MAC地址配置为完全相同。这是因为对于下游设备,两个Spine的VLANIF接口应该呈现为同一个网关,拥有相同的IP和MAC地址,否则ARP学习会出问题。
最后,commit提交配置,save保存。
3.2 Spine-2 配置要点
Spine-2的配置和Spine-1高度对称,但有几个关键区别点,我挑出来说:
sysname Spine-2
...
dfs-group 1
priority 100 # 优先级低于Spine-1,默认会成为Backup
...
interface Eth-Trunk1
ip address 10.0.51.2 255.255.255.252 # IP地址不同
...
interface Vlanif100
ip address 10.1.100.1 255.255.255.0 # **IP地址和Spine-1一模一样!**
mac-address 3cc7-8618-382c # **MAC地址也必须一模一样!**
最大的不同就是IP地址和优先级。心跳链路的IP不同,但业务网关的IP和MAC必须完全相同。优先级这里我设了100,比Spine-1的150低,所以正常情况下Spine-1会是Master,Spine-2是Backup。Master设备通常负责处理协议报文的应答(比如ARP请求)。
3.3 Leaf交换机配置:标准的聚合
Leaf交换机的配置就非常简单了,因为它根本不知道M-LAG的存在,它只是在做最标准的链路聚合。
system-view
sysname Leaf
vlan batch 100
interface Vlanif100
ip address 10.1.100.100 255.255.255.0
#
interface Eth-Trunk0
description To_M-LAG_Spine
trunkport GigabitEthernet 0/0/13
trunkport GigabitEthernet 0/0/14
port link-type trunk
undo port trunk allow-pass vlan 1
port trunk allow-pass vlan 100
mode lacp
#
interface GigabitEthernet 0/0/20
description To_PC
port link-type access
port default vlan 100
看,在Leaf上,就是把连向两个Spine的物理端口G0/0/13和G0/0/14,用标准的mode lacp模式捆绑成了Eth-Trunk0。它通过LACP协议,只会看到一个“对端系统”,这个系统就是由两台Spine共同伪装而成的。配置一个接入端口连PC,整个配置就完成了,清爽无比。
4. 验证与排错:眼见为实,心中有底
配置敲完了,千万别以为就万事大吉。验证环节和排错能力,才是区分新手和老鸟的关键。下面这几招,是我每次上线必做的检查。
4.1 基础连通性检查
首先,在Spine-1上,ping一下Spine-2的心跳地址,确保DAD链路是通的。
[Spine-1] ping -vpn-instance DAD 10.0.51.2
如果能通,说明三层心跳链路基础网络没问题。如果不通,回去检查物理连线、接口物理状态(display interface brief)、IP地址和VPN实例绑定。
4.2 M-LAG状态核查
这是最核心的检查。在任意一台Spine上执行:
[Spine-1] display dfs-group 1 m-lag
你会看到类似下面的输出:
DFS Group ID: 1
Local Role: Master (priority 150)
Peer Role: Backup (priority 100)
M-LAG Status: Active
Peer Link Status: Up
DAD Status: Normal
... (后面会列出所有M-LAG接口的状态)
重点关注这几项:
- Local Role/Peer Role:确认主备角色符合你的预期(Spine-1是Master)。
- M-LAG Status:必须是 Active,如果是Inactive,说明M-LAG协商失败。
- Peer Link Status:必须是 Up。如果是Down,M-LAG会进入双主(Dual-Active)分裂状态,非常危险,需要立即检查Peer-Link的物理链路和聚合口配置。
- DAD Status:必须是 Normal。如果是Timeout,说明心跳检测失败。
4.3 流量切换测试(破坏性测试)
理论再好,不如一次实际的故障模拟。这是上线前必须做的测试。
-
链路故障测试:在Leaf交换机后面的PC上,持续ping业务网关
10.1.100.1(ping 10.1.100.1 -t)。然后,模拟Spine-1连接Leaf的链路故障,比如在Spine-1上把10GE1/0/13端口shutdown。观察ping的延时和丢包。在M-LAG正常工作的情况下,你应该只会看到1-3个包的丢失,或者延时轻微抖动一下(毫秒级),然后立即恢复。 这是因为流量瞬间切换到了Spine-2上。 -
设备故障测试:同样在持续ping的情况下,直接给Spine-1设备断电(或者重启)。这次切换时间会比链路切换稍长一点,因为对端设备需要检测到心跳超时(默认是3.5秒)才会判定主设备故障,然后备设备升主。但整个过程也应该在秒级内完成,业务感知明显但可接受。
-
Peer-Link故障测试(谨慎操作!):这是最极端的情况。在业务运行时,手动
shutdown掉Peer-Link(Eth-Trunk0)。此时,M-LAG的双活检测机制(DAD)必须立刻发挥作用,通过独立的心跳链路判断对端是否存活。如果DAD工作正常,其中一台设备(通常是原Backup)会主动关闭自己的M-LAG成员端口,避免形成环路和双主冲突。这个测试能最有效地验证你的DAD配置是否正确、可靠。做这个测试时,一定要有业务中断的心理准备,并准备好回退方案。
4.4 常见坑点与排错思路
- M-LAG状态一直Inactive:首先检查Peer-Link是否Up,两端的
dfs-group和m-lag配置编号是否一致。然后检查STP配置,特别是stp bridge-address是否相同。 - 心跳ping不通:检查
interface Eth-Trunk1是否绑定了正确的VPN实例,两端的IP是否在同一网段,物理端口是否都加入了Eth-Trunk且物理状态Up。 - 下行Leaf无法学到网关MAC:检查两台Spine上
Vlanif100的IP和MAC地址是否强制配置为完全相同。这是最容易忽略的一点。 - 版本兼容性问题:如果所有配置看起来都对,但就是不行,首先怀疑版本。去官网查M-LAG特性配套表,确认你的设备型号和软件版本组合是否被官方支持。
配置M-LAG就像搭积木,每一步都要严丝合缝。第一次配可能会觉得命令有点多,但一旦你成功跑起来,看到流量平稳地在两台设备间分担和切换,那种成就感是非常足的。这套配置模板我已经在好几个中小型数据中心用过,稳定性都没得说。如果你在配置过程中遇到了上面没提到的问题,欢迎随时交流,很多时候可能就是一个小参数的区别。网络这东西,细节决定成败,多动手试试,印象才深刻。
517



被折叠的 条评论
为什么被折叠?



