M-LAG这个词,搞网络的老哥们肯定不陌生。数据中心里最怕的就是单点故障,服务器双上联是标配,但传统STP会把其中一条上联堵掉,冗余倒是有了,带宽白白浪费,故障切换还得看STP脸色。M-LAG(Multichassis Link Aggregation Group,跨设备链路聚合)就是干这个的:把两台设备伪装成一台,让对端交换机的双上联同时转发流量。HCL模拟器里能把这套机制完整跑起来,这篇文章我就拿HCL里的S6850,把M-LAG从原理到配置再到故障演练,完整过一遍。
1. M-LAG到底解决什么问题
1.1 先看传统双上联的尴尬
很多刚入行的兄弟做双上联冗余,第一反应是“两根线接两台设备不就行了”。物理上确实没有单点了,但二层环路必须用STP去破,结果就是其中一根线被阻塞,平时压根不跑业务流量。带宽白白浪费,故障切换还得靠STP收敛,几秒甚至几十秒的延迟,对数据库、存储这类对丢包敏感的业务完全不能忍。
有个老工程师总结得很到位:双上联要是没有M-LAG,就是“冗余在线、流量不通”。普通用户可能觉得只要能通就行,但网络工程师得为“通得好不好、快不快、稳不稳”负责。STP能解决环路,却解决不了“两条上行同时跑流量”这个核心诉求。
1.2 M-LAG的核心思路
M-LAG的核心思路很简单:两台物理设备通过peer-link和keepalive链路构成一个M-LAG系统,对外呈现为一台逻辑设备。接入交换机或服务器的两条上联链路,会被识别为同一个聚合组里的两条成员口,于是:
- 两条链路都处于转发状态,可以做负载均衡
- 一条链路或一台设备故障,流量自动收敛到另一侧,秒级甚至亚秒级切换
- 对端接入设备眼里,它面对的就是一台设备、一个聚合口,完全不感知跨设备的存在,自然也不会触发STP重计算
这里有个关键点:M-LAG并不是把两台设备变成一台,而是“对外像一台,对内各自独立”。两台设备的控制平面还是分开的,这点和堆叠有本质区别。
1.3 为什么不用堆叠(IRF)
做跨设备链路聚合,很多人第一反应是用堆叠。堆叠确实能解决,但有两个痛点天然存在:
第一,控制面耦合。堆叠系统里主设备和备设备控制面是同步的,一台设备升级往往影响整个堆叠系统,故障域太大。第二,堆叠链路要求高。堆叠口需要高带宽、低延迟,而且堆叠分裂后处理逻辑复杂,处理不好就是脑裂双活。
M-LAG就不一样,两台设备控制面完全独立,peer-link断了最多影响跨设备表项同步,不会把另一台设备拉下水。故障隔离性好,部署位置也更灵活,两台设备可以不在同一个机柜,甚至跨楼宇部署。所以对不想上堆叠、又想拿双活聚合收益的场景,M-LAG明显更合适。
1.4 M-LAG的几个关键组件
- Peer-link:两台设备之间的互联链路,负责跨设备流量转发和表项同步,一般用聚合口承载
- Keepalive链路:双活检测(DAD,Dual Active Detection)专用通道,peer-link断了之后靠它判断对端是否还活着
- M-LAG group:业务侧聚合口,在两端设备上加入同一个组号,呈现为同一个逻辑口
- 双活网关:两台设备的三层虚接口配相同IP,对终端呈现为一个网关
这四个组件缺一不可。peer-link承载数据,keepalive承载检测,M-LAG group承载业务,双活网关承载三层转发。理解清楚这四个角色,后面配置就不会乱。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. HCL实验环境准备
2.1 HCL模拟器怎么选、怎么装
HCL(H3C Cloud Lab)是H3C官方的图形化网络模拟器,底层基于VirtualBox运行。做M-LAG实验,版本建议选3.0.1及以上,设备库里带S6850,这个型号支持M-LAG功能。老版本HCL自带的主要是MSR路由器和S5820V2交换机,想跑M-LAG会比较吃力。
安装时需要注意几个常见坑:
- VirtualBox版本别太新,HCL官方文档一般建议5.2.x,新版本兼容性反而容易出问题
- 安装HCL时最好以管理员身份运行,否则后面创建设备、启动设备容易报权限错误
- 安装路径不要带中文和空格,HCL对路径中的特殊字符支持很差
- 设备启动失败,多半是CPU虚拟化没开、内存不足,或者VirtualBox与HCL版本不匹配
2.2 实验拓扑
我这里规划了四台设备:
- Device A(S6850,M-LAG成员1)
- Device B(S6850,M-LAG成员2)
- Access(S6850,模拟接入交换机)
- Host(MSR36-20,模拟终端主机/服务器)
拓扑关系如下:
- Device A和Device B之间两条直连:G1/0/1和G1/0/2组成peer-link聚合组;G1/0/4作为keepalive链路
- Access的G1/0/1连Device A的G1/0/5,Access的G1/0/2连Device B的G1/0/5,也就是接入双上联
- Host终端连在Access上,业务划分到VLAN 10
具体规划表:
| 设备 | 角色 | 关键接口 | 说明 |
|---|---|---|---|
| Device A | M-LAG成员1 | G1/0/1-G1/0/2 peer-link成员;G1/0/4 keepalive;G1/0/5业务聚合成员 | system-number 1 |
| Device B | M-LAG成员2 | G1/0/1-G1/0/2 peer-link成员;G1/0/4 keepalive;G1/0/5业务聚合成员 | system-number 2 |
| Access | 接入交换机 | G1/0/1、G1/0/2做动态聚合 | 双上联到M-LAG系统 |
| Host | 终端 | - | 192.168.10.100/24,网关192.168.10.1 |
VLAN规划上,VLAN 10作为业务VLAN,peer-link放通所有VLAN,Vlan-interface10的IP是192.168.10.1/24,两台设备都配。
2.3 模拟器里连线
HCL里连线时注意几个细节:
- peer-link要连两条线,Device A的G1/0/1连Device B的G1/0/1,A的G1/0/2连B的G1/0/2,这样两条物理线才能进入同一个聚合组
- keepalive链路走G1/0/4,保持独立链路,不要和peer-link混在一起
- 接入交换机的两条上联分别连到两台设备的G1/0/5,形成业务双上联
设备启动顺序也有讲究。先把四台设备全部点启动,等设备状态稳定了再开始配置。HCL里设备启动一般需要几十秒,别着急,看到命令行能敲了再操作。如果某台设备启动失败,通常和VirtualBox环境有关,后面第6章细说。
3. 基础配置:把两台设备变成一套系统
3.1 Device A配置
登录Device A,按顺序配置。先配置peer-link聚合口:
bash复制interface Bridge-Aggregation4094
link-aggregation mode dynamic
m-lag peer-link
port link-type trunk
port trunk permit vlan all
然后把两个物理口加入聚合组:
bash复制interface GigabitEthernet1/0/1
port link-aggregation group 4094
interface GigabitEthernet1/0/2
port link-aggregation group 4094
接着配置keepalive链路:
bash复制interface GigabitEthernet1/0/4
ip address 10.0.0.1 255.255.255.0
再配置M-LAG系统参数:
bash复制m-lag system-number 1
m-lag system-mac 0000-fc00-0001
m-lag keepalive ip destination 10.0.0.2 source 10.0.0.1
这里有三个参数必须理解清楚:
system-number:本端在M-LAG系统里的成员编号,两台设备必须不同,否则协商失败system-mac:整个M-LAG系统对外呈现的MAC地址,两台设备必须相同,这是对端交换机识别“同一台设备”的关键keepalive:源地址是本端keepalive口IP,目的地址是对端keepalive口IP,DAD检测报文就是靠这个IP对发探测的
3.2 Device B配置
Device B的配置和A对称,注意system-number改成2,keepalive的源目IP反过来:
bash复制interface Bridge-Aggregation4094
link-aggregation mode dynamic
m-lag peer-link
port link-type trunk
port trunk permit vlan all
interface GigabitEthernet1/0/1
port link-aggregation group 4094
interface GigabitEthernet1/0/2
port link-aggregation group 4094
interface GigabitEthernet1/0/4
ip address 10.0.0.2 255.255.255.0
m-lag system-number 2
m-lag system-mac 0000-fc00-0001
m-lag keepalive ip destination 10.0.0.1 source 10.0.0.2
配置完成后,可以先看一眼M-LAG状态:
bash复制display m-lag summary
如果看到M-LAG状态为up、peer-link状态为up,说明两台设备已经成功协商成一套系统了。如果状态不对,先别急着往下配业务,回头检查前面的参数。
3.3 配置顺序的心得
实际操作中,我习惯先把peer-link和keepalive配好,最后再配M-LAG系统参数。因为M-LAG系统参数一旦生效,设备就开始跑协议了,前面链路没准备好容易出各种中间态,排查起来反而麻烦。
真实设备上建议严格按这个顺序:
- 物理接口加聚合组,保证peer-link的聚合口先up
- 配keepalive接口IP,保证DAD探测通道通
- 配M-LAG系统参数,让两台设备协商成一套系统
- 最后再上业务聚合口,接业务流量
每个环节验证通过再往下走,这是避免“配置一时爽,排障两行泪”的最好办法。
另外提醒一句,peer-link聚合口建议改成动态模式,也就是LACP模式。M-LAG的跨设备协商本质上是基于LACP的,静态聚合在某些版本上能配,但表现不稳定,遇到状态不对先检查这个点。
4. 业务侧配置:双活网关与双上联
4.1 M-LAG设备上的业务聚合口
业务聚合口就是接接入交换机那条链路绑定的聚合口。在Device A和Device B上各配置一个Bridge-Aggregation10,绑定到同一个M-LAG group。
Device A:
bash复制interface Bridge-Aggregation10
link-aggregation mode dynamic
m-lag group 10
port link-type trunk
port trunk permit vlan 10
interface GigabitEthernet1/0/5
port link-aggregation group 10
Device B:
bash复制interface Bridge-Aggregation10
link-aggregation mode dynamic
m-lag group 10
port link-type trunk
port trunk permit vlan 10
interface GigabitEthernet1/0/5
port link-aggregation group 10
这里比较容易踩坑的是:两台设备上业务聚合口的编号不强制一样,但m-lag group的组号必须一致。这个组号才是M-LAG系统识别同一个逻辑聚合口的依据。如果两边组号对不上,对端接入交换机收到的LACP信息还是两个独立系统,没法聚合成功。
4.2 配置双活网关
M-LAG的双活网关做法,是两台设备的三层虚接口配相同的IP:
Device A:
bash复制interface Vlan-interface10
ip address 192.168.10.1 255.255.255.0
Device B:
bash复制interface Vlan-interface10
ip address 192.168.10.1 255.255.255.0
配完以后,终端的网关指向192.168.10.1,无论流量从哪台设备进来,都能正常三层转发。可能有兄弟会问,两个接口配同一IP不冲突吗?在M-LAG系统里,这个IP属于整个M-LAG系统,两台设备作为同一个逻辑设备对外提供服务,所以不会冲突。
这个机制的好处很明显:网关不用靠VRRP主备抢来抢去,两台设备都能转发三层流量,真正意义上的“双活”。生产环境里如果不需要双活,也可以只在主设备上配网关,但M-LAG的价值就只发挥了一半。
4.3 接入交换机配置
Access交换机上做动态聚合,让两条上联成为一个聚合口:
bash复制interface Bridge-Aggregation1
link-aggregation mode dynamic
port link-type trunk
port trunk permit vlan 10
interface GigabitEthernet1/0/1
port link-aggregation group 1
interface GigabitEthernet1/0/2
port link-aggregation group 1
接入交换机完全不需要知道对端是M-LAG系统。它看到的只是对端LACP system-id相同,认为就是一台设备,于是把两个成员口都放通成聚合成员。这正是M-LAG“对端无感知”的核心价值。
验证接入侧聚合状态:
bash复制display link-aggregation verbose
如果成员口状态都是Selected,说明M-LAG系统已经正常工作了,两条上联都在跑流量。
5. 功能验证与故障演练
5.1 查看关键状态
配置完成不等于配置正确。我每次配完M-LAG,都会按下面这组命令逐个确认:
bash复制display m-lag summary
display m-lag verbose
display link-aggregation verbose
display m-lag consistency
几个关键状态值要记牢:
- M-LAG状态:up,表示系统级协商正常
- Peer-link状态:up,表示跨设备互联链路通
- Keepalive状态:up,表示DAD探测通道正常
- 业务聚合口成员状态:Selected,表示这个成员口正在转发流量
display m-lag consistency这条命令特别实用,它会检查两台设备的配置一致性,比如VLAN划分、聚合口类型、允许列表等。只要提示有不一致项,业务肯定会有隐患,最好当场解决。
5.2 单台设备故障切换测试
配置验证通过后,我习惯做一次故障演练。在HCL里打开Host的命令行,先Ping网关192.168.10.1,ping通之后,直接把Device B关机。
正常情况下观察到的现象是:
- Host ping网关几乎无感知,丢包为0或者极少
- 如果只断Device B的业务口而不断peer-link和keepalive,流量会正常通过peer-link绕到Device A转发,也是无损
- 如果直接把Device B整台设备down掉,Access交换机会发现LACP对端少了一个成员,快速把流量全部转到Device A,切换速度远比STP快
这个测试建议做两次,一次断链路,一次断设备,两种故障的切换路径不一样。断链路考验的是peer-link冗余和聚合重协商,断设备考验的是整个M-LAG系统的故障隔离和快速收敛能力。
5.3 恢复与回切
恢复Device B后,观察M-LAG状态是否自动回到up,成员口是否重新加入聚合。正常情况下整个过程不需要人工干预,这就是M-LAG的自动恢复能力。
如果发现Device B恢复后M-LAG起不来,最常见的问题是对端Access上还残留着旧的LACP状态。解决办法很简单,在Access上把对应物理口shutdown再undo shutdown,让协议重新协商一遍。
还有一个细节:回切过程中业务会有极短暂的切换,如果遇到对丢包极度敏感的业务,生产环境建议维护窗口操作,别在业务高峰期做这种演练。
6. 常见问题与踩坑记录
6.1 HCL模拟器设备启动失败
这个确实太常见了,HCL模拟器设备启动失败是新手最头疼的问题,但原因其实非常集中:
- VirtualBox版本和HCL不兼容,HCL 3.0.1对VirtualBox 5.2.x支持最稳
- 电脑没开启CPU虚拟化,BIOS里要开Intel VT-x或AMD-V
- 内存不够,HCL至少要预留4GB给虚拟机跑设备镜像
- 安装路径带中文或特殊字符,HCL对路径解析很敏感
排查顺序建议这样:
- 确认BIOS虚拟化开启,任务管理器-性能里能看到虚拟化状态
- 卸载不兼容的VirtualBox,装回5.2.22
- 右键HCL图标以管理员身份运行
- 卸载HCL,清理安装目录和配置文件后重装
按这个顺序走,绝大多数启动失败都能解决。需要注意HCL装好后不要频繁切换VirtualBox版本,我见过不少人是自己折腾VirtualBox升级把HCL搞挂的。
6.2 M-LAG状态起不来
display m-lag summary看到的不是up,先检查这五个点:
- system-mac是否一致,这个最容易打错,01和fc看走眼很常见
- system-number是否不同,两台设备不能用同一个编号
- keepalive链路IP是否可达,设备上直接ping对端keepalive IP试一下
- peer-link两端是否都是trunk并放通了所有VLAN
- peer-link聚合口是否处于动态模式
我用display m-lag keepalive查DAD报文收发情况时,见过一种情况:keepalive接口配了IP,路由也可达,但keepalive一直显示down,最后发现是peer-link的VLAN放通列表把keepalive的报文影响到了。模拟器里这个现象不常见,真机上如果keepalive走带外网络,基本不会出这种问题。
6.3 接入双上联只up一条
这个现象非常典型:Access交换机上聚合口有一个成员是Selected,另一个是Unselected。
原因基本都在M-LAG设备侧:
- 两侧业务聚合口的VLAN允许列表不一致
- 一侧是access口,一侧是trunk口
- m-lag group组号不一致
- 物理口还没加入聚合口,或者加入了错误的聚合口
还有一种隐藏原因:成员口的默认配置没清。比如G1/0/5之前配过access vlan 1,后面直接加聚合口,虽然LACP协商能起来,但对端可能识别异常,导致只有一个成员up。
所以配业务聚合口之前,先把对应物理口清干净:
bash复制interface GigabitEthernet1/0/5
undo port link-type
undo port access vlan
6.4 模拟器和真实设备的差异
HCL模拟M-LAG已经很接近真机,但有几个差异要心里有数:
- 模拟器无法完全模拟转发面性能,M-LAG负载均衡效果只能看状态,没法真实压测
- HCL里个别display命令显示的信息可能比真机精简,比如M-LAG一致性检查在某些版本上不完整
- 不同版本的S6850镜像,M-LAG配置命令有细微差别,建议以设备自带的release notes为准
真实设备上还要额外规划peer-link带宽,peer-link同时承担跨设备流量和表项同步,带宽规划不合理会成为瓶颈。keepalive链路生产上建议走独立带外网络,虽然原理上走业务网也能通,但带外网络更可靠,避免业务链路全断后DAD也失效的极端场景。
说实话,M-LAG这套东西,配置命令就那么几条,重点全在故障模型的理解上。peer-link断了怎么办,keepalive断了怎么办,两边都活着会不会脑裂?这些场景反复想明白了,去真机上做部署心里才有底。在HCL里把断链路、断设备、断keepalive三种情况各演练一遍,比背十遍命令有用得多。
最后提一个实用小技巧:实验中出现各种奇怪现象,如果排查半小时没头绪,先把所有设备重启一遍,回到干净状态再重新配置,很多时候能省下大量时间。M-LAG这种有状态协议,状态机比命令本身重要,会用display命令盯状态,才是工程师真正要练的基本功。
