ONOS:负载均衡路由算法及应用开发(一)

一、应用介绍

当新流量发起时,本应用将为其选择一条路由路径,这条路径具有全局负载均衡意义上的最小权值(Weight/Cost)。
本应用即将开源在笔者的Github【https://github.com/MaoJianwei/ONOS_LoadBalance_Routing_Forward
本系列文章后续也将同步在笔者的博客Blog【http://maojianwei.github.io/

为负载均衡举一个简单的例子,在一个三节点的环形网络中,Host2想要访问Host1,此时网络中已经有了一些背景流量,三条线路目前的负载分别是800M、600M、400M,那么考虑到600M和400M构成的路径的负载更小(600M),我们将为Host2的这次访问选择这条绕远的路径。下图是笔者在与ONOS Community Mail-List【https://groups.google.com/a/onosproject.org/forum/#!forum/onos-discuss】交流时使用的一张图。

本应用的负载均衡算法主要考虑的是路径带宽的负载均衡。路径的带宽权值跟组成路径的每一条线路的带宽权值息息相关。一条线路的带宽权值可分为两种:一种是线路的剩余带宽,另一种是线路的剩余带宽比,也即剩余带宽占总带宽的比重。相应地,一条路径的带宽权值也就对应着各条线路剩余带宽的最小值,和各条线路剩余带宽比的最小值。笔者认为从均衡负载的角度看,以后者作为路径的带宽权值更为合适。

考虑这样一种情况,虽然它在现网中可能比较少见?两点间有A、B两条路径,但是A路径的工作带宽比B路径的大,假设A为400G,B为350G,若以剩余带宽为权值,那么最开始的50G流量将完全经由A路径,而B路径完全空闲。回到实验室中的常见场景,A路径可能是光纤10G,B路径可能是双绞线1G,在相差一个数量级的背景下,大多数时间里流量将全部经由A路径,而B路径将可能持续空闲。因此,若以剩余带宽为度量,容易导致网络流量只覆盖高速链路,而低速链路基本空闲的情况。

由此本应用将使用剩余带宽比作为带宽权值的标准,计算公式如下:
Weight = LinkRestBandwidth ÷ LinkLineSpeed × 100

此外,ONOS现有的路由算法和权重计算工具类中,默认以更小的权值代表更优的链路,因此本应用作为部署在ONOS的应用之一,对上述权值做了个转化,同样以最小权值为最优,最终的公式如下:
Weight = 100 - ( LinkRestBandwidth ÷ LinkLineSpeed × 100 )

二、算法及ONOS实现相关

本应用的工作主要划分为四大部分:探路、算权值、选路和铺路。其中选路部分又可划分为优选和选定两个部分。前三大部分属于负载均衡算法的范围。在算法的运作过程中,我们的路径结果集将历经逐步的筛选:

可选路由路径→→优选路由路径→→最优路由路径

下面笔者为大家一一讲解各个部分:

1.探路

开始的开始,我们以全网拓扑图作为输入参数,启动算法。拓扑图是一个图的数据结构,本应用将源主机作为起点,目标主机作为终点,采用递归的方式,进行DFS深度优先搜索,并以遍历完整个拓扑图为目标。

经历每一个节点时,将该节点和经过的链路进行记录,递归返回时则移除。当发现到达目标主机时,将此时记录的所有节点和链路信息整合成一条可选路由路径,记录入结果集。期间若发现到达之前经历过的节点,则判定形成了路由环路,向上进行回溯。
最终,我们将得到多条从源主机到目的主机的无环通路,将其称之为可选路由路径。

2.算权值

我们将为每一条可选路由路径计算带宽权值。首先,计算路径上的每一条链路的权值。我们需要获取链路当前的工作速率,还要获取链路当前的流量速率,通过上文所述的公式进行权值的计算:

Weight = 100 - ( LinkRestBandwidth ÷ LinkLineSpeed × 100 )

其次,选择路径上所有链路的权值的最大值,作为该路径的带宽权值。因为各条链路的负载不同,根据木桶效应,具有最大负载的链路将成为整条路径的短板。

三、选路

3.1 优选

