如何像Facebook一样构建数据中心 – BGP在大规模数据中心中的应用(3)
作者简介:史梦晨,曾就职于国内金牌集成商, 现就职于EANTC( 欧洲高级网络测试中心),研究方向:网络架构,测试,运维(大规模数据中心,SD-WAN,EVPN,Segment Routing, NFV), 邮箱superrace@gmail.com
在之前的章节中,我们学习了RFC7938中介绍的关于:
- 为什么选择bgp
- 如何设计ASN
- 如何通告路由条目以及在何处进行边界汇总
今天来继续讨论一些路由设计的细节
ECMP
基础ECMP
ECMP是CLOS拓扑里面基本的流量分担机制,有以下特点/属性:
- 所有去往相同IP的流量都应该由从低层tier往所有的高层tier的链路分担。(如图一:tier 3到tier 2有4个链路,tier 2到tier 1 有5个)
- ECMP路径的数量由tier 1设备数量决定(如图一,20条负载均衡链路)
- 需要所有的设备都支持Multipath fanout,最大的数量不能少于上行方向或下行方向直连链路的最大值(如图一,20),同时,这个数量不能超过任意设备的1/2的借口数量(比如fanout 32就需要全网交换机不能少于64个口,也就是说用64口交换机最多部署32个tier 1设备)
- BR可能对这个数量会需求更多,如果做路由汇总的话
- 如果ECMP路径数量达不到需求的话(比如最大10条),可以混合使用2层的逻辑链路聚合(比如每2条链路聚合成一条),但是这样带来的问题就是在第二级的ECMP可以用的entropy就少了从而可能部分链路不能被利用上(flow polarization)
基于multiple ASNs的BGP ECMP
一些基于应用的负载均衡需要我们在不同的Tier3设备上宣告同样的网段。如果采取这样的部署手段,那么在其他设备上就会看到这些网段有着不同的AS_Path,但是同样的AS_PATH的长度。基于BGP选路策略,我们通过之前的CLOS和ASN的设计就实现了在这些路径上的负载均衡,因为除了AS_Path不同以外,其他的BGP选路属性都是一样的。
Weighted ECMP
我们还可以通过调整Weight(权重)值来对路径进行优化。我们可以通过“第三方下一条”注入带不同权重的路由来进行非均衡的流量分担,基于不同的链路权重可以分配不同的流量。注意这里的weight不是14条选路属性的第一条Cisco特有的权重值,因为那个只有本地有效而且只是优选路径。我们可以通过RFC draft-ietf-idr-link-bandwidth定义的Link Bandwidth Extended Community来实现。
一致性哈希
作者推荐使用一致性哈希(Consistent Hash)来解决在ECMP组里增加/删除下一条对流量的影响,这里就不展开讨论了。值得注意的是部署一致性哈希需要更多的硬件资源,比如TCAM。
路由收敛属性
这章将介绍路由收敛属性,作者提出可以通过部署支持BGP对等会话快速失效(BGP Fast Peering Session Deactivation),对应路径失效时RIB和FIB实时更新(timely RIB and FIB updates upon failure of the associated link)来实现亚秒级的收敛。
故障检测时间
通常的BGP要通过来反应链路/节点的失效。在此设计中,因为没有IGP,所以BGP Keep-alive(或者其他的keep-alive机制)和链路失效trigger就成为唯一的保护机制。
如果只通过keep-alive来触发失效进行链路保护,收敛时间通常很高,取决于time-out时间,但是一般也是秒级的收敛。但是很多BGP可以通过链路失效触发关闭BGP对等会话(BGP peer session)的功能。这样我们的收敛时间就取决于”link-down”事件而不是定期的keep-alive。现在数据中心里一般都用点到点的光纤连接,一般的检测时间都在毫秒级。
Ethernet链路可以做到更可靠的故障检测。有的可以通过CFM(Connectivity Fault Management),还有的支持BFD(Bidirectional Forwarding Detection, RFC5880)实现亚秒级的检测和通知BGP进程。但是这也需要额外的特性支持,和需求1冲突。
事件传播时间
在这个方案设计里,消除BGP MRAI(MinRouteAdvertisementIntervalTimer)的影响也被考虑进来了。在RFC4271中规定指定对等体在发送或者撤销路由过程中最少要间隔MRAI计时器(一般是可以配置的)来减少频繁更新带来的影响。当对等体完成路由更新后启用MRAI定时器,在这个时间内对等体不再发送更新或者撤销消息。所以当一个BGP speaker 由于路由失效,等待新的路径被邻居发送回来,并且loc-rib没有备选路径的时候,MARI计时器会造成很大的收敛延时。
在CLOS架构里,一般来说每个BGP speaker都有一个(比如某个tier 2到某个tier 3)或者N个路径(比如某个tier 2到某个tier 1)去往一个同样的prefix。这里2种情况会:
1.当某个tier 2到某个tier 3的链路失效时,由于没有备用链路,Tier 2设备会立刻发送一个withdraw给所有tier 1,所有被影响的tier 1收到以后可以立刻收敛计算。
2.当某个tier 2到某个tier 1失效,首先会计算出新的下一跳组(ECMP),如果这个path是之前选择的最佳路径的话,会通过update消息发送“implicit withdraw”。
CLOS扇型发散(fan-out)的影响
(关于fanout,相比扇出,可能我觉得这里扇形发散更好理解)
CLOS架构的fan-out,某些情况下很大程度上会影响”从上到下“的收敛时间,造成路由震荡。继续上一节的case 1:
1.当某个tier 2到某个tier 3的链路失效时,由于没有备用链路,Tier 2设备会立刻发送一个withdraw给所有tier 1
2.所有被影响的tier 1收到以后可以立刻收敛计算。
3.之后,所有的tier 1设备会向所有相连的tier 2(除了发起的那个tier 2)发送更新报文。
4.这些tier 2应该等所有tier 1发送完成以后再移除对应的路由
5.继续传播给tier 3设备。
在这个过程里,如果某些步骤1或者步骤3发送消息的设备由于某些原因延时了发送更新消息,那么就会造成更新消息分布过于分散,间隔好几秒。所以为了防止这种情况发生,BGP需要支持更新组(update group)。更新组定义了一组共享同样的”对外策略”的邻居,bgp speaker会同步的向这个更新组的组员发布更新消息。
最后作者还提出了在这个解决方案里不推荐使用”route flap dampening”来解决clos里的路由震荡。
故障影响范围
一个网络只有当所有被影响的设备都被通知了故障并且重新计算生成了RIB和FIB以后才能宣称自己收敛完毕。大型的故障影响范围就意味着更长的收敛时间,因为更多的设备需要被通知,从而造成网络的不稳定。这章主要介绍CLOS拓扑的BGP相比于链路状态协议,为何会减少故障影响范围。
BGP从行为上来说表现为距离矢量型路由,因为从本地路由器角度,它只把它认为的最佳路径发送给邻居。因此,有的故障可以被掩盖住,如果本地能立刻找到备选路径的话,此故障就不必通告给其他邻居。在最坏的情况下,数据中心中所有的设备要么彻底删除一个prefix,要么在FIB里更新ECMP组。但是很多故障并不会有如此大的影响范围。
1.Tier 2 和tier 1之间个链路故障:这种情况下,Tier 2只需要更新本地FIB,不需要告诉Tier 3设备,除非这个path是之前选择的最佳路径,Tier2会通过update消息发送“implicit withdraw”,而且这并不影响流量的转发。对于Tier 1来说,需要删除对应的Tier 2的prefix,更新ECMP,通知其他直连的Tier 2, 同样其他Tier 3也不需要被通知和收敛。
2.Tier 1设备故障:这种情况下,所有直连的Tier 2设备需要需要更新ECMP组,Tier 3设备同样不知情。
在多个prefixes需要在FIB中更新的情况,我们需要注意的是这些prefixes共享一样的ECMP组。因此,如果系统中支持”分层FIB(hierarchical FIB)“,只需要做一次改动就可以。分层FIB(hierarchical FIB)意思就是下一跳的信息和prefix查找的表是分开的,因此只需要将下一跳通过指针指向对应的下一跳的分表,改动下一跳分表就可以快速更新FIB。(RFC draft BGP Prefix Independent Convergence)
虽然使用路由汇总可以进一步减少故障影响范围,但是之前我们也提到了会造成路由黑洞。尽管这里列举了一些影响范围不大的情况,我们仍然会面对最坏的情况:所有的设备控制平面都需要收敛,这也是CLOS的属性之一,跟EBGP的选择没有关系。
微环路
一般Tier 2设备都有会默认路由指向Tier 1设备。当一个Tier 2完全失去某个Tier 3后面的prefix而Tier 1没有更新这些prefix时候,就会造成微环路(Routing Micro-Loops)- Tier 1发给Tier 2, Tier 2通过默认路由丢回给Tier 1,直到Tier 1更新路由表。
为了减少这种情况的影响,我们可以配置一个静态路由去把这些报文“丢掉”或者指向null,这个静态路由需要比默认路由稍微“详细”一点。对于Tier 2设备来说,这可以是一条汇总路由,覆盖了所有的下联的Tier 3设备上的服务器网段,对于Tier 1设备来说,应该覆盖所有数据中心里的服务器网段。这个静态路由只有从网络收敛期间到学到新的更详细的路由这段时间内有效。
总结
到这里,这篇RFC 7938的介绍差不多就结束了,后面还有1章可选的设计,将来有可能介绍给大家。在写作的过程中通过不断的阅读RFC和参考资料让我对这篇设计方案有了更深的理解,也希望能和感兴趣的工程师探讨交流。后续的文章可能还会以Facebook为背(xue)景(tou)讨论Segment routing在大规模数据中心里的应用,敬请期待。
章节回顾:
如何像Facebook一样构建数据中心 – BGP在大规模数据中心中的应用(1)
如何像Facebook一样构建数据中心 – BGP在大规模数据中心中的应用(2)
- 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
- 本文链接:https://www.sdnlab.com/20933.html
如何像Facebook一样构建数据中心 – BGP在大规模数据中心中的应用(3)的更多相关文章
- Google数据中心B4网络具体实现
① 背景介绍 Google的网络有两种,一种是数据中心内部网络,另外一种是WAN网,其中WAN网又分为两种:一是数据中心之间的互联网络,属于内部网络(G-Scale Network),另外一种是面向I ...
- H3C数据中心虚拟化解决方案技术白皮书
缩略语清单: 缩略语 英文全名 中文解释 IDC Internet Data Center 互联网数据中心 VRF Virtual Router Forwarding 虚拟路由器转发 SMP Symm ...
- 透过微软研究院在“数据中心网络”的重大进展看SIGCOMM 2013
2013" title="透过微软研究院在"数据中心网络"的重大进展看SIGCOMM 2013"> 编者按:于8月12日至16日在香港举行的SI ...
- 虚拟化-SDDC软件定义数据中心
一.什么是SDDC? SDDC依赖于虚拟化和云计算技术, SDDC的目标是虚拟化数据中心的一切物理资源,通过虚拟化的技术,构建一个由虚拟资源组成的资源池,不仅是对服务器进行虚拟化,还包括存储虚拟化和网 ...
- SQL Azure (17) SQL Azure V12 - 跨数据中心标准地域复制(Standard Geo-Replication)
<Windows Azure Platform 系列文章目录> 熟悉Microsoft Azure平台的读者都了解,Azure SQL Database提供不同等级的,跨数据中心的异地冗余 ...
- 云计算和大数据时代网络技术揭秘(八)数据中心存储FCoE
数据中心存储演化——FCoE 数据中心三大基础:主机 网络 存储 在云计算推动下,存储基础架构在发生演变 传统存储结构DAS.SAN在发展中遇到了布线复杂.能耗增多的缺点(原生性),需要对架构做根 ...
- SDN理解:云数据中心底层网络架构
目录 - 目录 - 云数据中心流量类型 - NSX整体网络结构 - 管理网络(API网络) - 租户网络 - 外联网络 - 存储网络 - openstack整体网络结构 - 管理网络:(上图中蓝线) ...
- Alibaba Cluster Data 开放下载:270GB 数据揭秘你不知道的阿里巴巴数据中心
打开一篇篇 IT 技术文章,你总能够看到“大规模”.“海量请求”这些字眼.如今,这些功能强大的互联网应用,都运行在大规模数据中心上,然而,对于大规模数据中心,你又了解多少呢?实际上,除了阅读一些科技文 ...
- 5G到来,数据中心如何变革?
导读 5G将要到来,除改变人们的工作生活外,其带宽.延时.连接特性也逼迫着数据中心变革,以满足5G时代需求.具体而言,5G将从形状规模.硬件组成及软件规模三面变革数据中心. 5G带来什么 高带宽.低延 ...
- 谈谈 数据中心SOA 架构
为什么要讨论 数据中心SOA 架构呢? 请参考我写的另外一篇文章 <论 微服务 和 Entity Framework 对数据的割裂> https://www.cnblogs.com ...
随机推荐
- SAP 自建事务码
自建事务码的 事务码 se93 一般来说开发人员会遇到,开发了报表已经一些功能,不会让业务人员通过se38来进行使用,一般会新建一个事务码让业务人员在t-code中的使用 配置对应的程序即可
- 如何利用python的xlrd模块读取日期格式的Excel
经常使用python操作Excel,就会遇到各种坑,比如,有时候你读取到的某一单元格的数据,你预想的结果本来应该是这样的,但是它却是这样的,真是很蛋疼.于是你会找各种解决办法,去解决这个问题!所以鄙人 ...
- 04 使用 BTrace 进行拦截调试
BTrace BTrace 可以动态地向目标应用程序的字节码注入追踪代码,使用的技术有 JavaCompilerApi, JVMTI, Agent, Instrumentation+ASM 使用方法: ...
- Spring core rce 0day(CVE-2022-22965)视频教程附工具
Spring 远程代码执行漏洞,先上图,视频晚点上传
- 复杂的光照与更复杂的阴影实现过程——ShaderCP9
--20.8.28 这章的内容看了很久,也有很多复杂的内容.中途还有事情耽搁了一会.开学后就继续好好记录努力. 我们在游戏中能看到的让人觉得真实感的来源之一就是真实的光照以及光照所产生的阴影.下面的内 ...
- SQL-关联
关联的本质:从一张表依次取一条数据和另一张表每一条数据进行匹配 内关联 inner join (inner可省略) -- 只显示关联的上的数据外关联有三种左外 left join -- 主表数据不丢失 ...
- 关于CSS3中的min-height等的使用
一.min-height 当我们需要让某个容器不能低于某个高度,但是不能将高度固定在这个高度,希望其能够随着容器内内容的增多而变高时,我们可以对容器设置一个min-height来让该容器获得该特性.( ...
- kafka例子
<dependencies> <dependency> <groupId>org.apache.kafka</groupId> <artifact ...
- 03php拉取服务器信息并生成json
<?php$servername = "服务器";$username = "用户名";$password = "密码";$dbname ...
- JDBC——连接SQL Server环境配置
JDBC:使用JAVA语言操作关系型数据库的API.是一套标准的接口. 步骤 1.创建工程,导入驱动jar包 2.注册驱动:Class.forName("com.mysql.jdbc.Dri ...