第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 检测和防止 |
八、思考
- ESI 的作用是什么?多归 PE 上如何配置 ESI?
- All-Active 和 Active/Standby 多归有什么区别?
- DF 选举的目的是什么?为什么 All-Active 需要 DF?
- DF 选举的默认算法是什么?如何实现负载均衡?
- 分裂脑是什么?如何检测和防止?
下篇预告:第177篇《EVPN IRB(Integrated Routing and Bridging)》——深入 EVPN 的集成路由桥接,理解 Asymmetric 和 Symmetric IRB 的完整工作流程。