






















《CONGA: Distributed Congestion-Aware Load Balancing for Datacenters》是发表于2014年的面向数据中心的负载均衡机制。
论文的核心观点是:数据中心网络负载均衡最好在网络中完成(而非像MPTCP在主机实现),并且需要全局机制解决网络不对称
论文中的下图画出了CONGA的生态位,也顺便提了一下其他分支的技术:

CONGA的设计过程是先写出了一些期望CONGA具有的性质:响应快,对传输层无感,可适应非对称网络,可局部部署,为叶脊拓扑优化
CONGA依赖于Overlay网络,Overlay网络主要是想实现大二层网络。论文中使用的例子是VXLAN. 这让我思考为什么不能直接使用Underlay网络。Underlay网络的话,IP头可供夹带信息的空间较少确实是一个问题。但这不是最重要的。
VXLAN的基础讲解我阅读了这篇知乎文章以及华为的文档 华为的文档更详细一点。
通过Overlay将整个网络变成大二层的好处是可以知道在物理上一条流是从哪个leaf到哪个leaf的,这个信息可以用于实际记录路径的拥塞情况,是端到端的感知。而IP协议对于不在同一网段的设备,只知道下一跳发送给谁。这样的话即使记录路径情况,也只能知道从IP-src到IP-dst的总体拥塞情况,无法分辨路径,也不存在多路径负载均衡了。
我一开始疑惑Leaf到Leaf也还不是路径啊,中间还隔着Spine呢,后面具体设计解答了。CONGA的VXLAN封装会在包头添加LBTag的四位标签,指示该流从本地的哪个端口发出。
CONGA认为当两批突发包的间隔大于路径延迟差异,就能将第二批流量转移到新路径而不会引发乱序。
为了在数据中心网络中划分flowlet的大小,研究人员镜像了150GB的流量,按照100微秒,500微秒,250毫秒的gap尝试划分了flowlet.因为很少有超过250ms的gap,所以250毫秒的组基本相当于没有划分flowlet,直接是整条流。
实验结果表明500微秒组能让大部分的flow(let)大小减少两个数量级,并且乱序风险小
包经过Leaf-src,检查本地Flowlet表(用于转发已决策的流),如果是新流,则进行负载均衡,检查本地Congestion-to-Leaf表检查到Leaf-dst的路径的拥塞情况。包发出时打上了LBTag的标签,指示是从本地哪个端口出去的(指示了走了哪个Spine)。沿途的交换机会修改包头的CE标签指示拥塞的严重程度。
到达目的Leaf后,Leaf-dst会维护Congestion-from-Leaf表。并在向Leaf-src发送包的时候在包头附加FB_LBTag和FB_Metric,随后Leaf-src将收到的Metric写入Congestion-to-Leaf。
另外,由于CONGA的Leaf-dst不是立即发回,所以等到有回到src的可供夹带信息的数据包时,拥塞情况可能已经改变,CONGA设计了一个过期机制,将拥塞情况逐渐递减到0, 但是如果链路真的拥塞了,它会被一直刷新。我认为这是合理的,在其他负载均衡机制上也见到过。
CONGA使用Discounting Rate Estimator (DRE) 来量化流量积压,有点类似于EWMA。都是为了平滑流量变化,防止反应过激,但是如果拥塞确实上升了需要有所体现。
CONGA论文里说与EWMA相比,DRE有两个关键优势(i)它只需一个寄存器即可实现(而EWMA需要两个寄存器);和(ii)DRE对流量突发的反应更快(因为增量在数据包到达时立即发生)
EWMA算法我第一次接触是在Uno: A One-Stop Solution for Inter- and Intra-Data Center Congestion Control and Reliable Connectivity
这两个算法我打算后面再写一篇文章梳理一下。
Load balancing decisions are made on the first packet of each flowlet (other packets use the port cached in the Flowlet Table). For a new flowlet, we pick the uplink port that minimizes the maximum of the local metric (from the local DREs) and the remote metric (from the Congestion-To-Leaf Table). If multiple uplinks are equally good, one is chosen at random with preference given to the port cached in the (invalid) entry in the Flowlet Table; i.e., a flow only moves if there is a strictly better uplink than the one its last flowlet took.
简而言之,选择一条路径,在这条路径上本地出向压力与链路压力都不大。如果多条一样好的话,则优先选择之前走过的(上一条flowlet的路径,已经因为超时而invalid)。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。