第26篇:堆叠分裂故障——双主检测与 MAD 检测机制
一、写在前面
堆叠虽然提高了可靠性,但也引入了一个新问题——堆叠分裂(Split)。
当堆叠成员之间的堆叠链路(堆叠线缆)发生故障时,堆叠系统会分裂成多个独立的堆叠系统,每个系统都认为自己是 Master。
这是最可怕的堆叠故障:分裂后多个 Master 同时运行,IP 冲突、MAC 冲突、ARP 混乱,网络彻底瘫痪。
本文将详细解释堆叠分裂的原因、危害以及 MAD 检测机制如何解决这个问题。
二、堆叠分裂是怎么发生的?
2.1 链形堆叠分裂
正常:SW-A ── SW-B ── SW-C
↑ 堆叠线断了
分裂后:
SW-A ── SW-B SW-C(独立)
↓ 各自认为自己还是堆叠的一部分
↓ 都认为自己是 Master
2.2 环形堆叠单线断开不会分裂
环形堆叠:
SW-A ── SW-B
│ │
SW-D ── SW-C
如果有 1 条堆叠线断了:
SW-A ── SW-B
│
SW-D ── SW-C
仍然连通:A→B→C→D→A(还能走另一条路径)
→ 不会分裂,继续工作,只是少了冗余
这就是为什么推荐环形堆叠而不是链形。链形断一根线就分裂。
2.3 环形堆叠双线断开才会分裂
SW-A ──(断)── SW-B
│ │
(断) (通)
│ │
SW-D ──── SW-C
→ 堆叠系统分裂为两个:
SW-A(独立)│ SW-B─C─D(另一个堆叠)
三、分裂的危害
3.1 分裂后的灾难
假设堆叠原先有 3 台交换机(SW-A Master, SW-B Standby, SW-C Slave),堆叠 IP 为 10.0.0.1/24。
堆叠线断裂 → 分裂为两个堆叠:
堆叠 1:SW-A(自己成为唯一的 Master)
发送免费 ARP:10.0.0.1 的 MAC 是 SW-A 的 MAC
堆叠 2:SW-B + SW-C(SW-B 升级为新 Master)
也发送免费 ARP:10.0.0.1 的 MAC 是 SW-B 的 MAC
结果:
网络中出现了两个 10.0.0.1——IP 地址冲突!
交换机 MAC 表中这个 IP/MAC 来回跳变
网络中断
| 危害 | 说明 |
|---|---|
| IP 地址冲突 | 两台交换机用相同的 IP 和 MAC |
| ARP 表震荡 | 所有设备看到同一个 IP 在两个 MAC 之间切换 |
| MAC 地址漂移 | 连接交换机的上行设备 MAC 表震荡 |
| 路由震荡 | OSPF/BGP 邻居关系异常 |
| 全网瘫痪 | 数据包无法正确转发 |
四、MAD 检测机制
4.1 MAD 是什么
MAD(Multi-Active Detection,多主检测) 是华为堆叠的防分裂机制。检测到堆叠分裂后,MAD 会让其中一部分成员自动关闭所有业务端口,只保留一个堆叠正常工作。
4.2 三种 MAD 检测方式
| 方式 | 原理 | 推荐度 |
|---|---|---|
| 直连检测 | 成员之间通过专用 MAD 链路检测 | ⭐⭐⭐ |
| 代理检测 | 通过上联交换机做代理检测 | ⭐⭐⭐⭐⭐ 推荐 |
| Eth-Trunk 检测 | 通过跨成员 Eth-Trunk 检测 | ⭐⭐ |
五、配置 MAD 检测
5.1 代理检测(推荐方式)
需要一个上联交换机作为"裁判"。
[上联交换机]
┌──────────┐
│ 做代理 │
└────┬─────┘
│ Trunk
┌───────┴───────┐
[堆叠系统] SW-A ── SW-B
配置步骤:
# 1. 创建 MAD 专用的 VLAN
[Stack] vlan 999
[Stack-vlan999] quit
# 2. 创建一个 Eth-Trunk 作为 MAD 链路
[Stack] interface eth-trunk 10
[Stack-Eth-Trunk10] mode lacp
[Stack-Eth-Trunk10] port link-type trunk
[Stack-Eth-Trunk10] port trunk allow-pass vlan 999
[Stack-Eth-Trunk10] trunkport gigabitethernet 0/0/25 ← Master 的端口
[Stack-Eth-Trunk10] trunkport gigabitethernet 1/0/25 ← Standby 的端口
[Stack-Eth-Trunk10] mad relay ← 启用 MAD 代理检测
[Stack-Eth-Trunk10] quit
# 3. 在上联交换机上
[Up-SW] vlan 999
[Up-SW] interface eth-trunk 10
[Up-SW-Eth-Trunk10] mode lacp
[Up-SW-Eth-Trunk10] port link-type trunk
[Up-SW-Eth-Trunk10] port trunk allow-pass vlan 999
[Up-SW-Eth-Trunk10] trunkport gigabitethernet 0/0/25
[Up-SW-Eth-Trunk10] trunkport gigabitethernet 1/0/25
[Up-SW-Eth-Trunk10] quit
5.2 直连检测方式
# 创建 MAD 专用 VLAN
[Stack] vlan 999
# 将成员间的链路设为 MAD 检测链路
[Stack] interface gigabitethernet 0/0/26
[Stack-GigabitEthernet0/0/26] port link-type trunk
[Stack-GigabitEthernet0/0/26] port trunk allow-pass vlan 999
[Stack-GigabitEthernet0/0/26] mad detect mode direct ← 直连模式
六、MAD 检测的工作原理
堆叠正常工作:
SW-A(Master) ──(堆叠线)── SW-B(Standby)
│ │
└───── MAD 心跳(VLAN 999)─────┘
双方通过 MAD 链路交换心跳报文
堆叠线断裂:
SW-A ──(断了)── SW-B
│ │
└─ 收不到心跳 ──→ 双方都认为对方故障
↓ ↓
开始 MAD 竞争 开始 MAD 竞争
MAD 竞争规则:
比较堆叠优先级 → 小的关闭自己的业务端口
或比较 MAC → 小的关闭
胜出者(假设 SW-A):
保持 Master,继续转发
失败者(SW-B):
关闭所有业务端口 → 进入 Recovery 状态
不影响上层网络
七、分裂恢复
7.1 自动恢复
堆叠线修复后:
恢复流程:
1. 堆叠线重新连接
2. 两个分裂的系统互相发现
3. 比较堆叠 ID——ID 小的优先
4. Recovery 状态的成员自动重启并重新加入堆叠
5. 合并为一个堆叠系统
7.2 手动恢复
如果自动恢复失败:
# 在 Recovery 状态的交换机上手工恢复
[Recovery-SW] system-view
[Recovery-SW] undo stack mad restore
八、查看 MAD 状态
# 查看 MAD 状态
[Stack] display mad verbose
MAD mode: Relay
MAD status: Normal ← 正常状态
# 如果分裂了
[Stack] display mad verbose
MAD mode: Relay
MAD status: Split ← 分裂状态!
MAD recovery state: Recovery ← 该成员处于 Recovery
# 查看 Recovery 状态的端口
[Stack] display interface brief
Interface IP Address/Mask Physical Protocol
GigabitEthernet1/0/1 *down:mad down down ← 被 MAD 关闭
GigabitEthernet1/0/2 *down:mad down down
...
看到 *down:mad 就说明端口被 MAD 检测关闭了。
九、最佳实践
| 实践 | 说明 |
|---|---|
| 使用环形堆叠 | 单线断开不会分裂 |
| 开启 MAD 检测 | 分裂时自动关闭备用方的端口 |
| 推荐代理检测 | 比直连检测更可靠 |
| MAD 链路冗余 | 给 MAD 链路也做冗余 |
| 平时注意堆叠线缆 | 做标签,施工时注意不要踩到 |
| 分裂后检查根因 | 不要只恢复,要找出分裂原因 |
十、思考
- 堆叠分裂是怎么产生的?链形和环形堆叠哪个更容易分裂?
- 为什么堆叠分裂会导致全网瘫痪?写了什么关键信息?
- MAD 检测的三种方式是什么?各有什么特点?
- MAD 检测时,分裂后"失败者"的端口变成什么状态?
- Split 恢复时,Recovery 状态的成员会自动重新加入堆叠吗?怎么加入?
- 你值夜班时收到告警"堆叠分裂",你的排查和恢复步骤是什么?
下篇预告:第27篇《路由基础_什么是路由表_路由表如何生成》——理解路由表的结构和路由生成方式,建立路由基础概念。