今天学习如何设计 EVPN 多归属故障演练,并用连续探测、设备状态、流量计数器和时间线定位中断窗口。核心结论:一次 Ping 只能证明一个时刻的可达性;Underlay Loopback 可达不等于 VXLAN 业务可达;LACP 成员都 Up 也不等于流量一定均匀。故障分析必须把物理层、聚合层、控制面、数据面和应用层分开记录。
一、今日目标与完成情况
- 理解单次 Ping 的证据边界
- 设计单成员、整机和 Peer-Link 三类故障演练
- 建立检测、收敛、转发表和应用恢复时间线
- 区分 Underlay 探测与 Overlay 业务探测
- 用计数器和多流量验证判断哈希不均还是成员故障
- 完成 5 个练习题并记录原回答和批改
- 尚未在真实 CloudEngine/VRP 设备上执行故障演练和测量实际毫秒数
二、一次 Ping 的证据边界
text
一次 Ping 只能证明某一时刻、某个源到某个目的完成了一次往返。
它不能证明切换期间没有丢包、业务持续稳定、去程和回程都正常,
也不能证明其他VNI、其他流、BUM和应用层已经收敛。
因此至少需要连续 Ping、时间戳、设备日志和流量统计配合。
三、故障演练的分层观察
#mermaid-svg-YrlTgwyA3eRvxunU{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-YrlTgwyA3eRvxunU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-YrlTgwyA3eRvxunU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-YrlTgwyA3eRvxunU .error-icon{fill:#552222;}#mermaid-svg-YrlTgwyA3eRvxunU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YrlTgwyA3eRvxunU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-YrlTgwyA3eRvxunU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YrlTgwyA3eRvxunU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YrlTgwyA3eRvxunU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-YrlTgwyA3eRvxunU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YrlTgwyA3eRvxunU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YrlTgwyA3eRvxunU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YrlTgwyA3eRvxunU .marker.cross{stroke:#333333;}#mermaid-svg-YrlTgwyA3eRvxunU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YrlTgwyA3eRvxunU p{margin:0;}#mermaid-svg-YrlTgwyA3eRvxunU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-YrlTgwyA3eRvxunU .cluster-label text{fill:#333;}#mermaid-svg-YrlTgwyA3eRvxunU .cluster-label span{color:#333;}#mermaid-svg-YrlTgwyA3eRvxunU .cluster-label span p{background-color:transparent;}#mermaid-svg-YrlTgwyA3eRvxunU .label text,#mermaid-svg-YrlTgwyA3eRvxunU span{fill:#333;color:#333;}#mermaid-svg-YrlTgwyA3eRvxunU .node rect,#mermaid-svg-YrlTgwyA3eRvxunU .node circle,#mermaid-svg-YrlTgwyA3eRvxunU .node ellipse,#mermaid-svg-YrlTgwyA3eRvxunU .node polygon,#mermaid-svg-YrlTgwyA3eRvxunU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-YrlTgwyA3eRvxunU .rough-node .label text,#mermaid-svg-YrlTgwyA3eRvxunU .node .label text,#mermaid-svg-YrlTgwyA3eRvxunU .image-shape .label,#mermaid-svg-YrlTgwyA3eRvxunU .icon-shape .label{text-anchor:middle;}#mermaid-svg-YrlTgwyA3eRvxunU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-YrlTgwyA3eRvxunU .rough-node .label,#mermaid-svg-YrlTgwyA3eRvxunU .node .label,#mermaid-svg-YrlTgwyA3eRvxunU .image-shape .label,#mermaid-svg-YrlTgwyA3eRvxunU .icon-shape .label{text-align:center;}#mermaid-svg-YrlTgwyA3eRvxunU .node.clickable{cursor:pointer;}#mermaid-svg-YrlTgwyA3eRvxunU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-YrlTgwyA3eRvxunU .arrowheadPath{fill:#333333;}#mermaid-svg-YrlTgwyA3eRvxunU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-YrlTgwyA3eRvxunU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-YrlTgwyA3eRvxunU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YrlTgwyA3eRvxunU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-YrlTgwyA3eRvxunU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YrlTgwyA3eRvxunU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-YrlTgwyA3eRvxunU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-YrlTgwyA3eRvxunU .cluster text{fill:#333;}#mermaid-svg-YrlTgwyA3eRvxunU .cluster span{color:#333;}#mermaid-svg-YrlTgwyA3eRvxunU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-YrlTgwyA3eRvxunU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-YrlTgwyA3eRvxunU rect.text{fill:none;stroke-width:0;}#mermaid-svg-YrlTgwyA3eRvxunU .icon-shape,#mermaid-svg-YrlTgwyA3eRvxunU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YrlTgwyA3eRvxunU .icon-shape p,#mermaid-svg-YrlTgwyA3eRvxunU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-YrlTgwyA3eRvxunU .icon-shape .label rect,#mermaid-svg-YrlTgwyA3eRvxunU .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YrlTgwyA3eRvxunU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-YrlTgwyA3eRvxunU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-YrlTgwyA3eRvxunU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 制造故障
物理接口与错误计数
LACP/Eth-Trunk成员
ESI/EAD与多归属角色
BGP EVPN控制面
MAC/ARP/Aliasing数据面
VTEP/NVE/VNI业务面
应用与回程
"是否全栈错误"不是可执行的排障结论,必须具体记录物理接口、LACP/Eth-Trunk、ESI/EAD、Active/Standby、DF、保护状态、EVPN Type 1/Type 2、Aliasing、MAC/ARP、VTEP/NVE/VNI、业务流和回程。
四、Underlay 探测与 Overlay 业务探测
Underlay Loopback Ping 成功,主要证明 Leaf 之间的 Loopback 路由和底层三层路径基本可达,不能直接证明 NVE、VNI、BD、EVPN MAC/IP 或业务转发正常。
同子网跨 VNI 失败,优先检查:
text
VLAN → BD → L2 VNI映射
NVE Peer
远端MAC/Type 2
ARP广播或代理ARP
二层出口和回程
跨子网跨 VNI 失败,在 Underlay 和 Overlay 基本可达后继续检查 Anycast Gateway、Tenant VRF、L3 VNI、Type 5 或相关 IP 前缀、三层路由和回程。
五、三类故障演练
| 演练场景 | 主要观察 | 常见业务表现 |
|---|---|---|
| 单条成员链路 Down | 接口、LACP、ESI/EAD、Aliasing | 部分旧流丢包,新流绕过故障成员 |
| Active Leaf 整机故障 | VTEP、Underlay、EVPN撤销、角色切换 | 更大范围中断,等待备用接管 |
| Peer-Link Down + Keepalive Up | 双主、Isolated、Disabled、DF、MAC Flapping | BUM可能被抑制,部分已知单播可能中断 |
六、用时间线定位中断窗口
应用 数据面 EVPN控制面 Leaf设备 探测端 应用 数据面 EVPN控制面 Leaf设备 探测端 #mermaid-svg-iFcxhZZUC61T9oYY{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-iFcxhZZUC61T9oYY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-iFcxhZZUC61T9oYY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-iFcxhZZUC61T9oYY .error-icon{fill:#552222;}#mermaid-svg-iFcxhZZUC61T9oYY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-iFcxhZZUC61T9oYY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-iFcxhZZUC61T9oYY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-iFcxhZZUC61T9oYY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-iFcxhZZUC61T9oYY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-iFcxhZZUC61T9oYY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-iFcxhZZUC61T9oYY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-iFcxhZZUC61T9oYY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-iFcxhZZUC61T9oYY .marker.cross{stroke:#333333;}#mermaid-svg-iFcxhZZUC61T9oYY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-iFcxhZZUC61T9oYY p{margin:0;}#mermaid-svg-iFcxhZZUC61T9oYY .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-iFcxhZZUC61T9oYY text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-iFcxhZZUC61T9oYY .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-iFcxhZZUC61T9oYY .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-iFcxhZZUC61T9oYY .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-iFcxhZZUC61T9oYY .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-iFcxhZZUC61T9oYY #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-iFcxhZZUC61T9oYY .sequenceNumber{fill:white;}#mermaid-svg-iFcxhZZUC61T9oYY #sequencenumber{fill:#333;}#mermaid-svg-iFcxhZZUC61T9oYY #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-iFcxhZZUC61T9oYY .messageText{fill:#333;stroke:none;}#mermaid-svg-iFcxhZZUC61T9oYY .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-iFcxhZZUC61T9oYY .labelText,#mermaid-svg-iFcxhZZUC61T9oYY .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-iFcxhZZUC61T9oYY .loopText,#mermaid-svg-iFcxhZZUC61T9oYY .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-iFcxhZZUC61T9oYY .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-iFcxhZZUC61T9oYY .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-iFcxhZZUC61T9oYY .noteText,#mermaid-svg-iFcxhZZUC61T9oYY .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-iFcxhZZUC61T9oYY .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-iFcxhZZUC61T9oYY .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-iFcxhZZUC61T9oYY .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-iFcxhZZUC61T9oYY .actorPopupMenu{position:absolute;}#mermaid-svg-iFcxhZZUC61T9oYY .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-iFcxhZZUC61T9oYY .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-iFcxhZZUC61T9oYY .actor-man circle,#mermaid-svg-iFcxhZZUC61T9oYY line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-iFcxhZZUC61T9oYY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} T0记录故障前连续探测T1检测接口或成员变化T2发布ESI/EAD或路径变化T3更新MAC/Aliasing/转发表T4 Ping开始恢复T5验证TCP或实际业务
text
检测时间 = T1 - T0
控制面收敛 = T2/T3 - T1
数据面恢复 = T4 - T3
应用恢复 = T5 - T4
这是分析模型,不是固定秒数。真实时间必须由日志、抓包、连续 Ping 和业务探测测量。
七、区分哈希不均与成员没有转发
可能是正常哈希不均:
text
所有成员均Collecting/Distributing
每个成员都有收发计数增长
增加不同源、目的和端口流后分布逐渐变化
没有成员被Suspend或保护性阻塞
可能是成员未实际转发:
text
成员虽显示Up,但不在有效收发状态
某成员长期无收发计数
不同流量反复测试仍完全不命中该成员
LACP Actor/Partner或Eth-Trunk状态异常
成员被Suspend、Inactive或多归属保护限制
验证步骤是:查看 Eth-Trunk 成员和 LACP 收发状态;查看各成员接口收发字节、包数和错误计数;使用多组源 IP、目的 IP、端口生成多条流;比较各成员计数是否都增长。所有成员有计数但比例偏斜,优先分析哈希分布;某成员始终无计数且状态异常,优先查聚合或保护。
八、课堂问答与批改
问题 1:为什么一次 Ping 成功不能证明故障切换已经完成?
我的回答:显示不完全,不知道是什么原因。
批改:正确方向。一次 Ping 只提供单个时间点和单个路径的证据,无法展示切换期间的丢包数量、持续时间、去回程差异、其他业务流状态或应用恢复状态。必须结合连续探测、时间戳和设备状态。
问题 2:单条服务器成员链路故障时,应该同时观察哪些状态?
我的回答:是否全栈错误。
批改:需要改成可执行的分层清单:物理接口、LACP/Eth-Trunk、ESI/EAD、Active/Standby 或保护状态、EVPN Type 1/Type 2、Aliasing、MAC/ARP、VTEP/NVE/VNI、业务流和回程。排障不能只写"全栈"。
问题 3:Underlay Loopback Ping 一直成功,但跨 VNI 业务 Ping 失败,优先怀疑哪一层?
我的回答:三层。
批改:范围不够。Underlay 已基本可达,优先进入 Overlay 服务层:同子网检查 BD/L2 VNI、NVE、MAC/ARP 和 Type 2;跨子网再检查 Anycast Gateway、Tenant VRF、L3 VNI、IP 路由和回程。
问题 4:Peer-Link Down、Keepalive Up 时,为什么要观察 Isolated、Disabled 和 MAC Flapping?
我的回答:广播重复消失,但部分已知单播暂时中断。
批改:正确。这个现象可能说明双主保护已经限制了一侧成员:BUM 重复被抑制,但有效单播出口减少,导致部分业务暂时中断。还要确认 Leaf 角色、Peer-Link、保护解除条件和 MAC 是否重新学习。
问题 5:两条 LACP 成员都 Up,但流量长期集中在一条链路,如何区分正常哈希不均和成员实际没有转发?
我的回答:不知道。
标准方法:检查成员是否 Collecting/Distributing,观察每个成员的收发计数,并用多组五元组流量重复测试。所有成员都有计数但比例偏斜,可能是正常哈希或流量模型集中;某成员长期无计数且状态异常,则优先怀疑 LACP/Eth-Trunk 或保护阻塞。
九、故障演练记录模板
text
实验名称:
工作模式:All-Active / Single-Active
故障对象:
故障动作:
T0 故障发生:
T1 物理状态变化:
T2 LACP/ESI状态变化:
T3 EVPN路径变化:
T4 MAC/ARP/Aliasing变化:
T5 Underlay探测恢复:
T6 Overlay业务恢复:
T7 应用恢复:
丢包数量和最长连续丢包:
是否出现MAC Flapping:
是否出现BUM重复:
最终根因和证据:
残余风险:
十、错误前提与修正
| 我的判断 | 问题类型 | 更准确的判断 |
|---|---|---|
| 一次 Ping 显示不完全 | 方向正确但不具体 | 用连续探测和时间线记录丢包、收敛和恢复阶段 |
| 是否全栈错误 | 不可执行表述 | 按物理、聚合、多归属、控制面、数据面和应用层逐项验证 |
| 跨 VNI 失败优先查三层 | 范围过宽 | 同子网先查 L2 VNI/BD,跨子网再查 L3 VNI/VRF/路由/回程 |
| 广播恢复但单播中断 | 正确现象 | 可能是双主保护限制成员,仍需验证角色和数据面 |
| 不知道如何判断哈希不均 | 知识缺口 | 看LACP有效状态、成员计数和多流测试结果 |
十一、今日复习卡片
text
一次Ping:单点证据,不是完整验收
连续探测:记录丢包数量和中断窗口
Underlay Loopback可达:不等于Overlay业务可达
同子网跨VNI:优先L2 VNI/BD/NVE/MAC/ARP
跨子网跨VNI:检查网关、L3 VNI、VRF、路由和回程
成员都Up:仍需确认Collecting/Distributing和计数增长
计数都有但比例偏斜:可能是哈希分布
某成员无计数且状态异常:优先查LACP或保护阻塞
十二、今日状态
第 21 天课程完成:能够设计多归属故障演练,使用分层状态和时间线定位中断窗口,并能区分 Underlay 探测、Overlay 业务和应用恢复。下一课继续做一套完整的 All-Active/Single-Active 故障演练题,要求写出预期现象、验证命令类别和最终根因证据。