一次OSPF路由震荡导致跨机房业务间歇性中断的排查实录
问题背景
周一早晨8:15,IT运维组值班手机开始收到一连串业务投诉——总部办公区(DC-A)用户访问部署在分支机房(DC-B)的ERP系统时,页面每隔5~8分钟就会出现约30秒的”卡死”现象:页面加载超时、报表查询报错、部分用户甚至看到502 Bad Gateway。受影响用户约180人,集中在财务和采购部门,这两个部门对ERP依赖度最高,故障紧急度评级P1。
DC-A与DC-B之间通过10Gbps专线互联,核心交换机之间建立OSPF Area 0邻接关系,各机房内部使用Area 1/2。两机房BGP使用各自AS号(65001/65002),通过OSPF学习对方的互联地址作为BGP下一跳。正常情况下,OSPF邻接稳定,BGP路由下一跳始终可达,跨机房流量畅通无阻。
故障持续时间约2小时,期间ERP服务本身运行正常(DC-B内部用户无任何异常),问题明确指向跨机房网络层面。
故障现象
监控层面:Zabbix采集的ERP前端响应时间曲线呈现明显的周期性尖刺——基线200ms,每5~8分钟突然飙至3000ms以上,持续约30秒后回落。对应时段,Grafana上的跨机房TCP连接数从稳态的120条骤降至0,HTTP 5xx错误率同步跳升。
用户层面:财务部张经理反馈”9:00打开应付账款页面卡了半分钟,刷新后又好了,过几分钟又卡”;采购部多人报告提交采购单时超时报错。
网络层面:在DC-A核心交换机(CE6850-01)上持续观察BGP路由表,发现DC-B侧的172.16.0.0/16网段路由在反复出现和消失:
1 | <CE6850-01> display bgp routing-table 172.16.0.0 |
BGP路由的下一跳10.0.0.2是DC-B核心交换机的互联地址,通过OSPF学习。当OSPF邻接断开时,10.0.0.2的路由消失,BGP判定下一跳不可达,撤销172.16.0.0/16路由;OSPF邻接恢复后,下一跳重新可达,BGP路由重新生效。这正是典型的”OSPF驱动BGP路由震荡”模式。
排查过程
第一步:确认故障范围与定性
第一时间在DC-A核心交换机上Ping DC-B互联地址:
1 | <CE6850-01> ping 10.0.0.2 repeat 100 |
Ping结果呈现周期性超时——连续5~6个包超时后恢复,与业务监控的尖刺周期吻合。用大包测试进一步确认:
1 | <CE6850-01> ping 10.0.0.2 size 4000 repeat 50 |
小包丢包率远低于大包,这提示物理层可能存在误码问题——小包CRC校验通过的几率更高,大包更容易被误码破坏。
第二步:检查OSPF邻接状态
1 | <CE6850-01> display ospf peer |
开启OSPF事件调试进一步观察邻接变化细节:
1 | <CE6850-01> debugging ospf event |
OSPF邻接从Full断到Down再到恢复Full,整个过程约25~30秒,与业务中断时长一致。关键信息是Receive bad hello seq——收到了错误的Hello报文序列号,说明Hello报文在传输过程中被损坏。
第三步:检查物理接口状态
这是最关键的一步。查看互联端口GE1/0/1的统计信息:
1 | <CE6850-01> display interface GE1/0/1 |
CRC错误计数3847,而且每分钟还在增长约50~60个!端口当前状态是UP(没有进入error-disable),但持续增长的CRC误码意味着大量报文在物理层被损坏——OSPF Hello报文、DD报文、LS Update报文都可能被CRC校验失败丢弃,导致邻接关系反复中断。
查看DC-B侧的对应端口,同样有CRC计数增长:
1 | <CE6850-02> display interface GE1/0/1 |
双向CRC错误都在增长,基本排除了单端交换机端口硬件故障的可能性,指向中间的物理链路——光纤本身或接头。
第四步:排查光纤链路
DC-A与DC-B之间10G专线通过ODF(光纤配线架)跳接,路径为:CE6850-01 GE1/0/1 → LC光纤 → ODF-A M3/V3 → 室内光缆 → ODF-B M3/V3 → LC光纤 → CE6850-02 GE1/0/1。
先在交换机上开启光功率监测:
1 | <CE6850-01> display interface GE1/0/1 transceiver |
两端收光功率均偏低约3dBm,光衰偏大。15km LR模块正常光衰应在6~8dB,实测12dB明显偏高。这说明链路中存在额外的光损耗点。
第五步:定位光损耗点
联系机房驻场同事到ODF架现场检查。同事反馈:ODF-A侧M3/V3端口的LC适配器内积有明显灰尘,尾纤插入时感觉松动。用光纤端面检测仪(Fiber Microscope)观察该适配器:
- 适配器内芯有黑色颗粒污染物
- 尾纤端面也有轻微划痕和灰尘
这就是CRC误码的物理根因——适配器污染导致光纤端面之间存在空气间隙和散射,部分光信号在接头处被反射和散射(高回波损耗+高插入损耗),接收端收到的光信号功率偏低且带有失真,导致CRC校验失败。
同事用光纤清洁笔(One-Click Cleaner)清洁适配器内芯和尾纤端面后,重新插接:
1 | <CE6850-01> display interface GE1/0/1 transceiver |
同时CRC计数停止增长,Ping大包测试丢包率归零:
1 | <CE6850-01> ping 10.0.0.2 size 4000 repeat 100 |
OSPF邻接立即恢复稳定:
1 | <CE6850-01> display ospf peer |
BGP路由恢复稳定,ERP访问恢复正常,故障解除。从发现CRC异常到清洁光纤接头,整个过程约40分钟。
解决方案
紧急止血
- 清洁光纤接头:用One-Click Cleaner清洁ODF-A M3/V3适配器内芯和对应尾纤端面,重新插接后光功率恢复正常,CRC误码消失
- 重置接口计数器:执行
reset counters interface GE1/0/1清零CRC计数,便于后续观察是否复发
根治措施
- 更换退化适配器:ODF-A M3/V3的LC适配器因长期插拔和污染,内部陶瓷套管已有轻微磨损,更换为新的LC双芯适配器
- 更换受损尾纤:端面有划痕的尾纤更换为新尾纤,旧尾纤端面划痕无法修复
- OSPF稳定性增强:调整OSPF Hello间隔和死亡间隔,增加邻接容错能力:
1 | interface GE1/0/1 |
- BGP震荡抑制:配置BGP路由衰减(route dampening),防止震荡路由反复注入转发表:
1 | bgp 65001 |
- 物理层监控:在Zabbix添加CRC计数器监控项,设置阈值告警:
1 | 监控项: snmp.get[ifInErrors.{#IFINDEX}] // CRC错误计数 |
- 光功率监控:通过SNMP采集光模块收发功率,设置偏差告警:
1 | 监控项: optical.rxpower[GE1/0/1] |
根因分析
本次故障的根本原因是ODF光纤适配器内芯污染导致的光信号衰减和失真,进而引发CRC误码→OSPF报文丢弃→邻接断建→BGP下一跳可达性波动→路由震荡→业务间歇中断,形成了一条从物理层到应用层的完整故障传导链。
适配器污染的原因有二:
- 日常维护不规范:机房ODF架近期有其他业务割接施工(周三新增一条2.5G专线),施工人员在ODF架操作时拔插了相邻M3/V3端口的尾纤用于测试,插回时未清洁端面,将手指油脂和灰尘带入适配器内芯
- 缺乏端面清洁SOP:团队光纤操作规范中没有”插接前必须清洁端面”的强制要求,日常巡检也不检查ODF适配器清洁度
光功率从-6.8dBm退化到-14.2dBm(增加了约7dB损耗),恰好是污染适配器造成的额外插入损耗。这个损耗水平尚在光模块接收灵敏度范围内(-20dBm),所以端口没有down,但信号质量已经劣化到足以产生大量CRC错误——这就是”端口UP但业务断”的典型场景。
预防措施
光纤操作SOP:制定并强制执行《ODF光纤操作规范》——任何拔插光纤操作必须先用One-Click Cleaner清洁端面和适配器,操作前后用端面检测仪确认清洁度。将此规范纳入变更管理流程,割接方案必须包含光纤清洁步骤
ODF适配器防护:空闲端口必须安装防尘帽,施工结束后检查相邻端口防尘帽是否完好。ODF架门保持关闭,减少灰尘侵入
物理层监控体系:将CRC错误计数和光模块功率纳入核心监控,设置分级告警阈值。CRC错误是物理层故障的”早期信号”——远比端口down更早出现,做到故障预警而非故障后才发现
光纤巡检制度化:每季度对所有ODF架做一次光功率测试+端面检测,记录光衰基线数据。光衰异常增长>2dB的链路标记为”需维护”,安排清洁或更换
OSPF/BGP震荡防护:核心互联链路OSPF参数适当放宽(Hello 15秒、Dead 60秒),为物理层短暂抖动提供缓冲窗口;BGP开启route dampening,抑制震荡路由对转发表的反复冲击
跨机房业务连续性增强:评估增加DC-A到DC-B的第二条互联链路(冗余路径),当主链路OSPF震荡时流量自动切换到备用链路,消除单链路故障对业务的影响
总结
这次故障的教训是:物理层的微小退化可以引发网络层的大规模震荡。一个ODF适配器里几粒灰尘,让光衰增加7dB,CRC误码飙升,最终导致180人的ERP服务反复中断2小时。
排查的关键转折点是在接口统计中发现CRC错误计数持续增长——如果只看端口状态(UP),永远找不到根因。这也提醒我们,网络监控不能只盯着”端口UP/DOWN”和”带宽利用率”,CRC错误、光功率这些物理层指标同样是核心监控项,而且往往能提前预警。
OSPF→BGP的震荡传导机制也值得牢记:当BGP下一跳依赖OSPF路由时,OSPF邻接的任何抖动都会直接传导到BGP路由层。在核心互联设计中,要么让BGP下一跳不依赖OSPF(比如用直连地址做下一跳),要么给OSPF足够的容错参数,要么开启BGP dampening抑制震荡——三条防线缺一不可。
最后,光纤端面清洁这个看似琐碎的操作,实际上是机房物理层可靠性的基础。一根未清洁的尾纤,可能就是下一次P1故障的起点。