1. 先把场景说清楚:为什么非要做设备级虚拟化
做园区网和中小数据中心的朋友,大概率都遇到过这种局面:接入层两台交换机,一台跑业务、一台纯待机,服务器双网卡插上去,一条链路亮着,另一条挂在备机上吃灰。业务量一上来,主用设备端口跑满,备机CPU利用率还不到5%,采购花了两份钱,只用出一份力。后来大家想明白了,问题不在设备,而在"双机主备"这个结构本身——它天然浪费一半转发能力,还带来一个更头疼的东西:二层环路和协议收敛时间。生成树协议能兜底,但收敛动辄几十秒,业务侧感知就是一次抖动,语音掉话、视频卡顿、数据库连接超时。
要解决这个矛盾,行业里长期并存两条路:一条是把两台物理设备在逻辑上"焊"成一台,对外只暴露一个管理面和一个转发面,这就是VSU(Virtual Switching Unit,虚拟交换单元)这类设备级虚拟化技术,不同厂商叫法不同,堆叠、IRF、CSS说的都是同一个思路;另一条是两台设备各自保留独立的控制平面,只在下游接入侧做跨设备链路聚合,让一台服务器或一台交换机同时上联两台设备,这条路线就是M-LAG(Multi-Chassis Link Aggregation Group)。这两套东西看着目标一致——都想要"双活+无环+快收敛",但内部机理、故障行为、运维成本差得很远,选错了后面全是坑。
这篇内容不打算写成产品手册的复述,而是按我在实际项目里的理解,把VSU和M-LAG的控制面、数据面、故障域、双主防护、升级路径逐项拆开讲清楚,再给一套能直接照着搭的配置思路和验收清单。适合正在做接入/汇聚层选型的人、手里已经有一批设备要做双机改造的人,以及被"双主"问题坑过的运维同学。不管你是刚接触设备虚拟化,还是已经配过几套但没想明白为什么这么设计,下面这些内容应该都能对上你的场景。
2. VSU到底是什么:控制面合并、数据面双活
2.1 角色选举与主备切换的关键参数
VSU的本质是把两台物理设备的控制平面合并成一个。两台设备之间用一条(通常是一组)专用的VSU链路互联,链路两端的端口被划进同一个逻辑通道,物理上跑的是内部私有协议,用来同步配置、表项和状态。合并之后,对外只呈现一个管理IP、一套路由进程、一份配置文件,管理员的视角里这就是一台设备。
合并完成的一瞬间,两台设备要选出主备。选举规则各家略有差异,但核心因子就那么几个:优先级(priority)、设备MAC地址、运行时长。优先级数值越大越优先,优先级相同就比MAC,MAC小的赢。所以规划阶段第一件事就是把优先级显式写死,别让设备靠MAC随机决定——我见过一次机房搬迁,两台设备上电顺序变了,优先级没配,结果主备角色互换,管理IP漂到了另一台设备上,监控系统一片告警,排查了快一个小时才发现是选举问题。
角色确定后,主设备负责跑全部控制协议、下发配置、对外呈现管理面;备设备处于热待命状态,控制面不对外工作,但数据面是活的,它的业务口照常转发流量。这是VSU和传统主备最本质的区别:备机不是废物,它是"没有大脑但有手脚"的转发单元。跨设备聚合链路(Eth-Trunk/AP)同时横跨两台设备,下行流量从两台设备并行发出,上行流量按哈希分摊,带宽利用率能到接近100%。
主备切换发生在主设备整机故障、VSU链路故障、或者手动切换时。切换时备机接管控制面,已经同步过来的表项继续用,业务侧感知通常是秒级甚至亚秒级。但这里有个前提:表项必须是实时同步的。如果配置里开了大量动态表项但同步通道带宽不够,切换后会出现短暂的ARP/MAC泛洪,收敛时间会被拉长。所以VSU链路我一般建议至少两个万兆口做聚合,别用千兆凑数。
2.2 双主检测:MAD的三种方式与选择逻辑
VSU最危险的故障不是一台设备挂掉,而是VSU链路断了但两台设备都活着。这时候两边都认为对方死了,都把自己升成主设备,都拿着同一个管理IP、同一份配置对外工作——这就是双主(Split Brain)。后果非常直接:两个设备同时响应同一个网关IP,下游设备的ARP表一会儿指向A一会儿指向B,流量乱窜;如果跑的是路由协议,两边都对外宣告同一网段,上游直接被搞晕。这种故障比单台宕机严重得多,因为它不是"少了一半能力",而是"产生了两个互相打架的真相"。
所以VSU必须配MAD(Multi-Active Detection,多主检测)。原理不复杂:除了VSU链路之外,再找一条独立通道,让两台设备互相"报活"。一旦VSU链路断了,两台设备通过这条独立通道发现对方还活着,就按预设策略处理——通常是一台保持Active,另一台进入Recovery状态,把业务口全部shutdown,只留管理口,避免继续对外制造混乱。
常见的检测方式有三种,选择逻辑得看现场条件:
| 检测方式 | 实现路径 | 优点 | 限制与适用场景 |
|---|---|---|---|
| 直连检测 | 两台设备之间单独拉一根线,跑检测协议 | 独立性强,不依赖上游设备 | 需要额外占用端口和纤芯,适合两台设备同机柜/相邻机柜 |
| 聚合口检测 | 借助下游或上游的跨设备聚合链路发检测报文 | 不额外占端口 | 依赖聚合链路本身健康,聚合断了检测也失效 |
| 第三方设备代理检测 | 通过一台中间设备(通常是上游网关)转发检测报文 | 节省直连纤芯 | 依赖中间设备配置正确,中间设备故障会导致误判 |
我自己的默认选择是直连检测,哪怕多占两个千兆口也认。原因很实在:聚合口检测在"聚合链路和VSU链路同时故障"的场景下会失效,而这个场景恰恰是机房施工最容易发生的——比如一次割接把一束光缆同时踢掉。第三方代理检测则多了一个依赖点,中间设备的ACL、路由、协议版本任何一处不对,检测就静默失败,而且失败时你是不知道的,等到真出双主才发现检测从来没通过。直连检测虽然土,但它把依赖收敛到了"一根线"上,可控性最高。
配置MAD时有个细节容易被忽略:检测报文的发送周期和超时次数。周期设太短,链路轻微抖动就触发误判,把备机打成Recovery;周期设太长,真断了要等很久才收敛。常规做法是3个报文周期、3次超时,总检测时间控制在秒级。改这个参数前一定要确认业务侧能接受多大的中断窗口,别为了"快"把稳定性搭进去。
2.3 VSU的收益与代价清单
先把好处摆清楚,这些是VSU真正打动人的地方。第一是拓扑简化。两台设备变一台,原本需要跑生成树的三条链路(两台设备之间一条、每台上联一条)现在变成一条跨设备聚合,逻辑上无环,生成树可以直接不参与转发,收敛时间从几十秒压到毫秒级。第二是带宽利用。跨设备聚合把两台设备的上下行带宽合并,服务器双网卡可以同时工作,不用再配主备绑定模式。第三是管理收敛。一个IP、一份配置、一次下发,不用对着两台设备反复核对差异——这一点在设备数量上来之后价值极高,配置漂移是运维事故的主要来源之一。
代价同样明确,而且很多是上线之后才体会到的。控制面只有一份,备机的CPU和内存基本闲置,这是结构性浪费,改不了。故障域被放大了:合并之后任何一台设备的控制面异常,都可能影响整个虚拟单元,比如备机反复重启导致VSU链路震荡,主机也会跟着抖。升级窗口很硬:传统VSU升级要整机重启,两台一起重启意味着整段业务中断;部分型号支持ISSU(不中断业务升级),但对版本跨度、补丁基线、业务特性有严格要求,不是任意两个版本都能平滑过去。双主风险始终存在,只要MAD配置有疏漏或者检测链路出问题,就可能分裂。
所以VSU的适用边界其实很清晰:接入层、汇聚层、对管理简洁度要求高、单点故障可接受秒级中断的场景,它是最优解。放到核心层就要慎之又慎,尤其是承载东西向大流量的数据中心,一旦双主,影响面太大。
3. M-LAG:不合并控制面的另一种双活
3.1 peer-link与双归接入的工作流程
M-LAG走的是完全相反的思路:两台设备谁也不吞并谁,各自保留独立的控制平面、独立的管理IP、独立的配置文件,只在数据转发层面做配合。两台设备之间有一条peer-link,这条链路不承载普通业务流量(或者只承载特定流量),主要作用是同步MAC表、ARP表、ND表这类转发表项,以及传递协议报文。除此之外还有一条独立的心跳链路(keepalive),专门用来做双主防护——注意,peer-link和心跳是两条不同的链路,很多新手会把它俩合成一条,这是个典型隐患,后面会细说。
下游设备(服务器、接入交换机)通过跨设备聚合同时上联两台设备。对下游来说,这是一个普通的聚合口,它不知道对面是两台设备;对两台设备来说,这个聚合口的成员口分属自己和对端。当一个报文从下游上来,落到设备A的成员口,设备A查表发现目的MAC在设备B侧,就通过peer-link把报文转给设备B发出去——这就是跨设备转发。为了减少peer-link压力,M-LAG通常实现本地优先转发:能本地出的流量绝不绕道peer-link。这个优化很关键,否则peer-link会被横向流量打满,成为新的瓶颈。
在控制协议层面,两台设备要互相"认识"并协商出一个虚拟的聚合身份,这中间跑的是厂商私有的跨设备通信协议(有的叫ICC,有的叫DF协议)。协议负责同步聚合口状态、协商主备角色(用于处理部分只能单边生效的协议)、同步表项。这套机制比VSU的"合并控制面"轻得多,但也意味着配置要在两台设备上分别做,而且必须保证两边参数严格对称——聚合口ID、成员口、LACP模式、VLAN放行列表,任何一处不一致,聚合口就起不来或者只起一半。
3.2 与VSU的逐项对比
两者放在一张表里对比最直观,这张表我在选型会上用过很多次,基本能覆盖八成决策点:
| 对比维度 | VSU | M-LAG |
|---|---|---|
| 控制平面 | 合并为一份,主备 | 各自独立,双主控 |
| 管理方式 | 单一管理IP、单一配置文件 | 两个管理IP、两份配置,需人工保证对称 |
| 表项同步 | 内部私有通道同步,实时性高 | 通过peer-link同步,依赖链路带宽和稳定性 |
| 设备升级 | 通常整机重启,部分支持ISSU | 可单台轮流升级,业务中断窗口极小 |
| 故障域 | 较大,一台异常可能波及整体 | 较小,单台故障只影响本机转发 |
| 双主防护 | MAD多主检测 | keepalive心跳 + peer-link状态判断 |
| 带宽利用率 | 双活,接近100% | 双活,本地优先转发,接近100% |
| 配置复杂度 | 低,一次下发 | 高,两台对称配置 |
| 排障难度 | 相对简单,视角统一 | 较高,需要同时看两台设备的状态 |
| 典型位置 | 接入层、汇聚层 | 汇聚层、核心层、数据中心叶层 |
从表里能看出一个规律:VSU是用管理简洁换故障域,M-LAG是用配置复杂度换故障隔离。这不是谁优谁劣,是权衡取舍。
3.3 什么场景该选哪一个
选型我一般按三个问题走。第一个问题:这段网络能不能接受整机重启级别的中断?如果答案是"不能",直接排除传统VSU,走M-LAG或者支持ISSU的VSU。核心层、金融交易区、医院HIS系统的汇聚层,基本都是这个答案。
第二个问题:运维团队有几个人、配置变更频率多高?如果只有一两个人管几百台设备,VSU的单点管理优势是压倒性的,M-LAG的双份配置在这种人力条件下迟早出配置漂移。反过来,如果团队分工明确、有配置管理工具做自动化下发,M-LAG的复杂度是可以被工具吃掉的。
第三个问题:故障域能容忍多大?一台设备出问题,你希望影响的是"这台设备下挂的所有业务",还是"整个虚拟单元下的所有业务"?VSU的合并意味着控制面故障会横向传导,M-LAG则把故障关在单台设备里。对可用性要求到99.99%以上的场景,这个差别是决定性的。
还有一个容易忽略的因素:上游设备的兼容性。VSU对上游没有任何要求,因为它对外就是一台设备;M-LAG要求上游或者下游至少一侧支持跨设备聚合,如果上游是一台不支持的老设备,M-LAG就退化成"两台设备各接一条线",双活意义打折。落地前一定要把上下游设备的型号、版本、支持能力摸清楚,这一步偷懒,后面返工成本极高。
4. 落地配置:一套可复现的部署流程
4.1 部署前的准备与线缆规划
配置之前,先把物理层和逻辑层的规划做扎实,这部分做对了,后面的命令只是照抄。线缆规划要明确四类链路:设备间互联链路(VSU链路或peer-link)、双主检测链路(MAD或keepalive)、下行双归链路、上行链路。前三类必须物理分离,最好走不同的光缆、不同的配线架,甚至不同的走线槽——我见过一次施工把peer-link和keepalive绑在同一束里,被叉车挂断,两条链路同时失效,直接双主。
端口规划建议留出余量。VSU链路我用两个万兆口做聚合,peer-link同理,别用单口。MAD/keepalive用两个千兆口做聚合,虽然流量很小,但聚合能防单口故障导致的检测失效。下行双归口的数量按服务器网卡数或者接入交换机上联数来定,注意两台设备上的成员口编号不必相同,但必须在同一个聚合组ID下。
地址规划要提前定好:VSU模式只需要一个管理IP;M-LAG需要两个管理IP,且这两个IP要能被网管系统分别纳管。另外M-LAG的keepalive链路需要一个独立的互联地址段,别和业务网段混在一起。版本规划更重要——两台设备的软件版本必须完全一致,补丁基线一致,特性授权一致。版本不一致是VSU起不来和M-LAG聚合口半瘫的头号原因,配置前用一条命令核对版本和补丁,能省掉后面几小时的排查。
提示:所有涉及设备互联的端口,配置前先确认没有被其他业务引用,尤其是做过聚合成员的端口,残留配置会导致新聚合组建立失败。清理残留配置比新建配置更花时间,别省这一步。
4.2 VSU配置示例与逐行解读
下面这套配置是结构示意,具体关键字以设备实际支持的版本为准,思路是通用的。第一步是定义虚拟域和角色优先级:
# 进入全局配置 configure terminal # 定义VSU域编号,两台设备必须一致 vsu domain 100 # 设置本机优先级,数值越大越优先成为主设备 # 设备A设200,设备B设100,确保A稳定为主 vsu priority 200 # 可选:设置设备描述,便于识别 vsu description "core-sw-A"优先级这里有个经验值:主备优先级差距拉大到100以上,避免后续扩容时新设备优先级意外插队。有些版本还支持"抢占"功能,默认关闭,我建议保持关闭——抢占意味着一台设备恢复后会主动夺回主角色,这个过程伴随一次控制面切换,业务侧没必要为此承担风险。真要切主,手动执行更可控。
第二步是配置VSU链路:
# 进入物理端口 interface range TenGigabitEthernet 0/49-50 # 关闭端口原有业务配置,划入VSU端口组 port-group 1 vsu-port # 退出并保存 end write两台设备的VSU端口必须成对互联,A的49口接B的49口,A的50口接B的50口,交叉接线会导致链路起不来。配置完成后设备会提示是否重启生效,VSU的合并通常需要重启,这一点在割接窗口里要预留时间。
第三步是配置MAD检测,以直连检测为例:
# 配置MAD检测 vsu mad detection # 指定检测端口(独立的直连口) interface range GigabitEthernet 0/47-48 port-group 2 mad-port # 设置检测报文周期与超时次数 vsu mad interval 3 vsu mad retry 3检测口配完之后,用show vsu mad status确认状态是"检测正常"。这一步千万别跳过,我见过配置写完了但检测口没up,跑了大半年都以为MAD是好的,直到一次链路故障才暴露。
第四步是跨设备聚合:
# 创建跨设备聚合口 interface AggregatePort 10 port-group 10 # 加入成员口(两台设备上分别配置,成员口编号可不同) interface range TenGigabitEthernet 0/1-2 port-group 10 # 配置LACP模式 interface AggregatePort 10 lacp mode active成员口在两台设备上分别加入同一个聚合组ID,物理上分别接下游设备的两个上联口,LACP协商通过后聚合口up,双活链路就成了。
4.3 M-LAG配置示例与逐行解读
M-LAG的配置量明显更大,因为两台设备都要配,而且必须严格对称。第一步是配置peer-link:
# 设备A和设备B分别创建peer-link聚合口 interface AggregatePort 100 port-group 100 lacp mode active description "peer-link" # 加入成员口,两台设备成对互联 interface range TenGigabitEthernet 0/51-52 port-group 100peer-link建议放行所有必要的VLAN,但不要放行业务VLAN的三层接口,peer-link是二层通道,跑三层会产生意想不到的流量路径。有些实现要求peer-link口配置特定的信任模式,按版本要求配就行。
第二步是配置keepalive心跳:
# 独立的心跳链路,不要和peer-link共用物理端口 interface GigabitEthernet 0/48 no switchport ip address 10.255.255.1 30 # 指定心跳对端地址 mlag keepalive peer 10.255.255.2心跳地址用30位掩码,一条链路两个地址,干净利落。心跳链路的物理路径必须和peer-link分开,这是硬要求,共用路径等于没有双主防护。
第三步是配置跨设备聚合口:
# 创建M-LAG聚合口,两台设备ID必须一致 interface AggregatePort 10 port-group 10 mlag 10 # 加入成员口 interface range TenGigabitEthernet 0/1-2 port-group 10第四步是校验对称性,这是M-LAG唯一不能偷懒的环节:
# 在两台设备上分别执行,逐项对比输出 show mlag brief show mlag interface show lacp summary重点核对四项:聚合组ID是否一致、成员口状态是否都是Selected、对端设备ID是否互相识别、VLAN放行列表是否完全相同。任何一项对不上,聚合口就会处于半通状态——半通比全断更难查,因为流量能过一部分,监控不报警,但性能莫名其妙下降。
4.4 验证与验收清单
配置完不等于能用,验收要按清单走。我通常分四层验证,从物理到业务逐层确认:
| 验证层级 | 检查项 | 判定标准 |
|---|---|---|
| 物理层 | 互联链路状态、光功率 | 所有成员口up,光功率在正常范围 |
| 协议层 | VSU角色/M-LAG协商状态、LACP | 主备明确,聚合口Selected,无 flap 记录 |
| 表项层 | MAC/ARP同步、转发表一致性 | 两台设备表项数量接近,无大量泛洪 |
| 业务层 | 实际流量路径、故障切换 | 双活链路均有流量,拔线后业务中断时间在预期内 |
故障演练必须做,而且要做两次:一次拔VSU链路或peer-link,验证双主防护生效;一次拔单台设备的电源,验证业务切换时间。第一次演练最容易出问题,因为双主防护的配置错误平时完全看不出来。演练时用持续ping加长连接业务同时观察,ping只能反映连通性,反映不了TCP连接是否被重置。
注意:演练前把配置备份下来,演练后核对配置是否被自动修改。部分实现的双主恢复过程会自动调整端口状态,恢复后不一定回到原配置,这个细节很多人吃过亏。
5. 踩坑实录与排查速查表
5.1 双主与聚合半瘫的典型现象
现象一:管理IP时通时断,ARP表频繁跳变。这是双主的经典表现。两台设备都拿着同一个IP对外,下游设备的ARP缓存一会儿学到一个MAC,一会儿学到另一个,网关流量在两个MAC之间来回切。排查方法很直接:在两台设备上分别执行查看VSU/M-LAG状态的命令,如果两边都显示自己是主,或者都显示对端不可达,基本可以确认分裂。这时候不要急着重启,先看MAD/keepalive的检测状态,确认检测链路是不是本身就有问题。
现象二:聚合口显示up,但流量只走一边。这是M-LAG的典型半瘫。聚合口状态是up,LACP也协商成功,但所有流量都压在设备A上,设备B的成员口一个包都没有。原因通常是表项同步失败,设备B不知道下游设备的MAC在哪,只能靠泛洪,而泛洪又被本地优先转发策略限制。排查顺序是:先看peer-link是否up、带宽是否打满,再看表项同步计数是否增长,最后核对两边VLAN列表。我遇到过一次是peer-link的MTU不一致,大包被丢,小包能过,表项同步时好时坏,查了整整一个下午。
现象三:设备重启后角色互换,监控大面积告警。优先级没配死,靠MAC选举,重启顺序一变结果就变。解决方法就是把优先级显式配置,并且在文档里写清楚哪台是预期主设备。这个坑成本极低但发生率极高。
现象四:升级后聚合口起不来。版本不一致,或者升级过程中只升了一台。VSU要求两台同版本,M-LAG虽然允许短暂版本不一致,但跨设备通信协议可能不兼容,聚合口直接down。升级前用版本核对命令把两台设备的版本、补丁、特性包全部对齐,这一步花五分钟,能省五小时。
5.2 升级、扩容与割接中的坑
扩容时的优先级陷阱。新设备加入VSU,如果它的优先级比现网主设备高,会立刻触发主备切换,而这个切换发生在你以为只是"加一台设备"的时候。正确做法是新设备入网前先把优先级配成最低,加入后再按需调整。M-LAG扩容相对安全,但新设备的聚合组ID、VLAN列表必须和现网完全一致,否则就是新增了一个半瘫节点。
割接窗口的估算。VSU整机重启一次,从断电到业务恢复,我实测过的范围是3到8分钟,取决于设备型号、配置量、路由协议收敛速度。做割接方案时按上限估,别按宣传页上的数字估。M-LAG单台升级的中断窗口通常在秒级到十几秒,但前提是另一台设备有能力扛住全部流量,升级前务必确认单台设备的端口容量和上行带宽够不够,不够的话"业务不中断"只是理论上的。
跨设备转发的带宽陷阱。M-LAG本地优先转发做得再好,也总有跨设备流量。peer-link的带宽要按跨设备流量峰值来估,不能按平均值。我建议peer-link至少是业务链路带宽的1.5倍以上,而且要做聚合。见过一个项目peer-link只配了单条万兆,业务高峰时peer-link打满,跨设备流量被丢,表现为"部分服务器访问偶发超时",查了很久才定位到peer-link利用率。
生成树的残留配置。从传统双机改造过来的网络,生成树配置往往还留着。VSU/M-LAG之后逻辑上无环,但残留的STP配置可能导致端口被阻塞,尤其是边缘端口没开、BPDU保护没配的情况。改造后统一梳理一遍STP配置,该关的关,该留的留,别让老配置和新架构打架。
5.3 常见问题速查表
| 故障现象 | 最可能原因 | 排查动作 | 处置建议 |
|---|---|---|---|
| 管理IP不通或时通时断 | 双主分裂 | 两台设备分别查角色状态、MAD/keepalive状态 | 修复检测链路,手动让一台进入Recovery |
| 聚合口up但单边无流量 | 表项未同步、peer-link异常 | 查peer-link状态、表项同步计数、VLAN列表 | 修复peer-link,核对两边配置对称性 |
| 聚合口起不来 | 版本不一致、成员口配置残留、LACP模式不匹配 | 核对版本补丁、清理端口配置、检查LACP模式 | 统一版本,清除残留,两边模式改成一致 |
| 主备切换后业务长时间不恢复 | 表项同步不全、路由收敛慢 | 查切换前后表项数量、路由协议邻居状态 | 加大VSU链路带宽,优化路由收敛参数 |
| 跨设备访问偶发超时 | peer-link带宽打满 | 查peer-link利用率、跨设备流量占比 | peer-link扩容或增加成员口,优化本地转发 |
| 升级后设备反复重启 | 版本兼容性问题、配置不兼容 | 查启动日志、版本兼容性说明 | 回退版本,按官方兼容矩阵重新规划 |
| 新设备加入后角色异常 | 优先级配置错误 | 查两台设备优先级 | 新设备优先级设为最低后再加入 |
排查这类问题,我的习惯是先看物理层再看协议层,最后才看配置。因为配置错误在部署阶段就暴露了,而物理层问题往往是运行中才出现——光纤弯折、模块老化、跳线松动,这些才是现网故障的大头。手边常备一个光功率计和几根备用跳线,比翻十页配置命令管用。
最后分享一个我在多个项目里验证过的小习惯:给VSU和M-LAG的每条关键链路都做端口描述命名,命名规则里带上"用途-对端设备-对端端口",比如peerlink-to-B-51、mad-to-B-47。这个动作花不了几分钟,但在凌晨三点排障的时候,一条清晰的描述能让你少敲十条命令。设备虚拟化这套东西,原理不难,难的是故障时的信息密度,而描述命名就是提高信息密度最便宜的手段。