最近读到了《云原生数据中心网络》[1]这本书,对其中的机房网络架构演进产生了较大的兴趣,这里对这个话题进行一个简单的总结和拓展,以飨读者。
Access-Aggregation-Core 三层架构
图 1,源[2]
如上图所示:
- 接入层负责接入(access)服务器(二层交换)
- 汇聚层对接入层的包进行聚合(aggregation)并路由到核心层;其下是二层交换,其上是三层路由,是广播域的边界,并作为本广播域内主机的默认网关
- 核心层(core)负责对汇聚层的数据包进行路由,将机房网络和外界网络进行连接
我们把地图缩小一点能看到更全的面貌:
图 2,源[3]
虽然彼时主要由三层路由推动的 Internet 已经迅速流行起来了,但是这种架构还是严重依赖二层交换。它能在千禧年附近占据机房架构的主流地位,主要是因为在当时的背景下有几个核心优势(尽管这些优势随着整体技术的进步很多已经不复存在了)。
优势
- 硬件数据转发:专用的数据转发芯片比更古早的工作站能更有效率地转发数据包,但当时只支持交换。当然,后面出现的 L3 交换机打破了这种限制
- 专用网络协议:当时除了 IP 以外,还有很多网络协议(如IPX,VINES),利用二层交换可以统一支持所有三层协议。当然,现在 IP 已经一统天下了
- 零配置:二层交换配置相比三层路由更简单,尤其是转发表的建立,二层可以通过泛洪进行学习,用户无需也不会感知到个过程
上面也说到了,它的许多优势随着时间不复存在了,但是带来的问题却没有消失。
问题
广播风暴
由于 MAC 头并不像 IP 头那样有 TTL,一旦链路出现环路,一个简单的广播包也会由于无穷转发而导致整个链路的带宽/CPU 消耗殆尽,这称为广播风暴。
特别地,为了高可用而设计的多个汇聚层交换机,更容易导致环路出现。为了解决这个问题,STP 应运而生,它能通过复杂的算法使得链路无环(主要逻辑是接入交换机只和 active/主 汇聚交换机相通,和 standby/备 汇聚交换机的连接被强制阻断,如图 1 所示),但是 STP 又引入了新的问题......
STP 的问题
- 如图 1 所示,STP 使得可用带宽只有一半(默认下,汇聚交换机只有一台可用,但是思科使用了 PSTV 来同时使用来两个汇聚交换机,亦即每个 VLAN 一个 STP,多个 VLAN 互为主备),并且汇聚交换机之间还有一半流量(两台汇聚交换机都会从核心交换机分到流量,备交换机需要转发给主交换机),造成了资源浪费
- 只能使用两台汇聚交换机(多于两台时,出问题后会导致拓扑结构不可预测),无法水平扩展,只能通过升级汇聚交换机的硬件设备(垂直扩展)来提升带宽,严重限制了带宽的扩展性
- 算法复杂,容易出 bug
- 不可预测性,普通的小故障都会导致整个 STP 瘫痪,增加了排障难度
泛洪负担
广播,组播,未知的单播数据包都会造成泛洪,尤其是后者,用于构建 MAC 转发表。MAC 地址没有层级,而且这个表通常还有时限,所以当二层网络太大之时,泛洪会很频繁,造成巨大压力。虽然可以通过 VLAN 缓解,但是治标不治本。
复杂性
- 该架构重度依赖的 STP 很复杂
- 依赖 FHRP(主流就是 VRRP 协议)实现默认网关的冗余/高可用
图 3,源[4] - 依赖链路失效检测来做主备切换
- 带宽必须精心设计,以应对链路失效
如此高的复杂性和多的依赖,意味着出问题后,必须仔细检查很多项才能定位到问题,影响 MTTR[5]
爆炸半径
该架构的爆炸半径较大:
- 单条链路失效,造成链路可用带宽减半
- 单台汇聚交换机失效,造成整个网络带宽减半,甚至是级联故障导致整个网络失效
不适应应用变迁
随着业务形态的变迁,应用从单体逐渐演进到分布式,导致东西流量的增多,甚至多于南北流量[6]。从图 2 可以看出,东西流量增长会导致汇聚交换机和核心交换机的压力倍增(因为会同时承受南北流量和放大的东西流量),而机器的性能升级(垂直扩展)终究是有限的,导致该架构无法适应如今的业务形态。
其它
- 缺乏灵活性
- 不够敏捷(新增或减少节点不够平滑),
- 东西流量延迟不一致(主要是跳数变化大,两台机器分别位于同一个 access 交换机下,aggregation 交换机下,core 交换机下,这三种场景包的跳数差别很大)
- ....
改进的努力
二层交换有许多问题,最大的问题就是不支持多路/冗余转发(或者说,有环),有一些努力在解决这个问题:
堆叠技术
将多个物理交换机整合在一起,组成一个逻辑单元,这样就能将物理的多路变成了逻辑的单路,避免了环路。但是堆叠的扩展性是有限的,不适用于大型网络。
链路聚合
通过 MLAG[7] 将多个物理链路虚拟成一个逻辑链路,从而欺骗 STP 协议,让本来的环路变成单条链路。
这种方式能提升资源利用率(带宽可以充分利用),也能从容应对故障(有冗余),缺点是扩展性有限,并且 MLAG 是厂商专有,并未标准化。
借鉴路由
网络层的路由算法都有避免环路的算法,为啥不直接拿过来用呢?TRILL 和 SPB 就是这个思路。它们都基于 IS-IS 这个路由协议,通过对 MAC 报文进行封装和转发,实现了无环的多路等价路由,获得了充分利用的带宽和高可用性。
但是这两种协议需要对设备进行硬件/软件进行升级,是一个巨大的时间/资本投入,这影响了他们的流行。再加上标准化不够[8],和一些市场原因(推手的破产,overlay 的崛起等),这两个协议基本已经停止发展了。
Access-Aggregation-Core 架构(后续简称传统三层架构)有如此多的问题,那构建支持大规模水平扩展的网络的方案究竟是什么呢? Charles Clos 给出了答案:Clos 架构。
Clos 架构
Clos 架构以其主要提出者 Charles Clos 命名,最初用于实现 Non-Blocking 的电话交换网络,它采用了多个小规模、低成本的元件来构建大规模网络,提高了成本效益和可扩展性。现代数据中心中落地的 Clos 架构是 Spine-Leaf 架构,Spine-Leaf 架构有许多变种,最简单的一种如下图所示:
图 4,源[1]
其中:
- Spine 交换机:唯一目的是连接不同的 Leaf 交换机
- Leaf 交换机:通常由 ToR(架顶交换机) 承担,连接 server,隔离广播域
我们看到,所有交换机呈现一个 full-mesh 结构,你会想问,这不是有环吗?这里就涉及到 Clos 架构与传统三层架构的核心不同点:依赖路由(routing)而非交换(switching),亦即主要工作在三层而非二层,可以在避免环路的前提下,实现多路/冗余转发(ECMP)。包括但不限于这个不同点的特征带来了一系列优势:
众多优势
更好的扩展性
实现成本更低、上限更高的水平扩展而非垂直扩展:
- Spine 交换机:功能单一(意味着简单可靠),增加数量即可扩展 Leaf 交换机(或者说不同的二层网络)之间的带宽
- Leaf 交换机:只要 Spine 交换机端口够用,简单增加 Leaf 交换机和 server(计算、存储资源)即可扩展整体网络支撑的工作负载
如果交换机的端口/带宽限制了 server 数量,可以通过向 Clos 网络中添加更多层次来解决,主流有两种做法,如下图
- a,原始架构
- b,虚拟机箱模型,在 Leaf 和 server 之间增加一层交换机(TOR),Spine 和 Leaf 可以直接放置到同一个机箱中(虚线)。Facebook 大规模使用了这种模型[9]。
- c,POD 模型,Spine 交换机拿出一些端口,上挂超级 Spine 交换机,虚线中的交换机及其下联的 server 并称为 POD。Microsoft 和 Amazon 大规模使用这种模型。
- 对比,虚拟机箱模型 server 之间的路径更一致,适合私用的企业机房,而 POD 模型则允许更灵活的 server 集群配置,适用于运营商。
- 事实上,各家对网络架构的称谓和元件的称谓都不同,具体实现也有差异,但是无伤大雅,他们都体现了 Clos 架构的精髓
图 5,源[1]
- 出口网络通常使用专用的 Border Leaf 交换机(极少情况才会用 Spine 交换机,比如小型网络),最少两个(实现出口网络的高可用),它们一起连接面向 Internet 的路由器,如下图。通过增减 Border Leaf 交换机实现出口带宽的扩展性
图 6,源[1]
更简单,易排障
主要体现在两方面:
协议少
相对于传统三层架构,Clos 架构不需要 STP(STP 可以说是传统三层架构的主要问题来源了),也不需要 FHRP 和 VLAN 配置,这意味着你需要排查的潜在问题少了很多。
交换机小
相比于传统三层架构复杂昂贵的框式交换机,Clos 架构只需要普通的盒式交换机,更简单,不易出错,即使出了问题也有很多库存,很容易替换,同时这也简化了资产管理工作。
更小的爆炸半径
- 每个 Spine 交换机只承担了 1/n 的流量,所以挂掉一个对集群整体的影响远小于传统三层架构。
- Spine 交换机 A 和 Leaf 交换机 B 的链路如果挂掉了,流量可以从另一个 Spine 交换机 C 流到 B,虽然链路变长了,但是不会影响网络中的其他节点
- Leaf 交换机如果挂掉了会影响其下联的所有 server,大型数据中心机架成千上万,问题不大;小型数据中心可以通过在每个机架放置两个 Leaf 交换机,并将所有 server 双上联,从而降低爆炸半径
一致性
- 任意服务器之间,跳数稳定可预测,没有传统三层架构中 zig zag 的流量走势。
- 可以采用统一(差别很小甚至无)的交换机来实现这个架构,而无需传统三层架构中多种规格的交换机。需要注意的是,虽然图 4 中展示的 Spine 和 Leaf 是相同的交换机,但现实中,由于散热、机架大小、服务器摆放和交换芯片等的限制以及不同收敛比(下行链路带宽/上行链路带宽)的要求,这两类交换机通常是不同的
大二层
在数据中心中,为了实现 VM 的平滑迁移和任意分配(主要是不需要修改网络相关配置,如 IP/MAC 地址、默认网关、路由等),需要实现一个大二层网络,亦即一个二层网络需要能够触达整个机房(甚至跨机房),但是 Spine-Leaf 架构中,二层网络仅在一个机架中,怎么办呢?答案是 Overlay 方案,目前 VxLAN 是这种方案的主流技术实现,如下图所示:
图 7,源[1]
在同一个物理网络中,H1 H4 H5 属于一个虚拟网络,H2 H3 H6 属于另一个虚拟网络(复杂的控制面在此省略了)。一个简化的报文流程示例:
- 当 H1 向 H5 发包时,会用虚拟 IP/MAC 地址填充原始报文
- L1(Leaf 也是 VTEP,亦即 VxLAN Tunnel Endpoints)收到报文后,会将其作为 payload 封装成新的 UDP 报文,L1 和 L4 的 VTEP IP 分别为源和目的地址,然后会选择 S1/S2 其中之一转发,假设是 S2,则用 S2 的 MAC 地址作为目的地址。
- S2 收到报文后,以自己和 L4 填充源和目的 MAC 地址,并转发
- L4 收到后,发现目的IP地址与自己 VTEP IP 相同,则进行包解封,获得原始报文,然后依据目的 MAC 地址,发送给 H5
- H5 收到原始报文后,转发给本机相应的进程
可见整个过程中,H1 和 H5 都感知不到虚拟网络的存在,同一个虚拟网络中的 VM 放到物理网络的任意位置都可行。
VXLAN 是 VPC 的核心技术,不仅提供了机房级别的大二层网络,还提供了隔离性(VXLAN A 的 VM 不能理解 VXLAN B 的报文),是现代公有云网络的基石。
一点感想
Clos 架构能够大规模应用的前提是 IP 统一了网络层,我们不再必须通过二层来提供一致的连接。此外,各种数据转发芯片都能支持 IP 路由,并且成本,延迟和带宽基本与二层交换基本一致,消除了使用的担忧,这才能被大规模使用。
这里再次体现了技术的螺旋式演进和交叉影响,有些技术可能生不逢时,但是并不是不值得了解,随着整体技术的发展,它很有可能迸发新的生命力,甚至可能是跨领域发光发热。
参考
- 《云原生数据中心网络》https://book.douban.com/subject/35913541/
- 《Data Center Network Topologies:FatTree》Hakim Weatherspoon.
- https://community.fs.com/article/the-layers-of-optical-transp...
- https://www.pynetlabs.com/fhrp-first-hop-redundancy-protocol/
- https://www.ibm.com/topics/mttr
- https://networkengineering.stackexchange.com/questions/18873/...
- https://blog.ipspace.net/2010/10/multi-chassis-link-aggregati...
- https://blog.ipspace.net/2012/08/the-state-of-trill.html
- https://engineering.fb.com/2019/03/14/data-center-engineering...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。