第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 链路也做冗余
平时注意堆叠线缆 做标签,施工时注意不要踩到
分裂后检查根因 不要只恢复,要找出分裂原因

十、思考

  1. 堆叠分裂是怎么产生的?链形和环形堆叠哪个更容易分裂?
  2. 为什么堆叠分裂会导致全网瘫痪?写了什么关键信息?
  3. MAD 检测的三种方式是什么?各有什么特点?
  4. MAD 检测时,分裂后"失败者"的端口变成什么状态?
  5. Split 恢复时,Recovery 状态的成员会自动重新加入堆叠吗?怎么加入?
  6. 你值夜班时收到告警"堆叠分裂",你的排查和恢复步骤是什么?

下篇预告:第27篇《路由基础_什么是路由表_路由表如何生成》——理解路由表的结构和路由生成方式,建立路由基础概念。