我们通过比较各条路径的带宽权值,从中选出一组具有较小权值的路径,作为优选路由路径。这组路径中至少有一条路径的权值为所有可选路由路径的权值中的最小值。其余优选路由路径的权值与该路径的权值做差后,差值在预设的容限范围内。

这里笔者要插播介绍一下容限范围的意义和作用。
容限范围的意义在于,容忍由于收集不同链路、不同设备的工作参数和统计信息时,由于有周期间隔存在而导致的部分信息更新不及时的问题;容忍由于底层设备在统计上出现的微小正负偏差而造成的数据误差问题。这两点属于测量中的系统误差,应当采取一定的方法进行容忍。

此外,通过先选出一组负载相近的路径,能够给我们提供应用更多路由策略的可能。如下文本算法选路部分中的“选定”步骤,就是一个例子。

容限比例的最佳选取方案应是按不同的链路工作速率进行区分和选取,同时还要考虑实际设备在测量时的偏差范围和测量周期间隔的长短。下表1给出了两组工作速率在不同容限比例下的容限带宽范围,在设备测量精度和测量间隔允许的情况下,选择越小的容限比例能得到越精确的负载均衡效果。表中突出部分为在一般情况下可选用的粗略的容限参考值。希望有现网实践经验的前辈们和朋友们能多多指教,我渴望能收获工程实践中的点滴经验,非常感谢 


容限比例


100M


1000M


10G


25G


100G


300G


350G


400G


0.10%


0.1M


1M


10M


25M


100M


300M


350M


400M


0.05%


0.05M


0.5M


5M


12.5M


50M


150M


175M


200M


0.02%


0.02M


0.2M


2M


5M


20M


60M


70M


80M

3.2 选定

经过优选的步骤,我们已经得到了具有负载均衡意义的路由路径了。此时,我们可以应用其他的路由策略进行进一步的选路。这一步即是对选路结果的优化,也是引入多种路由策略进行共同决策的方法。

在本应用中,采用的选定策略是简单的最少跳数策略。在优选路由路径中选择第一条具有最少跳数的路径作为算法最终选定的最优路由路径。负载均衡算法到此也就完成了它的使命。

四、铺路

在ONOS中,网元设备间的链路被抽象为Link,而设备到终端主机的链路被抽象为EdgeLink。在我们能够获取到的拓扑图中,是不包含最后一公里EdgeLink的。因此,需要在整条路径结果中加上一前一后两个EdgeLink,构成完整的路径,再将路径决策下发到网络中:
SourceEdgeLink→→Links→→DestinationEdgeLink

时间: 2024-10-02 06:14:08

ONOS:负载均衡路由算法及应用开发(一)的相关文章

ONOS:负载均衡路由算法及应用开发(二)

本文将为大家讲述应用的实现,并进行必要的代码分析. 本应用暂时以Maven作为项目的构建工具,并采用最简单的single bundle的项目组织形式[1].如果进行大项目的开发,推荐仿照onos.faultmanagement应用进行模块划分和项目feature组织. 虽然ONOS在最新的1.8.0-SNAPSHOT版本中强制引入了BUCK项目构建工具,但本应用开发时尚未有这个要求.大家在开发自己的应用时仍可使用Maven,但如果想要贡献代码,则必须添加兼容BUCK构建工具的配置信息. 一.Ma

负载均衡各个算法JAVA诠释版

00 前言 首先给大家介绍下什么是负载均衡(来自百科) 负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展 网络设备和 服务器的带宽.增加 吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性. 负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web 服务器. FTP服务器. 企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务. 本文讲述的是"将外部发送来的请求均匀分配到对称结构中的某一台服务器上"的各种算法,并以

关于haproxy负载均衡的算法整理

目前haproxy支持的负载均衡算法有如下8种 1.roundrobin 表示简单的轮询,每个服务器根据权重轮流使用,在服务器的处理时间平均分配的情况下这是最流畅和公平的算法.该算法是动态的,对于实例启动慢的服务器权重会在运行中调整. 2.leastconn 连接数最少的服务器优先接收连接.leastconn建议用于长会话服务,例如LDAP.SQL.TSE等,而不适合短会话协议.如HTTP.该算法是动态的,对于实例启动慢的服务器权重会在运行中调整. 3.static-rr 每个服务器根据权重轮流

