堆叠与M-LAG对比:原理、选型与配置实战
做网络的同学早晚都要面对一个选择题多台交换机怎么组网既不想让STP在那里慢慢收敛又想要跨设备的链路聚合最好上联链路出问题的时候业务无感。堆叠技术和M-LAG就是围绕这个问题出来的两套方案。这篇不算教科书我直接把这两套东西放在一起告诉你它们各自是什么、为什么存在、怎么选、怎么配尤其是“两台M-LAG交换机上联一台出口设备”这个典型场景我会把配置思路和踩坑记录一并写出来。适合正在做园区核心、数据中心汇聚或者准备把网络冗余结构从堆叠改成M-LAG的兄弟们参考。1. 先把概念说清楚堆叠和M-LAG到底在解决什么问题1.1 从“不想跑STP、又想要冗余”说起单台交换机的瓶颈基本就两个可靠性不够、转发带宽不够。掉电、板卡故障、上联链路中断都会造成单点故障。加一台设备做冗余看起来是常规解法但只要两台设备之间出现两条物理链路环路问题就来了STP会帮你阻塞一条口代价是收敛时间普通生成树秒级起步RSTP也要秒级以内在数据中心或园区核心这个时间足以让一堆业务超时。更麻烦的是STP的链路要么转发要么阻塞冗余链路在正常情况下用不上带宽浪费。所以大家才想要一种方案两台设备能同时工作两条链路都能转发某条链路或者某台设备挂了另一条还能接管而且不依赖STP慢吞吞地收敛。堆叠技术和M-LAG都是为了这个目标出现的只是实现方式完全不同。1.2 堆叠的原理把几台物理设备变成一台逻辑设备堆叠华为叫iStackH3C叫IRF锐捷叫VSU思科叫StackWise的思路是把多台物理交换机通过堆叠口互联把控制平面合并成一个整体对外看起来就是一台设备。这里面有主设备和备设备主设备负责整机控制备设备只是同步状态待命。对外管理只需要一个IP配置基本全局生效链路聚合可以把成员口分散到不同物理机上这叫跨设备链路聚合。堆叠的好处是直观管理简单很适合接入层或者中小园区。坏处也不可低估整个堆叠系统共用一套控制面一旦主设备故障或者触发主备切换整堆所有的转发面都会跟着震荡故障域不是一个节点而是整个逻辑系统。版本升级是最典型的例子本来滚动升级是想减少停机结果堆叠整个系统必须一起升级几乎没有热升级空间。1.3 M-LAG的原理两台设备“手拉手”但各自独立M-LAG跨设备链路聚合组华为叫M-LAGH3C叫DRNI锐捷叫M-LAG思科叫vPC/MEC的思路完全不一样。它把两台设备通过一条peer-link链路连接起来两台设备各自保留独立的控制平面只是通过peer-link同步MAC、ARP、路由等关键表项同时对外提供一个跨设备的链路聚合组。也就是说上面那台设备看到的还是一根逻辑聚合链路下面接的设备也把这两台看成一个双活的聚合对端。我用个类比堆叠像连体双胞胎从出生就共用一套器官M-LAG更像两个配合非常默契的工人各自干活但要随时对进度互相报备。所以M-LAG天然具备更好的故障隔离能力一台设备挂了、重启、升级另一台还能继续转发业务几乎无感。当然代价是配置逻辑比堆叠更绕需要额外维护peer-link和双主检测机制。2. 堆叠和M-LAG选谁不选谁2.1 最大的差异在控制面和故障域很多人选型的时候只看了功能对比忽略了一个决定性问题出故障时影响范围到底多大。堆叠的控制面在主设备上所有成员设备都要依赖主设备统一决策一旦主设备异常整堆都会感受到轻则协议震荡重则所有业务转发中断。M-LAG两台设备控制面各自独立单台设备故障另一台自己照常运转虽然已经建立的会话可能受些影响但恢复速度比整堆重启快得多。我经历过一次典型的教训。某机房核心用堆叠组网一次软件升级需要重启整个逻辑系统安排的割接窗口是凌晨两点结果升级后堆叠选举和业务恢复花了快十分钟虽然窗口够但被领导问了好几次“为什么这么慢”。后来换成M-LAG逐台升级每台单独重启对业务几乎无感这个体验差距非常直观。2.2 升级、运维和跨设备链路聚合体验对比运维层面堆叠的优点是“省心”一个管理IP、全局配置、不用考虑主备两边配置一致性。M-LAG恰好相反两台设备必须单独配置还要保证内容一致命令敲起来比堆叠繁琐得多。但M-LAG在升级和排障的时候又更省心升级逐台做故障单台查不用每次都在整系统维度上操作。跨设备链路聚合能力两者都能实现。但在具体行为上堆叠本质是聚合组成员落在同一个逻辑设备内转发决策由主设备统一下发M-LAG则依赖peer-link同步状态让两台设备对上游表现得像一个聚合对端正常流量尽量本地转发避免来回绕行peer-link所以带宽规划和故障场景下的表现也会不同。2.3 场景选型速查表我直接给一张供参考的速查表实际选择时结合设备能力和业务容忍度调整场景推荐方案主要原因中小园区接入层堆叠管理简单、成本低园区汇聚/核心堆叠或M-LAG看设备支持如果设备不支持M-LAG只能堆叠数据中心核心/汇聚M-LAG故障域小、可逐台升级两台汇聚上联单出口M-LAG上联聚合可跨设备出口设备无感分支小规模扩容堆叠配置量最小跨代设备混用M-LAG需确认支持堆叠一般要求同系列同版本给个判断标准如果你很在意“割接升级不能中断业务”并且设备支持那就优先M-LAG如果你是接入层图省事堆叠完全够用。3. 实战两台M-LAG交换机上联一台出口设备3.1 组网拓扑与设计思路这个场景来自真实需求两台汇聚交换机做M-LAG上联一台出口防火墙或者路由器下联若干服务器或接入交换机。拓扑很简单两台M-LAG设备之间跑peer-link用于表项同步和应急流量转发两台M-LAG设备各有一条上联物理链路汇聚到出口设备的同一个Eth-Trunk里。出口设备只看到一根逻辑聚合链路根本感知不到M-LAG的存在。为什么这个组网比堆叠更适合第一如果某台汇聚设备突然挂掉另一台还能独立转发上联链路在出口设备聚合组里少了一条成员剩余链路照常工作第二版本升级时可以逐台重启不需要整个核心震一下第三两条上联链路平时都承载流量带宽利用率高而不是STP那种一主一备的浪费。当然出口设备本身仍是单点如果你需要出口级冗余那就是出口双机热备的架构和M-LAG不冲突。3.2 动手前必须确认的几件事别急着去CLI里敲命令先把这些确认了不然配置过程中容易返工。第一两台设备的软件版本和License要一致。M-LAG对版本一致性要求高版本不一致可能导致表项同步异常、M-LAG成员口协商不上。第二peer-link建议用Eth-Trunk承载至少两个物理口带宽建议不低于业务流量的峰值预期因为广播组播和部分异常流量会走peer-link。第三keepalive链路要独立不要跟peer-link、业务共用同一条物理链路否则peer-link断了keepalive也断了双主检测失效。第四M-LAG两台设备上的M-LAG成员口配置要一致速率、双工、VLAN、LACP优先级都对齐。另外规划好M-LAG编号比如上联出口用M-LAG 1下联服务器用M-LAG 2编号要对应不要两台设备之间错位否则聚合组协商会出问题。3.3 M-LAG核心配置以华为CE系列为例假设设备A和设备B都是华为CE系列peer-link用Eth-Trunk1keepalive用VLAN 4090M-LAG上联聚合口用Eth-Trunk10。先看设备A的配置步骤。第一步创建peer-link承载的Eth-Trunk并加入物理成员口interface Eth-Trunk1 port link-type trunk trunk allow-pass vlan all mode lacp-static interface 10GE1/0/1 eth-trunk 1 interface 10GE1/0/2 eth-trunk 1第二步配置DFS Group并绑定peer-linkdfs-group 1 peer-link interface Eth-Trunk1第三步配置keepalive检测链路这里用独立的VLANIF接口两台设备之间直连接口vlan 4090 interface Vlanif4090 ip address 10.0.0.1 255.255.255.252 interface 10GE1/0/3 port link-type access port default vlan 4090 dfs-group 1 keepalive ip address 10.0.0.2 vlan 4090第四步配置M-LAG转发口Eth-Trunk10并指定M-LAG编号interface Eth-Trunk10 port link-type trunk trunk allow-pass vlan all mode lacp-static m-lag 1 interface 10GE1/0/4 eth-trunk 10设备B的配置逻辑相同只是把keepalive地址换为10.0.0.2peer-link和M-LAG编号保持一致。interface Eth-Trunk1 port link-type trunk trunk allow-pass vlan all mode lacp-static interface 10GE1/0/1 eth-trunk 1 interface 10GE1/0/2 eth-trunk 1 dfs-group 1 peer-link interface Eth-Trunk1 vlan 4090 interface Vlanif4090 ip address 10.0.0.2 255.255.255.252 interface 10GE1/0/3 port link-type access port default vlan 4090 dfs-group 1 keepalive ip address 10.0.0.1 vlan 4090 interface Eth-Trunk10 port link-type trunk trunk allow-pass vlan all mode lacp-static m-lag 1 interface 10GE1/0/4 eth-trunk 10注意不同版本、不同系列的接口名称和命令细节会有差异出现命令不识别时先看产品文档。M-LAG配置前也建议把两台设备之间peer-link先调通业务口先别放流量。3.4 上联出口设备的聚合口配置出口设备侧同样创建Eth-Trunk把两条分别接到设备A和设备B的上联物理口加入进来。以华为防火墙/路由器为例interface Eth-Trunk10 port link-type trunk trunk allow-pass vlan all mode lacp-static interface GigabitEthernet1/0/1 eth-trunk 10 interface GigabitEthernet1/0/2 eth-trunk 10这里有个容易忽略的细节出口设备和M-LAG设备之间的Eth-Trunk编号不要求一致但建议统一方便排查。LACP模式下两端会协商出口设备是主动方还是被动方都可以只要一端主动发起另一端能响应就行。我更倾向于都配lacp-static简单直接。配置完M-LAG后出口设备的Eth-Trunk10虽然是两条物理链路分别到两台不同的交换机但在LACP协商时M-LAG系统会把两台设备伪装成一个聚合系统来应答所以出口设备看到的还是一套正常的聚合组。如果某台M-LAG设备故障出口设备侧聚合组会少一个成员口流量自动哈希到剩余链路不需要STP介入。3.5 配置完成后如何验证配置完不是就完事了验证步骤必须做。我习惯这样检查先看设备A的M-LAG状态display dfs-group 1 display m-lag verbose display eth-trunk 10重点看M-LAG状态是否正常Peer-link是否UPM-LAG成员口协商是否成功。然后看keepaliveping 10.0.0.2能通说明keepalive链路正常。再看上联出口设备侧display eth-trunk 10两条成员链路应该都在Selected状态LACP协商正常。最后做拔线测试。拔掉一条上联链路业务应该秒级切换拔掉peer-link观察keepalive检测是否触发设备是否进入应急模式并关闭M-LAG口确认不会出现双主拔掉一台设备的所有业务口另一台还能正常转发。这些测试要在业务低谷期做并且提前通知相关方。4. 常见问题与排查技巧实录4.1 常见问题速查表下面这个表是我在实际项目里碰到最多的问题按现象、可能原因、排查方向整理现象可能原因排查方向M-LAG系统双主MAC漂移peer-link中断keepalive未触发检查peer-link物理链路、检查keepaliveM-LAG口被阻塞Downpeer-link故障后进入防环应急模式查看告警日志恢复peer-link上联流量不通上联Eth-Trunk未加M-LAG编号、VLAN未放行检查两台设备M-LAG配置一致性流量全走一台设备LACP优先级不一致、成员口配置不一致检查LACP协商结果与成员口状态广播风暴双主转发未闭环紧急关闭一台设备的M-LAG口升级后M-LAG异常版本不一致、配置被覆盖检查版本和配置备份4.2 双主/分裂场景怎么排查模拟一个最容易出事的场景peer-link链路中断但keepalive正常。这时M-LAG系统会通过keepalive探测到对端仍活着进入“应急模式”为了防止两台设备都继续转发导致环路它会把自己的M-LAG成员口全部设置为DOWN只保留peer-link链路作为系统保护。对业务影响是有的但至少不会形成广播风暴。最危险的是peer-link和keepalive同时中断两台设备都以为对端挂了各自独立转发就会形成双主状态造成MAC漂移和环路。处理顺序是这样的先通过console登上一台设备立即把它的M-LAG成员口shutdown先恢复网络稳定再修复peer-link物理链路最后恢复成员口和keepalive确认表项同步正常后再开放业务。4.3 上联流量不均、MAC漂移流量全走一台设备是最常见的“配置没问题但它就是不好用”的案例。根因多半是LACP协商时两台M-LAG设备对外表现不一致导致出口设备聚合组里只有一条成员链路被选中另一条长期Standby。检查的时候重点看出口设备Eth-Trunk的成员状态如果一条Selected一条Unselected去两台M-LAG上对比LACP priority和成员口速率双工把优先级高的那台设备、或者把两台都加到相同优先级再重新协商。MAC漂移大概率跟M-LAG的转发模型有关。正常M-LAG下单播流量尽量本地转发不走peer-link但广播、组播以及部分异常流量会通过peer-link传到对端设备。如果peer-link带宽不够或者表项同步异常就会出现MAC在端口间反复跳变。检查重点peer-link是否满载、M-LAG成员口两边配置是否一致、是否存在VLAN配置差异。4.4 我踩过的几个坑最后说几个真实的坑可能比前面的配置更值钱。第一个坑keepalive和peer-link复用同一条链路。早先省光纤我把keepalive也建在peer-link的VLANIF上结果peer-link一断keepalive也断了双主检测完全失效两台设备同时转发整网MAC漂移查了一晚上。后来规定keepalive必须独立物理链路或者至少走不依赖peer-link的独立三层路径。第二个坑peer-link只做了一条物理成员。peer-link不但用于表项同步应急场景还要承载流量一条链路挂掉整个M-LAG就分裂了。至少两条物理口捆绑有条件可以上4条。第三个坑M-LAG口忘加M-LAG编号。Eth-Trunk10如果没在下发m-lag 1指令它就是普通聚合口两台设备会把它当独立的Eth-Trunk跨设备LACP协商结果乱套。这个问题在交付巡检时很常见建议配置清单里专门核对M-LAG编号。第四个坑版本升级顺序。M-LAG虽然是逐台升级但顺序不能乱必须先把备份设备升级好、观察正常再升级主设备。如果两台设备同时重启peer-link和keepalive会同时消失M-LAG系统就变成了双主场景。升级前先在设备上确认当前主备状态升级过程中别手滑两边一起操作。我个人在实际操作中的体会是M-LAG做得好不好很大程度上取决于你愿不愿意先把物理链路规划和故障行为都过一遍脑子。堆叠是越用越省心但升级割接时惊心动魄M-LAG是配置阶段费心之后却非常稳。如果让我给一个新手建议那就是不要在第一次接触M-LAG的时候就把它当成堆叠用两台设备是独立的你要习惯“双份配置、双份检查”的节奏。最后再分享一个实用小技巧每次改完M-LAG配置把display dfs-group、display m-lag verbose和display eth-trunk的输出都存一份等出问题的时候有基线对比定位速度会快很多。这套东西实验环境多敲几遍再上生产也不迟。