第176篇:EVPN 多归(Multi-homing)与 DF 选举

关键词

多归、ESI、Ethernet Segment、DF 选举、冗余接入、分裂脑、BUM 复制、负载均衡


一、什么是 EVPN 多归

1.1 场景

一台 CE(或一个以太网段)可以连接到多台 PE 实现冗余:

                  │ PE1
          ┌───────┤
          │       │ PE2
       ┌──┴──┐   │
       │ CE1 │
       └─────┘

CE1 通过两条链路接入 PE1 和 PE2

1.2 ESI(Ethernet Segment Identifier)

ESI 标识连接 CE 的一组链路:

          ┌───────────────┐
          │  ESI: 0000.0000.0000.0000.0001 │
          └───────────────┘
                │
          ┌─────┼─────┐
          │     │     │
          │   ┌─┴──┐  │
          │   │ CE │  │
          │   └────┘  │
          │           │
        PE1         PE2

同一 ESI 下的 PE 属于同一个 Ethernet Segment(ES)

1.3 多归模式

模式 说明 AC 状态
Single-homed CE 只连一台 PE 单活
Multi-homed (Active/Standby) 主备模式,只有一台 PE 转发 备 PE AC 阻塞
Multi-homed (All-Active) 多活模式,所有 PE 同时转发 所有 AC 活跃

二、All-Active 多归

2.1 工作原理

CE1 同时连接 PE1 和 PE2,两条链路都在转发:

         ┌── PE1 ── EVPN ── PE3 ── CE2
         │
  CE1 ───┤
         │
         └── PE2 ── EVPN ── PE3 ── CE2

CE1 发送的帧可以走 PE1 或 PE2 到远端
远端到 CE1 的帧可以走 PE3→PE1 或 PE3→PE2

2.2 ESI 标签

PE 在向对端 PE 发送 BUM 流量时,携带ESI Label标识来源:

PE1 向 PE3 发送 BUM 帧:
  VXLAN/MPLS 封装中携带 ESI Label = ESI-1
  PE3 接收后知道:这个帧来自 ESI-1 组

PE3 从 PE1 收到 BUM 帧:
  如果 PE3 也连接了 ESI-1(作为多归组成员)
  → 不会将这个 BUM 帧发送到 ESI-1 的 AC 上
  → 避免 CE1 收到自己发出的广播

2.3 水平分割

在 All-Active 模式中,从 PE 到 CE 的方向需要避免重复发送:

CE1 发送广播帧:
  PE1 收到 → 通过 VXLAN 发送到 PE3
  PE2 也收到 → 同样通过 VXLAN 发送到 PE3

PE3 收到两个相同的广播帧:
  没有问题,CE2 收到两份广播

但 PE1 向 ESI-1 转发时:
  不会向 ESI-1 的 AC 发送(自己的 AC 除外)
  PE2 也不会向 ESI-1 的 AC 发送
  → 防止 CE1 收到自己发的广播帧

三、DF(Designated Forwarder)选举

3.1 为什么需要 DF

在 All-Active 多归中,对于 BUM 流量(广播/未知单播/组播),需要确保:

  • 从 CE 发向 PE 的 BUM:正常接收
  • 从 PE 发向 CE 的 BUM只能由一台 PE 转发
  • 否则 CE 会收到两份相同的 BUM 帧
远端 PE3 发送广播帧:
  ──▶ PE1(转发到 CE)→ CE 收到一份
  ──▶ PE2(不转发)

如果 PE1 和 PE2 都转发:
  CE1 收到两份广播 → 正常主机可以忽略
  但 CE1 会处理两次,浪费 CPU
  同时 MAC 表可能产生漂移

3.2 DF 选举过程

DF 选举基于 Type 4(Ethernet Segment Route) 路由:

CE1(ESI=0000.0000.0000.0000.0001)连接 PE1 和 PE2:

PE1 发布 Type 4 路由:
  RD: 100:1
  ESI: 0000.0000.0000.0000.0001
  IP: 1.1.1.1(PE1 Loopback)

PE2 发布 Type 4 路由:
  RD: 100:1
  ESI: 0000.0000.0000.0000.0001
  IP: 2.2.2.2(PE2 Loopback)

两台 PE 收到彼此的 Type 4 路由后,进行 DF 选举:

DF 选举算法(默认):
  - 对 ESI 做 hash
  - 按 IP 地址排序(大到小或小到大)
  - 根据 VLAN/BD 数分配

  示例(2 个 PE):
    PE1 (1.1.1.1) → IP 较小 → 奇数 VLAN 为 DF
    PE2 (2.2.2.2) → IP 较大 → 偶数 VLAN 为 DF

  如果有 4 个 BD (BD10, BD20, BD30, BD40):
    BD10 → DF = PE1
    BD20 → DF = PE2
    BD30 → DF = PE1
    BD40 → DF = PE2

  负载均衡:不同的 BD 有不同的 DF!

