1 BGP流量负载分担概述
如何优化的利用网络带宽资源,是流量负载分担的关注重点。BGP(Border Gateway Protocol, 边界网关协议)选择单条最优路径的这一特征往往会出现流量负载不均衡的流量模型,BGP流量负载均衡从两个角度出发解决这个问题:(1)通过BGP强大的策略控制流量的负载均衡,也就是利用BGP天生的丰富属性来进行路由的优选,从而达到负载分担;(2)通过多路径选路实现负载分担。本文就要从这两个角度来展开分析BGP在流量负载分担方面的技术应用。
2 负载均衡
在实际网络中进行负载均衡需要综合考虑链路和设备节点的负载情况,在满足业务的实际需求前提下,可以通过BGP的策略工具对流量进行均衡的规划和调整。对于一个AS来说,流量的方向分为入境和出境两个方向,这种区分对应到实际的网络有不同的规划,所以我们在此通过不同的场景进行介绍。
2.1 入向的流量负载分担
分为两种情况。
情况1:多宿主到不同上游情况下,入向进行负载分担;
图1的场景实现目标:AS100希望流量能够在AS200和AS300间进行负载均衡,也就是说根据业务分别映射到Link1和Link2上。(现实环境中这样来通过业务来映射到不同链路进行负载分担场景目前本人还未遇到过)。简而言之,这种网络设计方式需要AS100与上面一层的链路间既要业务负载,还要业务冗余,另外还需要在RC与RD间建立BGP PEER场景下保证RC和RD的路由选路能够很好的控制。下面以一张示例图来说明bgp路由的策略设置:
上面这种方式是可以保证入向业务的负载分担,且互相备份,路由选路的控制更好。但出向还没解决,正常来说的话出入向都应该负载分担或者按实际需求进行流量调度。在某些场景下,若是要实现出入方向的流量都同时进行切换,则修改MED值也是一个好的选择,MED值越小其路由优先级越大,华三设备MED值默认是0。
情况2:多宿主相同AS号的负载分担
实现需求目标:本地AS 100希望172.168.1.0/25通过RB进入,172.168.128.0/25通过RC进入。
原理和情况1其实也一样。给不同的路由对于两条链路赋予不同的community属性,并发布设计好的AS-PATH长度不同的路由(互备),并在AS 200侧根据属性来进行调整local_preference值来进行控制路由的选路。另外,还是针对图2,要使得RB、RC到RA的入方向流量业务负载,在RA上调整发布路由的MED值是最简单的方式。
2.2 出向流量的负载分担
也分两种情况:(1)多宿主到不同上游情况下,出向进行负载分担;(2)多宿主相同AS号的出向负载分担;
情况1:多宿主到不同上游情况下,出向进行负载分担
路由控制策略:
- 在RA和RB路由器上对进入得路由前缀进行过滤,通过传递过滤后得路由来使得RA与RB下面的对应业务走对应线路;
- 对于Internet业务就需要进行入境路由前缀策略控制,例如通过添加AS-PATH或者对特定前缀设置不同的本地优先级等(个人认为复杂的策略控制并不是最好的选择,还需针对具体场景进行分析);
- 对于单点故障导致业务中断的考虑还可以通过出口路由器发布缺省路由的方式作为路径的备份,一旦出现某个出口路由器故障,路径可以通过缺省路由切换至其他出口路由器,起到备份的效果;(具体场景分析)
- 同样可以和上游AS协商,通过通告来的前缀携带不同的团体属性进行相应的策略控制;
情况2:多宿主相同AS号的出向负载分担
- 针对不同对等体进行入境路由前缀过滤,使业务自然分担到不同的出口链路上。同时配置缺省路由指向对等体,防止单点故障业务中断(具体场景具体分析吧);
- 通过针对特定前缀设置多种属性,如Local-preference、Origin、MED等,在本地进行路由优选(要想出入都保持一致,更建议使用MED方便一些,因为local_preferance值仅是在IBGP对等体内传递,而MED值可以在EBGP之间传递,仅在一端配置即可实现路由的发布和接收策略);
2.3 AS内部负载均衡
AS内部负载均衡,一般可以通过多种方式进行调整。as-path、local_preferance改变任意一个即可。
实现目的:RA访问172.19.1.0/24从RB走,RA访问172.19.2.0/24从RC走,既要实现业务负载又要实现业务冗余。
实现方法:
- 对于RB发布的路由,调整172.19.1.0/24的local_preferance值120,172.19.2.0/24的local_preferance值为默认100;
- 对于RC发布的路由,调整172.19.2.0/24的local_preferance值120,172.19.1.0/24的local_preferance值为默认100;
从而实现需求。
3 等价负载均衡
上面第2部分其实更多说的是如何控制路由来使得不同业务走不通的链路实现业务负载均衡,并且还需要保持网络上面的冗余。下面主要介绍的是对于等价路由情况下的负载分担问题。
3.1 EBGP的多跳负载分担
多跳多链路的负载分担。EBGP之间通过loopback口地址建立BGP链接,loopback之间的互通依靠底层的IGP协议(静态、OSPF等),这种方式使用的也很常见,在某短视频公司大量使用该方法进行建立BGP邻居。
如上图所示,RB与RA之间建立EBGP邻居,RA收到RB发过来的BGP路由,RA上查看下一跳是指给RB的loopback口,于是RA上通过路由迭代,查看IGP协议(OSPF、STATIC)的路由,下一跳指给RA与RB之间的互联IP,从而进行负载分担。实际上最后也是IGP协议实现的负载分担。
3.2 EBGP的多路径负载分担
两个路由器之间通过两条直连链路的互联ip建立EBGP邻居,每一个会话对应一个特定链路。
如上图所示,RB给RA传递的路由都会从两条链路上的两个BGP邻居发过来,其BGP属性一致,从而形成多路劲的负载分担。
总结一下,较上述两种负载分担方式。
- 3.1第一种方式,建立了一个EBGP会话,会话直接绑定在两个出口路由器的环回地址,通过直连路由迭代下一跳的方式在链路间实现负载分担。这种方式EBGP会话属于多跳会话,需要两个AS间进行环回地址的路由部署,适用性有一定的限制(说不清楚)。
- 3.2第二种方式,需要建立多个会话,对资源有一定的消耗,同时对于EBGP等价路由的配置,是针对本设备所有BGP对等体适用,无法区分对等体,因此,缺少一定的灵活性(也说不清楚)。
两种方式在互联网网络架构里都有使用,各有优缺点。个人相对建议使用第二种方式,虽然邻居多一点,但基本设备性能都能承受。
3.3 AS号内部形成负载分担
AS内部的负载分担规划同样可以采用下一跳迭代的方式在同一个IBGP会话间进行多链路的负载分担。
如上图所示RA、RB、RC之间互相建立IBGP PEER,RB、RC像RA通告相同的BGP路由,在ORIGIN,LOCAL-PREFERENCE以及AS-PATH路径属性均相同的前提下能够形成负载分担。
多链路的负载分担也可以通过IGP迭代来实现
RD和RA 建立IBGP邻接关系,RD向RA通告路由172.168.1.0/24,RA上关于172.168.1.0/24的路由下一跳是RD的环回口地址,在RA上针对RD环回口地址有两条等价的IGP路由:RA-RB-RD和RA-RC-RD,通过下一跳迭代,在RA上针对172.168.1.0/24的BGP路由也形成等价。
3.4 负载分担规划原则
ORIGIN,LOCAL-PREFERENCE,MED以及AS-PATH路径属性均相同是形成负载分担的前提,在此前提下还要遵循一定的原则进行负载分担规划。
如上图所示,RA与RB/RC之间通过广播网络建立EBGP邻居,AS200的内机器之间建立IBGP邻居。
情况1:AS100内发布的172.19.1.0/24路由传递给RB/RC,然后RB/RC传递给RE,默认不修改下一跳,下一跳地址为AS100的RA地址,RE看到的172.19.1.0/24路由不形成等价。要形成等价,需要在RB与RC上修改下一跳IP地址,才能在RE上形成等价路由。
情况2:RD是RR,RB与RE作为RD的client端,之间建立IBGP邻居,RB与RE之间建立IBGP邻居,RB上发布一条172.19.1.0/24路由。RE上从RB与RD(RR)上接收到172.19.1.0/24的路由,RB-RE、RB-RD-RE的cost值相等,但不形成等价,原因是因为非反射路由和反射路由间无法形成负载分担。
情况3:RD、RC作为反射器RR,RB与RE之间无BGP PEER,从RB发布一条路由172.19.1.0/24,RE上从反射器RC和RD上收到这条路由,当ORIGIN,LOCAL-PREFERENCE,MED以及AS-PATH路径属性均相同时从而形成等价路由。
4 总结
负载均衡和负载分担均是BGP通过策略控制达到流量在网络中不同节点、不同链路间的平衡,起到合理利用网络资源的效果。本文介绍的是对具体网络负载均衡或分担的需求进行规划的思路,实际中满足需求的手段多种多样,需要根据实际情况做相应的规划调整,因此在实际的网络规划时不要拘泥于本文提及的方法,更多的是思路上的借鉴。同时,负载均衡和分担往往需要经过多次尝试才能尽可能接近均衡的,过于精确的均衡往往会带来策略上的复杂度,同时在考虑均衡的同时还要兼顾路径的备份。