
凌晨三点值班手机从床头柜弹起来——机房核心路由器主控板告警业务闪断。我一边往单位赶一边祈祷那台双主控设备能无缝切换。可惜切换虽然完成BGP邻居却震荡了近三分钟。那晚之后我才真正搞懂NSRNon-Stop Routing不间断路由也才真正意识到“硬件双主控”和“切换无中断”之间的距离有多远。这篇文章不是名词解释而是把我从原理、机制、配置到踩坑的完整过程整理出来给同样负责核心网络稳定性的同行做个参考。如果你在备考网络认证或者刚接手一台带双主控的路由器/交换机建议按顺序读完再回到机房对照设备逐条验证。全文按这个思路走NSR要解决什么问题、它的状态同步底层机制、思科和华为平台的配置要点、我实际遇到的三类故障、以及最后如何用一次故障演练来证明NSR真的“无感”。1. 传统双主控方案的软肋切换那几秒为何必然卡一下1.1 “双主控”只是多了一颗备用的“大脑”很多网络设备在宣传“双主控”时给客户的预期是“坏了也能自动顶上去”。这句话没错但顶上去的过程远没有想象中平滑。主控板跑的是路由引擎所有路由协议进程、RIB路由信息库、以及和邻居保持的会话状态都在它肚子里。正常情况下备用主控虽然在待命但它多数时候只是“配置同步了”并没有完整“运行状态同步”。这就像一个长途航班配了两套机组主机组中途全倒下备用机组虽然拿着同一份飞行手册但他们完全不清楚当前航向、高度、油量、塔台刚才说了什么。要接手就得从头读一遍飞行状态、重新和塔台建立沟通——在空中管制体系里这段时间是绝对的风险窗口。对应到网络里主用主控故障后备用主控需要先把路由协议进程拉起来重新和所有邻居建立BGP/OSPF/IS-IS会话重新接收一遍路由通告再把转发表下发到线卡。这个过程快则几十秒慢则几分钟。核心路由器上动辄几万条路由每条路由的收敛都意味着一次转发路径的重算业务不闪断才是怪事。所以双主控本身解决的是“有没有备用大脑”的问题而不是“切换时业务不中断”的问题。要想让切换真正做到无感必须从“运行状态”层面解决这正是NSR出场的理由。1.2 NSF/GR的补救思路让邻居“等我一下”在NSR成熟之前业界最常用的高可用方案是NSFNon-Stop Forwarding和GRGraceful Restart优雅重启。它们的核心思路类似主控切换瞬间通知邻居“我这边路由进程要重启一下你暂时别删我通告给你的路由也别着急重算路径”。邻居设备收到这个信号后会在本地保持原路由一段时间直到重启完成、路由重新同步。这个方案在实际网络里确实能减少切换造成的不可达时间但它有两个先天缺陷第一它强依赖邻居配合。你自己开了GR但对端设备不一定支持或者管理员没有开启相应的GR能力那切换发生时对端照样把路由一秒删光一切回到原点。第二GR期间整个路由域处于一种“半冻结”状态。网络里任何拓扑变化、链路抖动在GR窗口内都可能被错误处理因为邻居以为你还在你却已经断了。曾见过一个客户核心设备切完以后对端OSPF倒是等了45秒可45秒里旁边的两台设备因为收到新的LSA把自己这边的路由算出了环最后是全网路由振荡收场。我拿这些历史方案做铺垫是想说明一件事NSR不是NSF的简单升级而是把“切换后重新建立”变成“切换时已经拥有”这是高可用设计思路的质变。2. NSR的底层原理把“状态”而不是“配置”实时搬到备用主控2.1 状态同步到底同步了哪些东西NSR的全称是Non-Stop Routing翻译过来是“不间断路由”。它的本质是让备用主控在待命期间就完整持有主用主控的所有路由协议运行状态主控故障时直接接管不需要重新学邻居、不需要重新收敛。通俗地说以前的备机是一张考卷的“备份答题卡”NSR是让备机在考试进行中随时同步你写下的每一个字你突然失忆它能接着你停下的进度继续答。具体到要同步的状态牵扯的东西比大多数人想象得多协议邻居状态机BGP的Established状态、OSPF的FULL状态、IS-IS的UP状态必须逐项搬到备机路由数据库BGP的RIB包括所有收到的原始路由和选路结果、OSPF的LSDB链路状态数据库、IS-IS的LSPDBTCP连接状态BGP跑在TCP之上TCP的序列号、确认号、滑动窗口、重传队列都得保持一致否则主备切换后对端设备发现TCP的序列号对不上立刻断开会话重建FIB/CEF转发表路由协议只是控制面真正让报文转起来的是硬件转发表。NSR要求转发表也在主备之间完成同步这样切换后线卡才能立即以新路由表转发。这里我想强调一个非常容易误解的点很多人以为NSR做的是“配置同步”。其实不是配置同步只是基础中的基础NSR同步的是“运行状态”。配置一样不等于状态一样。两个主控跑着完全相同的BGP进程但一个已经和邻居建立会话、收了几万条路由另一个才刚启动、路由表还是空的——它们的状态天差地别。2.2 批量同步与增量同步两条腿走路主备之间建立同步关系后第一步是全量同步。备机要把主机当前的邻居表、路由表、LSDB全部拉一遍这个阶段通常由设备内部的高速同步通道完成。路由条数少几秒钟搞定如果核心设备承载几十万条BGP路由全量同步可能需要数分钟。全量同步完成后进入日常的增量同步阶段。增量同步是事件驱动的主机收到一条新的BGP Update立刻把这个增量推给备机OSPF的LSA发生变化同样实时推送。备机的状态因此始终跟主机保持“几乎零延迟”的一致。这里有个容易被忽略的细节增量同步的实时性决定了NSR在切换那一刻是否可靠。如果主备之间的同步通道拥塞或者备机处理不过来状态就会出现窗口期滞后。所以在生产环境里我看到有经验的工程师都会单独监控NSR的同步状态而不是只关注“有没有配成功”。另外同步通道一般走设备内部背板或独立管理通道不会占用业务接口的带宽。但这不是绝对的部分虚拟化/软件转发设备在实现上可能共享部分资源部署前要看产品文档确认。2.3 主备脑裂的防范谁才是唯一的“主”双主控系统还有一个隐藏风险——脑裂。如果主备之间的心跳链路短暂中断两个主控都可能认为对方失联从而都把自己提升为主角色双双运行路由协议、双双响应邻居。对邻居来说突然出现两个相同AS、相同Router-ID的活跃会话路由震荡几乎是必然的。为了防止这种情况设备厂商在主备角色切换上做了大量保护硬件层面的控制权锁比如思科体系里的RPLRouter Processor Lock让备用主控在没有拿到硬件授权前绝对不能“篡位”心跳检测上也会做多路冗余避免单点误判。这些机制虽然不需要用户在NSR配置里显式处理但理解它非常有用。主备切换异常的案例里相当一部分不是NSR本身的问题而是角色选举、心跳检测、硬件锁配合不当导致的。你把NSR配好了结果脑裂保护先失效那再好的状态同步也白搭。3. 实战配置思科与华为平台的NSR部署要点3.1 思科IOS XR一条命令开启背后的硬条件思科在IOS XR平台上对NSR的支持比较完整BGP、OSPF、IS-IS都可以配置。以最常见的BGP和OSPF为例配置量其实很小router bgp 65000 nsr ! router ospf 1 nsr命令确实只有两三条但别高兴太早。NSR生效的前提是设备必须是双RP或双主控架构并且主备RP共用一套可同步的软件版本。单主控设备即使敲了这条命令也不会有实际效果部分版本还可能直接拒绝配置并提示硬件不支持。配置完成后验证命令同样简洁show bgp nsr show ospf nsr重点关注输出里的同步状态正常应该看到类似“NSR state: Active/Standby fully synchronized”这样的信息。如果显示Synchronizing或Stale说明还处在全量同步阶段这时候切主备是没保障的。3.2 华为VRP配置几乎对称注意平台差异华为VRP平台同样把NSR叫做“不间断路由”配置思路和思科高度相似。BGP和OSPF的示例bgp 65000 nsr enable # ospf 1 nsr enable验证命令display bgp nsr display ospf nsr需要注意的是华为支持NSR的主要是NE系列路由器、CE系列数据中心交换机等具备双主控能力的产品低端盒式设备一般不支持。一些虚拟化平台如华为的VRP模拟环境虽然能敲命令但不会真正执行主备状态同步这一点在实验时务必留意别把模拟器的表现当真机来预期。3.3 部署前必须逐项核对的硬性条件配置NSR之前建议先过一遍我整理的这个检查表。漏掉任何一项都可能让上线后的“无缝切换”变成“有缝事故”。检查项具体要求硬件冗余双主控/双RP、双电源建议同型号同批次软件版本设备系列与版本明确支持NSR且主备软件版本一致配置一致性主备RP的配置必须完全一致路由策略、过滤列表也要一致资源余量备RP有足够CPU和内存承载全量协议状态大型网络尤其注意内存同步状态监控能够持续监控主备同步状态并能触发告警切换验证方案有明确的维护窗口、切换测试步骤和回滚方案4. 配置完NSR不等于万事大吉我实际遇到的三类问题4.1 只给BGP开了NSROSPF在切换时“拖后腿”我第一次在生产环境部署NSR时只给BGP配置了NSROSPF没有配。当时想的是“核心跑的是BGP先把BGP保护起来最重要”。结果第一次演练就翻了车主备切换完成后BGP邻居确实完全无感但OSPF那边开始重新收敛路由几秒钟内大面积抖动BGP的下一跳跟着失效业务照样断流。那次之后我总结了一条铁律NSR的覆盖范围必须覆盖全量关键路由协议。BGP再稳下一跳挂在OSPF上OSPF一收敛BGP路由照样变黑洞。正确的做法是评估这台设备上所有路由协议能开NSR的全部开开不了的也要通过其他机制比如静态路由、BFD联动补齐高可用。4.2 主备路由策略不一致切过去丢了半张路由表第二个坑更隐蔽。某台设备的主用RP和备用RP在初始配置时是一致的但后来为了临时调测在主用RP上加了一条route-policy只改了主用没同步到备用。当时业务正常谁也没在意。几个月后设备切换备用RP接管。结果路由前缀数量从原来的八万多条直接掉到六万条。一查问题就出在那条只存在于主用RP的route-policy备用RP因为没有这条策略对其他前缀的接收逻辑变了本地BGP表缺了将近两万条路由。排查链路供参考先对比切换前后的BGP表大小判断是邻居断开还是策略过滤再看BGP邻居会话状态排除会话问题最后逐条比对主用和备用RP的route-policy、route-map、prefix-list揪出差量。这个案例给我们的教训是NSR的前提是主备配置一致但一致性不是靠“手工小心”而是靠自动化的配置比对和定期巡检。手工同步配置迟早会漏。4.3 全量同步没完成就切换NSR“集体失忆”第三个问题出在对NSR同步机制的理解不足。主备RP重新建立同步关系后会先跑全量同步这个窗口期的长短和路由规模直接相关。某次我们在实验室测试设备刚加载完配置同步状态还在Synchronizing我就急着验证切换效果。结果切换瞬间备用RP虽然拿到了控制权但BGP路由表只有一半转发自然也跟着断断续续。其实设备界面上已经显示了同步未完成的提示是我忽略了。从那以后我的流程固定成三步先确认同步状态为“已同步”再记录当前主备角色最后才执行切换。而且监控脚本里也会对“Synchronizing”状态做告警避免在窗口期内遭遇意外切换。4.4 别忽略备用主控的CPU和内存余量还有一个容易被低估的问题NSR要求备用主控在待命期间也完整运行各路由协议进程并且要持续接收增量状态。这在大规模网络里是实打实的CPU和内存开销。曾经遇到一台跑了二十万条BGP路由的设备启用NSR后备用主控的内存使用率飙到接近90%增量同步开始出现延迟最终影响到主备一致性。这类问题光看配置看不出来得靠持续的指标监控。建议在启用NSR后将备用主控的CPU、内存、同步队列深度都纳入重点监控并设置比主用主控更高的告警阈值。内存扩容或者清理无用路由条目有时比硬调参数更管用。5. 怎么证明NSR真的“无感”一次完整的故障演练5.1 演练前的准备清单配置验证和设备状态确认都不能替代真正的故障演练。我的习惯是每次新设备上线或大规模变更后都安排一次主备切换演练。准备工作按这个清单走向所有相关方申请维护窗口明确演练窗口、回滚条件确认备用主控的NSR同步状态为“已同步”记录当前主备角色和切回策略在对端设备记录BGP邻居Uptime和当前前缀数量在关键路径上部署持续连通性测试比如持续的ping、业务流量压测准备好监控和日志采集手段演练全程留存数据。对端BGP邻居的Uptime是验证NSR效果最直观的证据。如果NSR真的生效主备切换后对端看到的BGP会话Uptime应该是连续的一秒都不掉。反之只要Uptime重置说明TCP会话和BGP状态还是断了NSR在那一刻并没有起到应有的作用。5.2 执行切换的两种方式实验室里最常用的切换命令是思科IOS XRredundancy switchover华为VRPNE等产品slave switchover具体以设备版本命令手册为准这种方式安全、可回退适合常规演练。另外一种激进的方式是直接拔主用主控板或者强制主控板掉电。这种方式能模拟最真实的硬件故障场景但风险也更高适合在业务窗口充足、回滚方案齐备的前提下进行而且尽量别在真实业务高峰期做。我个人的建议是第一次演练用命令切换验证NSR状态同步和协议连续性确认没有异常后再择机做一次物理层面的故障模拟。两种方式的测试结果都合格才敢说这台设备的NSR“能打”。5.3 切换后的验证顺序切换完成后按下面的顺序看数据不要一上来就抓路由表容易漏掉关键信息对端设备BGP邻居的Uptime是否连续——这是第一判断依据本端和对端的路由前缀数量是否和切换前一致差异超过预期就要排查持续连通性测试是否出现丢包或中断traceroute关键路径确认转发路径没有异常检查NSR同步日志和主备角色切换记录确认切换过程是否符合预期如果一切正常把主备切回原状再重复一遍验证流程。切回动作同样要谨慎。我见过有人在切过去之后急着恢复原状结果因为没等备用主控完成同步就再次切换反而制造出一次小范围闪断。所以切回前务必再次确认同步状态已经“已同步”。5.4 多次演练后的一个心得做过几十次主备切换测试之后我的体会是NSR的效果好不好不取决于配置有多华丽而取决于你有没有在“最差的时间点”测试它——比如同步窗口期、高峰期流量、同时发生链路故障时。真正稳定的核心网不是一次完美切换换来的而是靠一次次在恶劣条件下验证出来的。6. NSR、NSF、GR到底怎么选一张表说清楚6.1 三种高可用技术的对比很多同行会把NSR、NSF、GR混为一谈其实它们在实现原理和适用场景上差异明显。对比维度NSRNon-Stop RoutingNSF/GRNon-Stop Forwarding / Graceful Restart是否需要邻居配合不需要需要邻居开启GR能力并配合等待对端设备感知完全无感知对端会收到重启信号并等待切换时协议收敛无收敛存在短暂等待和重新收敛对硬件要求高必须双主控/双RP中GR可部分兼容单主控场景配置复杂度中低同步内容协议运行状态转发表主要靠对端保持状态适用场景核心网、骨干、大型DC网关接入层、汇聚层、小规模网络6.2 我的选型建议核心层和设备纵向汇聚位置只要硬件支持直接上NSR。接入层和分支节点用GR/NSF完全够用过度设计反而增加维护复杂度。预算允许的前提下把省下来的精力放在故障演练和状态监控上这比多配一个NSR更有价值。如果混合部署比如核心是NSR接入是GR只要接入设备在故障时不会误删核心通告的路由这套组合是可以正常工作的。因为NSR不依赖邻居能力它自己就能独立完成状态接管对端的GR配不配置都不影响它的效果。但从整体网络稳定性出发能开GR的设备顺手都开上让整个路由域处在同一套高可用语境里排障时反而少一些变量。6.3 一个值得注意的细节NSR与GR可以共存有一个细节值得展开NSR和GR并不是非此即彼。在支持两者的平台上它们可以同时启用。NSR负责主备切换时本端无缝接管GR负责在对端故障时让本端保持路由。两者互补一个管“自己切换”一个管“对方切换”作用在不同方向上。我在实际配置里通常都会同时打开这样无论是本机主控故障还是对端设备重启路由在故障期间都不会出现大的抖动。但要注意GR的配置对两端必须匹配最好全网统一否则会出现一端发了Graceful Restart请求另一端根本不响应的情况。最后说一点个人体会。我自己在现网里配置、验证、排障NSR也有几年了最大的感受是NSR本质上是把“高可用”从口号变成了可验证的事实。它不需要邻居配合、不需要路由协议重新收敛、切换时对端甚至感觉不到主控换了主人这种“无感”带来的安全感是传统冗余方案给不了的。但也要记住NSR不是免死金牌它依赖同步状态、硬件条件、配置一致性任何一个环节掉链子它都不会替你兜底。所以我的习惯是每次巡检都看一眼NSR的同步状态每次变更后都做一次切换演练把“切换无感”当成一个需要持续维护的指标。如果你也管着一台承载核心业务的路由器建议明天就把NSR状态检查加进你的监控脚本并且和同事约定好每季度至少做一次主备切换验证。多测一次心里就多一分底气。