3.3 DF 选举算法

算法 说明 特点
Default(Modulo-based) 基于 IP 排序取模 简单、标准
Preference-based 通过配置优先级决定 更灵活
Highest Random Weight 随机权重分配 更均匀
# 查看 DF 选举结果
<PE1> display evpn ethernet-segment esi 0000.0000.0000.0000.0001

ESI           : 0000.0000.0000.0000.0001
Interface     : GE0/0/0.100
Peer List     : 2.2.2.2
DF Election   : Modulo-based
DF for BD 10  : 1.1.1.1 (本地)
DF for BD 20  : 2.2.2.2 (远程)

四、分裂脑(Split Horizon)

4.1 什么是分裂脑

如果 PE1 和 PE2 之间的 EVPN BGP 会话中断,但两者都认为自己是 DF:

PE1 和 PE2 的 BGP 会话中断
  │
  PE1:我是 DF → 向 CE1 转发 BUM
  PE2:我也是 DF → 也向 CE1 转发 BUM
  │
  CE1 收到两份相同的 BUM 帧!

4.2 分裂脑检测

通过 ES 路由的序列号检测:

PE1 发布 Type 4 路由时携带序列号
PE2 也发布 Type 4 路由

正常情况下,双方都知道对方在线
  通过 KeepAlive 维护

如果 BGP 中断:
  PE1 的 Type 4 路由在 PE2 中过期
  PE2 的 Type 4 路由在 PE1 中过期
  双方都认为"只剩我一个"→ 都成为 DF → 分裂脑

解决方案:
  1. BFD for BGP(快速检测)
  2. 单独的 ES KeepAlive(周期性发送)
  3. 核心层的 BGP 路由反射器

五、Active/Standby 多归

5.1 适用场景

All-Active 虽然好,但有些场景需要用 Active/Standby:

场景 原因
CE 不支持 LACP/多活 老设备
避免 MAC 漂移 单活更稳定
特定安全策略 双活不适合
CE-PE 链路带宽不对称 主备更简单

5.2 实现方式

Active/Standby 通过 ES 路由控制:

PE1(Active):正常转发 BUM,单播也转发
PE2(Standby):不转发 BUM,单播也不转发

PE1 故障时:
  PE2 感知到 ES 路由变化
  自动成为 Active

配置:
  interface GigabitEthernet0/0/0.100
   esi 0000.0000.0000.0000.0001
   df-mode standby                      # 强制 Standby 模式

六、多归的配置示例

6.1 ESI 配置

# PE1 上配置 ESI
interface GigabitEthernet0/0/0.100
 vlan-type dot1q 100
 esi 0000.0000.0000.0000.0001            # 同一 ES 的接口使用相同 ESI
 bridge-domain 10
#
# PE2 上配置(相同的 ESI)
interface GigabitEthernet0/0/0.100
 vlan-type dot1q 100
 esi 0000.0000.0000.0000.0001            # 与 PE1 相同的 ESI
 bridge-domain 10

6.2 验证

# 查看 ES 信息
<PE1> display evpn ethernet-segment

Ethernet Segment Information:
  ESI          : 0000.0000.0000.0000.0001
  Interface    : GE0/0/0.100
  Peer Addresses: 2.2.2.2
  VLANs        : 10
  State        : Up
  DF State     : DF
  Total Peers  : 2
  Active Peers : 2

七、总结

知识点 核心要点
ESI 标识一个以太网段,多归 PE 共享相同 ESI
All-Active 多台 PE 同时转发流量
Active/Standby 主备模式,备 PE 不转发
DF 指定转发者,负责 BUM 向 CE 的发送
DF 选举 基于 ESI + Modulo 算法,不同 BD 可能不同 DF
分裂脑 通过 BFD + ES KeepAlive 检测和防止

八、思考

  1. ESI 的作用是什么?多归 PE 上如何配置 ESI?
  2. All-Active 和 Active/Standby 多归有什么区别?
  3. DF 选举的目的是什么?为什么 All-Active 需要 DF?
  4. DF 选举的默认算法是什么?如何实现负载均衡?
  5. 分裂脑是什么?如何检测和防止?

下篇预告:第177篇《EVPN IRB(Integrated Routing and Bridging)》——深入 EVPN 的集成路由桥接,理解 Asymmetric 和 Symmetric IRB 的完整工作流程。