那些NB哄哄的负载均衡算法到底是什么样子的?

前言 在软件系统的架构设计中,对集群的负载均衡设计是作为高性能系统优化环节中必不可少的方案.负载均衡本质上是用于将用户流量进行均衡减压的,因此在互联网的大流量项目中,其重要性不言而喻. 一.什么是负载均衡? 早期的互联网应用,由于用户流量比较小,业务逻辑也比较简单,往往一个单服务器就能满足负载需求.随着现在互联网的流量越来越大,稍微好一点的系统,访问量就非常大了,并且系统功能也越来越复杂,那么单台服务器就算将性能优化得再好,也不能支撑这么大用户量的访问压力了,这个时候就需要使用多台机器,设计高性

实现负载均衡的基本算法

平衡算法设计的好坏直接决定了集群在负载均衡上的表现,设计不好的算法,会导致集群的负载失衡.一般的平衡算法主要任务是决定如何选择下一个集群节点,然后将新的服务请求转发给它.有些简单平衡方法可以独立使用,有些必须和其它简单或高级方法组合使用.而一个好的负载均衡算法也并不是万能的,它一般只在某些特殊的应用环境下才能发挥最大效用.因此在考察负载均衡算法的同时,也要注意算法本身的适用面,并在采取集群部署的时候根据集群自身的特点进行综合考虑,把不同的算法和技术结合起来使用. 一.轮转法: 轮转算法是所有调度

负载均衡的那些算法们

上周发了问卷,想了解一下大家对老王有没有什么建议,然后好多朋友都投了票,想了解编程技术和服务器架构的干货,所以接下来会先聊聊编程和架构相关的算法,然后大概在6月下旬会跟大家聊聊面试那些事儿(老王到目前大约参加了几百次的面试,可以从面试官的角度来聊聊不一样的面试).老王聊技术有个特点,就是绝不假大空,只求贴地飞行.所以,聊的东西一定会跟实际有关联,大家在平时也有可能用得着. 今天跟大伙儿聊的是负载均衡相关的一些算法.老王在百度的时候(估计是5-6年前),写过一个通用的基础库(不知道现在还有没有部门

负载均衡基础(经常使用)算法

从这个博客转载: http://blog.csdn.net/u014649204/article/details/25115039 平衡算法设计的好坏直接决定了集群在负载均衡上的表现,设计不好的算法,会导致集群的负载失衡.一般的平衡算法主要任务是决定怎样选择下一个集群节点.然后将新的服务请求转发给它.有些简单平衡方法能够独立使用,有些必须和其他简单或高级方法组合使用.而一个好的负载均衡算法也并非万能的,它一般仅仅在某些特殊的应用环境下才干发挥最大效用.因此在考察负载均衡算法的同一时候.也要注意算

基本的负载均衡算法

平衡算法设计质量直接决定了集群负载均衡性能,设计糟糕的算法.这将导致加载在集群中的不平衡.一般平衡算法的主要任务是决定如何在集群选择下一节点,然后将新的请求被转发到它.简单平衡方法能够独立使用,有些必须和其他简单或高级方法组合使用.而一个好的负载均衡算法也并非万能的,它一般仅仅在某些特殊的应用环境下才干发挥最大效用. 因此在考察负载均衡算法的同一时候.也要注意算法本身的适用面,并在採取集群部署的时候依据集群自身的特点进行综合考虑,把不同的算法和技术结合起来使用. 一.轮转法: 轮转算法是全部调度

Dubbo的负载均衡算法

目录 1 简介 1.1 自适应默认算法 1.2 抽象基类 1.2.1 选择Invoker 1.2.2 计算权重 2 负载均衡算法实现 2.1 加权随机算法 2.2 最小活跃数算法 2.3 一致性哈希 2.4 加权轮询算法 1 简介 Dubbo提供了4种负载均衡机制: 权重随机算法:RandomLoadBalance 最少活跃调用数算法:LeastActiveLoadBalance 一致性哈希算法:ConsistentHashLoadBalance 加权轮询算法:RoundRobinLoadBal