尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SRv6 Policy + BGP:数据中心间网络可靠性设计与毫秒级切换

SRv6 Policy + BGP:数据中心间网络可靠性设计与毫秒级切换 凌晨两点值班手机像闹钟一样炸响——接入交换机到核心设备的链路挂了BGP会话开始震荡两个数据中心之间的流量绕行业务超时工单雪片一样砸过来。网络工程师最怕的不是故障本身而是故障之后全网进入未知状态流量走了哪条路还有没有冗余切换要多久如果这套链路设计的时候就没规划好这一夜基本就交代了。数据中心宕机动辄以百万为单位计损失而其中相当一部分宕机并非硬件损坏而是网络层收敛不及时、路径不可控、预案缺失导致的次生灾害。这篇文章要聊的数字守护神并不是某个神秘硬件盒子而是一套以SRv6 Policy BGP为核心的数据中心间网络可靠性方案尤其是单CP多List场景下的路径设计与切换机制。它能做的事是在链路质量下降或节点故障时把流量在毫秒级内切到健康路径上让业务无感知。这篇文章适合正在规划数据中心间互联、或者已经被跨DC链路折腾过、想彻底解决路径不可控问题的网络工程师阅读。1. 先捋清楚数据中心宕机网络层到底背了多少锅1.1 宕机事故里网络侧常见的三种帮凶很多非网络专业的人一听说数据中心宕机第一反应是服务器宕了、数据库崩了、电力出问题了。但从我处理过的大量故障复盘来看网络层即便不是第一责任人也经常是帮凶——它放大了故障、延长了恢复时间、甚至阻断了本该成功的切换。第一种典型场景是链路故障后的路由收敛慢。两个数据中心之间跑着OSPF或BGP物理链路一断协议需要重新计算路由。IGP收敛通常还好但如果是跨域的大规模网络BGP的收敛时间可能长达数十秒。对于在线交易、实时同步这类业务几十秒的断流已经是灾难性事故了。第二种典型场景是ECMP等价多路径的哈希不均。很多传统网络用ECMP做负载分担看似有两条物理链路但流量的五元组哈希结果可能把大部分流量都打在同一条链路上另一条链路利用率不到10%。一旦主链路发生拥塞或故障大量TCP连接同时超时重传应用层直接雪崩。第三种也是最隐蔽的是业务流量绕远路。物理拓扑明明有A到B的直达链路但因为路由策略、下一跳优先级配置不合理流量走了A-C-B的迂回路径时延翻了三倍数据库主从同步延迟飙升最终触发主从切换或业务锁等待超时。这种问题在监控面板上不容易暴露只有当业务投诉变卡了才开始排查往往已经造成实际损失。1.2 传统可靠性手段为什么在大型DC互联场景里不够用传统网络做可靠性无非三板斧冗余链路 动态路由 BFD快速检测。这套组合在中小规模网络里够用但在大型数据中心之间有它的硬伤。冗余链路没问题关键问题在于不可控。IGP选路规则是算出来的不是你指定的你很难精确控制备份流量一定走哪条物理路径。BFD可以把检测时间压到几十毫秒但BFD检测到故障之后流量的切换依赖路由收敛IGP收敛加表项刷新快则几百毫秒慢则几秒。最关键的是传统路由模型是逐跳决策的——每一跳路由都不知道端到端的完整路径所以一旦某条路径上的中间设备策略不一致就可能出现黑洞或环路。我在一次跨DC故障里就遇到过这样的场景两条物理专线分别通过两台核心路由器接入OSPF配置没有任何问题但故障时流量没有走到备份链路上而是从核心路由器绕到了另一台汇聚设备再折返形成了隐藏环路抓包抓了整整三个小时才定位。这种场景用传统路由协议很难优雅解决因为你缺少一个端到端路径控制的手段。1.3 为什么是SRv6 Policy BGP这对组合选择SRv6 Policy不是因为它新而是因为它解决了上面三个痛点第一SRv6 Policy是显式路径。你可以在源节点明确指定一条完整的Segment List路径流量严格按这个路径走想从哪走就从哪走不存在绕远路和不可控问题。第二它天然支持多路径与快速切换。一个Policy下可以挂多条Segment List形成主备或多活路径配合BFD检测和快速重路由FRR切换时间可以稳定控制在毫秒级。第三它和BGP配合得很好。在大型数据中心之间BGP本来就是承载路由事实标准SRv6 Policy的候选路径可以通过BGP SR Policy地址族下发也可以通过控制器Netconf统一部署网络工程师不需要改变现有的BGP路由体系只是在它之上叠加一层路径控制面。这对组合实际解决的问题用一个不严谨但容易理解的类比传统路由像出租车自己挑路走走哪条全看司机经验SRv6 Policy像你用地图App规划三条备选路线并人为选路其中一条堵车立刻切换另一条路径完全在你掌控之内。数据中心之间的流量恰恰最需要这种掌控力。2. 核心设计拆解单CP多List场景到底在解决什么问题2.1 SRv6 Policy的基本构成CP、SList、BD在深入配置之前先把SRv6 Policy里最核心的几个名词吃透否则后面的配置片段看起来像天书。一个SRv6 Policy由以下要素构成Policy策略本质是一个虚拟隧道代表从源节点到目的节点的某一类流量转发规则。它通常有颜色Color和端点Endpoint两个关键标识。Color可以理解成业务等级的标签——金色、银色这样的优先级Endpoint则是目的节点的IPv6地址。Candidate Path候选路径简称CP每个Policy下可以有多个候选路径每个候选路径有一个优先级Preference。高优先级的候选路径是主用路径低优先级是备用路径。候选路径的有效性取决于它引用的Segment List是否可用。Segment List段列表简称SList候选路径下面挂的具体路径由一条有序的SRv6 SIDSegment Identifier列表构成每条SID代表路径上的一个转发指令点。SList才是真正告诉设备流量按这个顺序走的东西。Binding SID绑定SID简称BSIDPolicy头端分配的一个本地SID下游设备或控制器引用这个BSID时就可以把流量引导到这个Policy里来而不需要感知Policy内部细节。需要特别留意的是单CP和多List的关系。我们说单CP多List场景就是指某个Policy下只配置了一条候选路径但在这一条候选路径下面挂了多个Segment List。这跟多CP每条CP挂一个SList的设计意图和转发行为是完全不同的。2.2 单CP多List的两种意图负载分担与主备共存从转发表项的角度来看一个候选路径下的多个SList是同时生效的。设备会根据各个SList配置的权重Weight做流量的负载分担。这是单CP多List和主备CP最大的区别——主备CP是只有一条生效CP失效才切换而单CP多List是所有SList同时工作各分担一部分流量。实际工程里单CP多List通常有两种意图第一种是纯负载均衡。两条SList分别对应两条物理直达路径权重各是1流量平摊。这种场景对链路利用率的提升非常明显尤其是两条链路带宽不对称的时候你还可以通过调整权重来比例分配流量。第二种是主备混合。比如两条SList里一条是低时延的直达路径一条是绕行路径我们并不想两条平摊流量而是希望主路径多走、备用路径只兜底。这时你可以把主路径的权重设成100备用路径权重设成1在正常状态下流量几乎全部走主路径一旦主路径SID失效备用路径SList会接住全部流量。这其实是软主备——从控制面看只有一条CP但从数据面看有两条可用的路径。我在规划数据中心互联时更倾向于第二种——权重倾斜 双活可用。因为大部分业务流量是希望确定性走低时延路径的但又不想因为路径失效就彻底断流这才符合数据守护神的定位平时不争抢流量关键时刻一定兜底。2.3 初始两条SList的设计思路路径怎么选、SID怎么定热词里提到的初始两条slist是开局配置时的关键动作。这两条SList不是拍脑袋定的我在实际项目中按以下顺序来设计第一步先画物理拓扑图标出两个数据中心之间的所有可达物理路径。假设DC-A到DC-B之间有两条专线一条直连物理链路路径A一条经中转城市C的链路路径B。路径A时延5ms路径B时延11ms。第二步为每条物理路径规划SRv6 SID列表。路径A如果全程直接可达那么SList可能只需要一个End SID末端节点SID甚至使用Steering模式直接引流到Policy路径B如果经过中转节点CSList就需要至少两个SID一个是DC-C的End SID用于引导流量到C一个是DC-B的End SID用于最终出节点。这里的关键转折是SID列表的深度决定了路径的确定性。列出的SID越多路径越确定但封装的SRHSegment Routing Header越深、转发开销越大。两跳以内优先用浅封装超过三跳的业务建议和控制器协作用Binding SID做层次化压缩。第三步给两条SList设置权重。我的建议是主路径低时延路径权重设置为100备用路径设置为1而不是简单地1:1负载分担。原因是跨DC场景里业务往往对时延敏感平摊流量会拉高平均时延并引发应用层抖动。权重1保证了备用路径上始终有心跳流量在探测但正常状态几乎不承载业务。设计阶段还有一个容易忽略的点两条SList的SID必须来自不同的故障域。如果两条路径的公共节点是同一台核心路由器那么这台核心挂了两条SList同时失效所谓冗余就是假的。我在项目评审时反复强调这一点先做故障域分析再写SID列表。3. 实操过程在数据中心之间把SRv6 Policy跑起来3.1 基础环境与前提检查在动配置之前有几项前置条件必须满足否则后面会遇到一堆莫名其妙的坑。第一全网IPv6可达。SRv6 Policy的隧道封装基于IPv6源节点、中转节点、目的节点的互联地址必须配置IPv6地址且路由可达。如果你现在的数据中心间网络还是纯IPv4要么先叠加一层IPv6 underlay要么改造现有互联链路。我在现网里见过强行在IPv4网络上尝试部署SRv6的兄弟项目最后不得不推翻重做。第二设备支持SRv6。这不仅是软件版本问题还涉及转发表的硬件能力——设备需要支持IPv6的Segment Routing转发需要支持SRH的处理、流量负载分担和快速重路由。建议用小流量先在测试环境验证一次完整的故障切换。第三规划好Locator与SID空间。Locator是SRv6的网段前缀相当于SRv6 SID的地址池。两个数据中心之间必须规划相互不重叠的Locator网段。例如DC-A使用fc00:0:0:100::/64DC-B使用fc00:0:0:200::/64中转节点C使用fc00:0:0:300::/64。这样从SID的前缀就能判断它属于哪个节点排查问题会非常方便。下面以常见的主流厂商配置风格为例展示一个单CP多List的SRv6 Policy配置骨架具体命令因厂商而异但逻辑一致# 1. 定义Locator规划SID地址空间 segment-routing ipv6 locator dc_a_locator ipv6-prefix fc00:0:0:100::/64 ! locator dc_b_locator ipv6-prefix fc00:0:0:200::/64 !Locator配置完成后需要在每台设备上激活SRv6能力并为关键接口下发SRv6 SID。这一步通常由系统自动为Loopback接口生成End SID不需要手工逐条指定。重点要手工规划的是数据中心的出口节点的End SID因为它会被用来作为SList里的最后一个SID。3.2 核心配置单CP两条SList从零到通配置SRv6 Policy的核心片段如下源端设备DC-A上操作# 2. 创建Segment List 1走直达路径 segment-routing ipv6 segment-list slist_direct index 10 sid fc00:0:0:200::1 ! # 3. 创建Segment List 2走中转路径经C再到达B segment-list slist_via_c index 10 sid fc00:0:0:300::1 index 20 sid fc00:0:0:200::1 !注意这里slist_direct只包含一个SIDfc00:0:0:200::1这是DC-B节点的End SID代表直达DC-B。slist_via_c包含两个SID先把流量引导至DC-Cfc00:0:0:300::1再由DC-C转发至DC-Bfc00:0:0:200::1形成一条明确的中转路径。接下来创建Policy并让这个Policy绑定上面两个SList# 4. 创建SRv6 Policy policy interconnect_to_b binding-sid fc00:0:0:100::100 color 10 endpoint fc00:0:0:200::1 candidate-path preference 100 segment-list slist_direct weight 100 segment-list slist_via_c weight 1 ! !这段配置的关键点有三个Candidate-path preference 100仅此一条候选路径所以Preference高低在单CP场景下不参与竞争但必须填写且要确保它高于全局默认值。两条Segment List挂在同一个candidate-path下这才是单CP多List的关键语法。如果写成了两个candidate-path就变成主备CP切换了行为完全不同。Weight 100 vs 1正常情况下流量按100:1在两条SList之间分配几乎所有业务流量都走直达路径。当直达路径的SID列表失效时比如检测到路径故障设备会把流量全部导向剩下的可用SList即slist_via_c。配置完成后还需要把流量引入Policy。常见有三种导入方式通过Color引入在BGP路由条目上附加Color属性路由匹配Color 10时自动引流到该Policy。通过BSID引入在源设备上做静态路由或者策略路由把目的网段指向Binding SID。通过Tunnel接口引入把Policy挂到一个Tunnel接口再通过路由策略把流量带到这个Tunnel。我在现网中最常用的是Color引流因为Color天然支持多业务分级后期扩展不同SLA的服务只需要增加新的Color和Policy即可不需要改动路由条目本身。# 5. BGP路由附加Color示例在DC-A上的BGP视图内 bgp 65001 ipv4-family unicast network 192.168.1.0/24 route-policy set_color_10 export ! route-policy set_color_10 permit node 10 apply extcommunity color 10这个配置的含义是把DC-A侧的业务网段192.168.1.0/24对外发布时打上Color 10的扩展团体属性。收到该路由的设备DC-B侧如果也存在Color 10的SRv6 Policy就会自动把匹配流量送进Policy隧道转发。3.3 引入BGP SR Policy从手工配置升级到控制面下发如果只有两台设备互联手工配置够用。但大型数据中心之间设备多、业务多、路径频繁调整逐台手工配置SRv6 Policy会让人崩溃。这时需要把BGP引入候选路径的下发环节。BGP SR Policy地址族通常称为BGP SR Policy或IPv4 SR Policy地址族专门用来跨设备传递Policy候选路径信息。它本质上是在BGP会话里新增一类网络层可达性信息NLRINLRI里携带Endpoint和Color属性里携带Segment List、Preference、Weight等路径信息。部署方法是在DC-A、DC-B、DC-C等参与SRv6转发的设备之间建立BGP邻居激活SRv6 Policy地址族控制器统一计算路径把最优的两条Segment List信息封装成BGP Update报文下发到源节点源节点收到候选路径后校验SID的可达性和有效性如果有效则入转发表形成Policy。这样网络工程师只需要在控制器上维护一份路径意图不再逐台登录设备修改SList。我前面提到的手工配置可以看作BGP SR Policy的降级备份——控制器挂了至少还能用静态配置撑住。生产环境建议控制器下发为主CLI静态配置为辅两者路径参数要保持一致避免冲突。3.4 验证配置到底通没通、走没走对路配置完成后的第一件事不是急着割接业务而是验证。我最常用的四个验证命令如下具体名称各厂商有差异# 查看Policy整体状态 display segment-routing ipv6 policy interconnect_to_b # 查看候选路径与SList的活跃状态 display segment-routing ipv6 policy candidate-path # 查看流量在该Policy上的具体SID转发路径 display segment-routing ipv6 policy forwarding # 查看SRv6隧道的BFD状态 display segment-routing ipv6 policy bfd验证时重点看三样东西Policy状态是否为Up如果Policy是Down检查Endpoint的可达性、SID是否在Locator范围内注册、BSID是否冲突。SList是否有活跃标记只要SList被标记为活跃说明该条路径可用如果某条SList对应的下一跳故障它会自动变为不活跃但Policy整体仍可能处于Up状态只要有至少一条SList可用。BFD会话是否建立SRv6 Policy可以配置BFD for SRv6 Policy对每条SList对应的路径做快速检测建议Detection multiplier设为3期望报文间隔设为100ms这样路径故障检测时间大约300ms加上切换时间整体业务中断能控制在500ms以内。如果验证时发现Policy Up但流量没有进入Policy大概率是Color引流没有生效。先看BGP路由是否携带了正确的Color再看路由策略是否放行。我踩过的一个坑就是route-policy没写apply extcommunity colorBGP路由明明正常Color就是没打上结果Policy空空荡荡。4. 故障演练实录从隐患突发到业务无感要多久4.1 模拟一次真实故障主路径SID不可达配置和验证都通过之后最关键的动作是故障演练。纸上谈兵的Policy没有任何意义只有在真实断链情况下证明切换有效你才敢把核心业务压上去。我做的典型演练场景是断开DC-A到DC-B的直达物理链路模拟专线中断。此时主要包括以下事件物理链路Down节点上的SRv6快速重路由或BFD检测机制在约300ms内感知故障Policy的SListslist_direct变为不活跃设备把流量全部切换到仍活跃的SListslist_via_c上流量经DC-C绕行到达DC-B业务恢复。这个切换过程里有两个值得强调的细节一是Policy切换的判定依据不是看整条Policy是否Up/Down而是看单个SList的活跃状态。因为单CP多List的设计就是允许多条SList共存一条失效时另外一条自动承接不需要重新选路、不需要路由协议重新收敛。二是在主备权重场景下切换之后流量比重会重排。正常情况下直达路径承担99%的流量备用路径承担1%直达路径失效后备用路径承担100%的流量。这里有一个运维心理准备要提前做备用路径的时延更高、带宽可能更小业务方大概率会观察到时延上升你要提前跟业务方沟通这一预期而不是等告警出来再解释。我在演练中设置的预期指标是BFD检测 SRv6 Policy切换时间 ≤ 500ms流量中断产生的丢包率 ≤ 0.5%取决于中间设备转发缓存TCP连接不中断允许少量重传但不允许会话超时。实测下来主流设备配置得当的情况下切换时间通常在200ms左右业务侧几乎无感知。唯一需要留意的是如果中间设备SRH处理性能不足切换后的绕行路径可能会因为SRH深度的增加而出现转发性能下降这种情况可以通过增加SID压缩使用Binding SID压缩多层SRH来缓解。4.2 观察面板上的表现与指标解读故障演练完之后要把切换前后的监控数据留存下来作为数字守护神有效的证据。强烈建议至少留存以下几类数据Policy SList状态变更时间戳记录从主SList失效到备SList完全接管的时间隧道流量曲线看两条SList上的流量变化是否与预期一致应用层成功率采样通过拨测工具记录HTTP/TCP连接成功率验证业务无感。我留存的典型数据曲线是Fault Injected瞬间直达SList流量从100%跳到0%备用SList从1%跳到100%切换完成后约在500ms处恢复平稳业务请求成功率没有出现持续性下降。这张图是所有后续汇报和评审时最有说服力的材料。4.3 按需调整参数让守护更精准演练结果如果切换时间偏长优先检查这几个参数BFD报文间隔是否过大如果期望报文间隔设置成1000ms1秒故障检测要3秒才能完成切换再快也没用。建议100ms起步逐级下探但注意不要低于设备硬件能力否则BFD会话会被抑制甚至震荡。Weight权重是否符合预期如果备用路径权重配置成了100平时就会有一半流量走备用路径一旦出现突发故障备用路径可能已经处于较高负载没能力承接全部流量。SList中的中转SID是否都可达如果中转节点C本身有故障隐患备用SList可能也是假活跃——Policy显示Up但SID不可达。建议给备用SList也配置独立的BFD检测不要只盯着主SList。另外如果对切换的时效性要求极高比如秒杀、交易系统的同步链路可以叠加SRv6 TI-LFA快速重路由。它的原则是在主路径的每台节点上都预先计算一个本地备份路径当节点检测到邻居故障时不等待源节点重新选路直接在本地完成转发切换。实测可以把切换时间压到50ms以内。代价是每台节点都需要预留备份SID资源配置和维护复杂度上升需要评估网络规模和运维成本。5. 常见问题与排查技巧实录5.1 问题速查表症状可能原因排查方向Policy状态DownEndpoint不可达Locator内SID未注册检查IPv6路由、检查SID是否属于本节点LocatorPolicy Up但SList不活跃SID列表中有不可达SID下一跳故障SID类型错误逐跳ping测试SID地址检查中间节点的SRH处理流量没有进入PolicyColor引流未生效路由策略未放行Color查看BGP路由是否携带Color检查route-policy顺序切换时间远超预期BFD间隔过大设备SRH转发性能不足备份路径负载已满调小BFD间隔检查CPU/转发芯片负载主备切换后丢包备用路径带宽不足缓存溢出SRH深度增加导致MTU问题调整备用路径带宽检查SRH是否导致分片5.2 我踩过的三个坑坑一SID类型写错导致Policy Up但流量黑洞。有一次配置SList我把中转节点C的End.X SID带出接口的邻接SID误写成了End SID节点SIDSID本身可达Policy显示Up但流量转发到C后无法正确找到出接口直接在C节点被丢弃。业务方反馈时延突增然后全红。排查手段是把SID列表逐个用ping加上SRH选项探测最后定位到SID语义错误。这提醒我SID不只是地址它携带语义信息配置前必须查清楚每个SID的类型和所属节点。坑二Color值冲突导致跨DC业务互引。两个数据中心各自规划业务时都用了Color 10结果两条业务流同时被引入同一个Policy流量比例完全错乱。后来统一在控制器上维护Color规划表规定Color 10专用于低时延同步、Color 20专用于批量备份并配合ACL做流量过滤才彻底解决。Color和VLAN ID一样是需要全局规划的编号资源不能只在设备上随手写。坑三BGP SR Policy和手工配置叠加导致SList重复。引入控制器下发之后我没有及时删除源设备上手工配置的candidate-path结果同一个Policy下出现了两条相同优先级的候选路径设备交替选择流量来回震荡。排查时看到candidate-path数量莫名其妙变成两条才反应过来。要么走控制器统一下发要么走手工配置绝不能同时混用——除非你完全理解其中的冲突解决规则并有意为之。5.3 给新手的排查顺序建议如果你第一次排查SRv6 Policy问题建议按以下顺序走不要跳步骤先看Policy状态确认Endpoint的IPv6地址能通再看SList活跃状态确认每一条SID是否逐跳可达再看BFD状态确认快速检测是否建立再看流量统计确认Policy是否真的承接了业务流量最后看路由策略确认Color与引流配置没有隐藏冲突。按照这套顺序90%的SRv6 Policy问题都能在半小时内定位。不要一上来就抓包SRH封装下的抓包是非常不友好的最好先从控制面的状态机入手逐层推进。6. 写在最后的一点个人体会我在实际运维中最大的感受是SRv6 Policy这套东西设计阶段花的时间越久故障处理时就越轻松。很多人一上来就急着敲命令、配SID结果物理路径拓扑都没画清楚Color规划一团乱麻后期排障痛苦不堪。如果你准备在自己的数据中心间网络里引入这套方案我建议先从一个小规模的双DC互联场景做起手工配置跑通流程、做一次完整的故障演练再考虑用控制器做集中下发。还有一个小技巧送给大家给每一条SList起个能看懂的名字。别用什么slist_1、slist_2这种编号直接用slist_direct、slist_via_c这种带语义的命名。平时看不出来差别凌晨3点故障抢修的时候你盯着命令行看到这两个名字脑子里马上就能映射到物理拓扑而不是还得去翻图纸回忆编号含义。这类细节虽然不起眼但在紧要关头能省下宝贵的抢救时间。数据中心宕机造成的损失是真金白银而我们能做的就是把这些隐患在业务感知之前全部消弭掉——这正是数字守护神的价值所在。
返回列表