网络动态负载均衡算法分析

转自CSDN博客:http://blog.csdn.net/wallacexiang/archive/2009/07/24/4376147.aspx  

  随着Internet的日益普及,无论在企业网、园区网还是在广域网如Internet上,用户与业务量呈现出指数性增长,尤其是在网络的关键节点和核心网络设备上,网络流量迅速增大,使得单一网络设备根本无法承担,而如何在完成同样功能的多个网络设备之间实现业务量的合理分配,而不致于出现一台设备过忙、而其他设备却未能充分发挥其作用的情况,负载均衡机制及所运用的均衡算法便应运而生。
1 负载均衡的基本概念
  传统上,有2种可能的途径来解决网站过载的问题,第1种途径是通过用处理能力更强的服务器替换现有的服务器,第2种是通过增加服务器来构建服务器群,这2种方法都具有局限性:
  第1种解决方案比较昂贵,并且不具有很好的扩展性,在进行维护与升级时需要中断服务,替换服务器的费用不仅包括新服务器的费用,而且原有的服务器虽然处于功能完好的运行状态也不能再发挥作用产生效益了。
  第2种解决方案是一个可以接受的相对廉价的解决方案,通过增加新的服务器来提高网站的处理能力,并且与原有的服务器共同工作,在升级时不会中断服务,其不足之处在于每一个服务器都有一个惟一的IP地址,用户需要记住多个IP地址以更好地访问该站点,由此也造成流量不能有效地在多个服务器之间进行分配。
  负载均衡设备则是用于管理本地流量,解决上述问题的解决方案。
  负载均衡设备在进行流量管理时,被分配一个虚拟的IP地址即VIP,用户只需通过访问VIP,负载均衡设备会根据当时的服务器的工作状态、负载情况,按照一定的分配算法将流量分配到服务器群中的一个服务器,对于用户来说服务器群是透明的,用户并不知道服务器群的存在,VIP即是该站点的接入地址。相对于第一种方案,负载均衡设备进一步地提高了网站的可靠性,这是由于当服务器群中的某一个服务器发生故障,会有另外的服务器接替其工作,并且负载均衡设备会确保流量不会分配到工作不正常、关机或处理能力已饱和的服务器,负载均衡具有2种类型:
  第1种类型是本地的负载均衡,即在一个站点的多个服务器间进行流量的管理与分配;
  第2种类型是分布式的负载均衡,即在多个站点之间进行流量的管理与分配,将用户分配到用户可以得到最优服务的站点。
  负载均衡建立在现有网络结构之上,他提供了一种廉价有效的方法扩展服务器带宽和增加吞吐量,加强网络数据处理能力,提高网络的灵活性和可用性。他主要完成以下任务:解决网络拥塞问题,服务就近提供,实现地理位置无关性;为用户提供更好的访问质利用效率;避免了网络关键部位出现单点失效。
2 基本的网络负载均衡算法
  均衡算法设计的好坏直接决定了集群在负载均衡上的表现,设计不好的算法,会导致集群的负载失衡。一般的均衡算法主要任务是决定如何选择下一个集群节点,然后将新的服务请求转发给他。有些简单均衡方法可以独立使用,有些必须和其他简单或高级方法组合使用。而一个好的负载均衡算法也并不是万能的,他一般只在某些特殊的应用环境下才能发挥最大效用。因此在考察负载均衡算法的同时,也要注意算法本身的适用面,并在采取集群部署的时候根据集群自身的特点进行综合考虑,把不同的算法和技术结合起来使用。
2.1 轮转法
  轮转算法是所有调度算法中最简单也最容易实现的一种方法。在一个任务队列里,队列的每个成员(节点)都具有相同的地位,轮转法简单的在这组成员中顺序轮转选择。在负载均衡环境中,均衡器将新的请求轮流发给节点队列中的下一节点,如此连续、周而复始,每个集群的节点都在相等的地位下被轮流选择。这个算法在DNS域名轮询中被广泛使用。
  轮转法的活动是可预知的,每个节点被选择的机会是1/N,因此很容易计算出节点的负载分布。轮转法典型的适用于集群中所有节点的处理能力和性能均相同的情况,在实际应用中,一般将他与其他简单方法联合使用时比较有效。
2.2 散列法
  散列法也叫哈希法(HASH),通过单射不可逆的HASH函数,按照某种规则将网络请求发往集群节点。哈希法在其他几类均衡算法不是很有效时会显示出特别的威力。例如,在前面提到的UDP会话的情况下,由于轮转法和其他几类基于连接信息的算法,无法识别出会话的起止标记,会引起应用混乱。
  而采取基于数据包源地址的哈希映射可以在一定程度上解决这个问题:将具有相同源地址的数据包发给同一服务器节点,这使得基于高层会话的事务可以以适当的方式运行。相对称的是,基于目的地址的哈希调度算法可以用在Web Cache集群中,指向同一个目标站点的访问请求都被负载均衡器发送到同一个Cache服务节点上,以避免页面缺失而带来的更新Cache问题。
2.3 最少连接法
  在最少连接法中,均衡器纪录目前所有活跃连接,把下一个新的请求发给当前含有最少连接数的节点。这种算法针对TCP连接进行,但由于不同应用对系统资源的消耗可能差异很大,而连接数无法反映出真实的应用负载,因此在使用重型Web服务器作为集群节点服务时(例如Apache服务器),该算法在均衡负载的效果上要打个折扣。为了减少这个不利的影响,可以对每个节点设置最大的连接数上限(通过阈值设定体现)。
2.4 最低缺失法
  在最低缺失法中,均衡器长期纪录到各节点的请求情况,把下个请求发给历史上处理请求最少的节点。与最少连接法不同的是,最低缺失记录过去的连接数而不是当前的连接数。
2.5 最快响应法
  均衡器记录自身到每一个集群节点的网络响应时间,并将下一个到达的连接请求分配给响应时间最短的节点,这种方法要求使用ICMP包或基于UDP包的专用技术来主动探测各节点。
  在大多数基于LAN的集群中,最快响应算法工作的并不是很好,因为LAN中的ICMP包基本上都在10 ms内完成回应,体现不出节点之间的差异;如果在WAN上进行均衡的话,响应时间对于用户就近选择服务器而言还是具有现实意义的;而且集群的拓扑越分散,这种方法越能体现出效果来。这种方法是高级均衡基于拓扑结构重定向用到的主要方法。
2.6 加权法
  加权方法只能与其他方法合用,是他们的一个很好的补充。加权算法根据节点的优先级或当前的负载状况(即权值)来构成负载均衡的多优先级队列,队列中的每个等待处理的连接都具有相同处理等级,这样在同一个队列里可以按照前面的轮转法或者最少连接法进行均衡,而队列之间按照优先级的先后顺序进行均衡处理。在这里权值是基于各节点能力的一个估计值。
3 动态反馈负载均衡
  当客户访问集群资源时,提交的任务所需的时间和所要消耗的计算资源是千差万别的,他依赖于很多因素。例如:任务请求的服务类型、当前网络带宽的情况、以及当前服务器资源利用的情况等等。一些负载比较重的任务需要进行计算密集的查询、数据库访问、很长响应数据流;而负载比较轻的任务请求往往只需要读一个小文件或者进行很简单的计算。
  对任务请求处理时间的不同可能会导致处理结点利用率的倾斜(Skew),即处理结点的负载不均衡。有可能存在这样的情况,有些结点已经超负荷运行,而其他结点基本是闲置着。同时,有些结点已经忙不过28来,有很长的请求队列,还不断地收到新的请求。反过来说,这会导致客户长时间的等待,而集群整体的服务质量下降。因此,有必要采用一种机制,使得均衡器能够实时地了解各个结点的负载状况,并能根据负载的变化做出调整。
  具体的做法上采用了基于负反馈机制的动态负载均衡算法,该算法考虑每一个结点的实时负载和响应能力,不断调整任务分布的比例,来避免有些结点超载时依然收到大量请求,从而提高单一集群的整体吞吐率。
  在集群内,负载均衡器上运行服务端监控进程,监控进程负责监视和收集集群内各个结点的负载信息;而每个结点上运行客户端进程,负责定时向均衡器报告自身的负载状况。监控进程根据收到的全部结点的负载信息来进行同步操作,既对将要分配的任务按照权值的比例重新进行分布。权值的计算主要根据各个结点的 CPU利用率、可用内存以及磁盘I/O状况计算出新的权值,若新权值和当前权值的差值大于设定的阀值,监控器采用新的权值对集群范围内的任务重新进行分布,直到下一次的负载信息同步到来之前。均衡器可以配合动态权值,采用加权轮询算法来对接受的网络服务请求进行调度。
3.1 加权轮询调度
  加权轮询调度(Weighted Round-Robin Scheduling)算法用相应的权值表示结点的处理性能。该算法根据权值的高低顺序并按照轮询的方式将任务请求分配到各结点。权值高的结点比权值低的结点处理更多的任务请求,相同权值的结点处理相同份额的请求。加权轮询的基本原理可描述为:
  假设某集群内有一组结点N={N0,N1,…,Nn-1},W(Ni)表示结点Ni的权值,一个指示变量i表示上一次选择的服务器,T(Ni)表示结点Ni当前所分配的任务量。
    ∑T(Ni)表示当前同步周期需要处理的任务总量。
    ∑W(Ni)表示结点的权值总和。
则:
    W(Ni)/∑W(Ni)=T(Ni)/∑T(Ni)
表示任务的分配是按照各个结点权值占权值总数的比例来进行分配。
3.2 权值计算
  当集群的结点初次投入系统中使用时,系统管理员根据结点的硬件配置情况对每个结点都设定一个初始权值DW(Ni)(通常根据结点的硬件配置来定义,硬件配置越高的结点默认值越高),在负载均衡器上也先使用这个权值。然后,随着结点负载的变化,均衡器对权值进行调整。
  动态权值是由结点运行时各方面的参数计算出来的。我们在实验中选取了最重要的几项,包括:CPU资源、内存资源、当前进程数、响应时间等信息作为计算公式的因子。结合每个结点当前的权值,可以计算出新的权值的大小。动态权值的目的是要正确反映结点负载的状况,以预测结点将来可能的负载变化。对于不同类型的系统应用,各个参数的重要程度也有所不同。典型的Web应用环境下,可用内存资源和响应时间就非常重要;如果用户以长的数据库事务为主,则CPU使用率和可用内存就相对重要一些。为了方便在系统运行过程中针对不同的应用对各个参数的比例进行适当调整,我们为每一个参数设定一个常量系数Ri,用来表示各个负载参数的重要程度,其中∑Ri=1。因此,任何一个结点Ni的权值公式就可以描述为:
  LOAD(Ni)=R1*Lcpu(Ni)+R2*Lmemory(Ni)+R3*Lio(Ni)+R4*Lprocess(Ni)+R5*Lresponse(Ni)
其中:Lf(Ni)表示结点Ni当前某一项参数的负载值。上述公式中依次表示为:CPU使用率、内存使用率、磁盘I/O访问率、进程总数以及响应时间。
  例如,在Web服务器集群中,我们采用以系数{0.1,0.4,0.1,0.1,0.3},这里认为服务器的内存和请求响应时间较其他参数重要一些。若当前的系数Ri不能很好地反映应用的负载,系统管理员可以对系数不断地修正,直到找到贴近当前应用的一组系数。
  另外,关于采集权值的周期值,虽然很短的周期可以更确切地反映各个结点的负载,但是很频繁地采集(如1 s 1次或者多次)会给均衡器和结点带来负担,也可能增加不必要的网络负荷。另外,由于采集器是在采集时刻进行负载计算的,经实验证明,均衡器反映出来各个结点的负载信息会出现剧烈的抖动,均衡器无法准确捕捉结点真实的负载变化趋势。因此解决这些问题,一方面要适当地调整采集负载信息的周期,一般在5~10 s;另一方面,可以使用移动均均线或者是滑动窗口来避免抖动,使得均衡器收集到的负载信息表现为均滑曲线,这样在负反馈机制的调整效果上就会比较好。
  均衡器的动态权值采集程序周期性地运行,若缺省权值不为0,则查询该结点的各负载参数,并计算出动态权值LOAD(Ni)。我们引入以下权值计算公式,结合结点的初始权值和采集的动态权值来计算最终的权值结果。
Wi=A*DW(Ni)+B*(LOAD(Ni)-DW(Ni))1/3
  在公式中,如果动态权值恰好等于初始权值,最终权值不变,则说明系统的负载状况刚好达到理想状况,等于初始权值DW(Ni)。如果动态权值计算结果高于初始权值,最终权值变高,则说明系统负载很轻,均衡器将会增加分配给该结点的任务比率。如果动态权值低于初始权值,最终权值变低,说明系统开始处于重载状况,均衡器将会减少对该结点分配的任务。在实际使用中,若发现所有结点的权值都小于他们的DW(Ni),则说明当前个集群处于超载状态,这时需要加入新的结点到集群中来处理部分负载;反之,若所有结点的权值大大高于DW(Ni),则说明当前系统的负载都比较轻。
4 结 语
    网络负载均衡是集群作业调度系统的具体实现。由于其处理的作业单元是TCP/IP协议下的网络连接,因此可以采用面向网络连接的集中基本调度算法。考虑集群负载不均衡的可能,采取了动态获取服务节点的权值并使用负反馈机制调整均衡器对网络服务请求的分布,以适应服务节点在运行过程中资源的变化。实践证明,采用动态均衡在集群系统的整体吞吐量方面有所提高,特别是在集群各个节点性能不一,集群提供的网络服务程序所访问的资源多样化的情况下,负反馈机制的效果尤其明显。在其他类型的集群中,负反馈机制的动态负载均衡也能够得到很好的应用,只是均衡器所处理的作业单元不同于网络连接,而具体的负载算法上也将有所不同。

参考文献
[1] 杨义先,等.信息安全新技术[M].北京:邮电大学出版社,2002.
[2] 杨义先,等.网络信息安全与保密[M].北京:邮电大学出版社,2001.


 

转载于:https://www.cnblogs.com/millen/archive/2010/03/11/1683624.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pymysql连接以及连接池的理解

mysql连接 1. 不使用连接池 我们知道使用pymysql连接数据库一般需要下面的步骤: 创建连接对象(一般使用connect或者是连接池) 创建游标对象 使用游标执行代码 使用游标获取结果并返回 # 返回的是元组(每个实例一个元组)! 关闭游标和连接 conn pymysql.connect(host, p…

LeetCode 1025. 除数博弈(动态规划)

1. 题目 爱丽丝和鲍勃一起玩游戏&#xff0c;他们轮流行动。爱丽丝先手开局。 最初&#xff0c;黑板上有一个数字 N 。在每个玩家的回合&#xff0c;玩家需要执行以下操作&#xff1a; 选出任一 x&#xff0c;满足 0 < x < N 且 N % x 0 。用 N - x 替换黑板上的数字…

python iterator iterable_Python中Iterator和Iterable的区别

python中list, str&#xff0c;truple, dict都是可以被迭代的&#xff0c;但他们不是迭代器。why?list/truple/map/dict这些数据的大小是确定的&#xff0c;我们可以准确知道他们的size。迭代器不知道要执行多少次&#xff0c;所以可以理解为不知道有多少个元素&#xff0c;每…

javascript之嵌套函数

在javascript中允许使用嵌套函数: <head><meta http-equiv"Content-Type" content"text/html; charsetgb2312" /><title>嵌套函数</title><script type"text/javascript"> function fun1(){ function fun…

BN / LN / IN / GN /

链接 但是代码不敢苟同! 所以自己写了两种代码! 由于这只是测试, 并不是用来训练, 所以α和β参数就没有加! def BN(inputs):c inputs.shape[1]for i in range(c):channel inputs[:,i,:,:]mu np.mean(channel)var np.var(channel)channel_new ((channel - mu)/(np.sqrt(…

LeetCode 672. 灯泡开关 Ⅱ(枚举)

1. 题目 现有一个房间&#xff0c;墙上挂有 n 只已经打开的灯泡和 4 个按钮。 在进行了 m 次未知操作后&#xff0c;你需要返回这 n 只灯泡可能有多少种不同的状态。 假设这 n 只灯泡被编号为 [1, 2, 3 …, n]&#xff0c;这 4 个按钮的功能如下&#xff1a; 1将所有灯泡的状…

安卓手机绘制uml图_Android Studio中绘制simpleUML类图详细说明及使用

一、Android Studio中安装simpleUML1、下载simpleUML jar包2、 添加simpleUMLCEjar包File--->Settings--->Plugins--->Install Plugin from disk,如下图&#xff1a;3、安装完成后重启AndroidStudio二、使用在某个类或module上右击&#xff0c;选择Add to simpleUML D…

ExtJs非Iframe框架加载页面实现

在用Ext开发App应用时&#xff0c;一般的框架都是左边为菜单栏&#xff0c;中间为tab页方式的显示区域。而tab页面大多采用的嵌入一个iframe来显示内容。但是采用iframe方式有一个很大的弊端就是每次在加载一个新的iframe时都要将Ext的核心js&#xff0c;css文件重新加载。由于…

LeetCode 873. 最长的斐波那契子序列的长度(动态规划)

文章目录1. 题目2. 解题2.1 暴力解2.2 动态规划1. 题目 如果序列 X_1, X_2, ..., X_n 满足下列条件&#xff0c;就说它是 斐波那契式 的&#xff1a; n>3n > 3n>3对于所有 i2<ni 2 < ni2<n&#xff0c;都有 XiXi1Xi2X_i X_{i1} X_{i2}Xi​Xi1​Xi2​ 给…

中文验证码 php_还在苦恼验证码怎么实现?看看这个验证码组件合集,你想要的都有...

随着安全性的要求越来越高&#xff0c;如今的验证码已经不再是简单的四个数字或者字母了&#xff0c;更复杂的图形验证码和行为验证码已经成为了更流行的趋势&#xff0c;但更难的实现也让很多开发者头秃&#xff0c;Gitee 已经替你们想到了这一点。不多说了&#xff0c;下面这…

SessionState详解

<sessionState> 元素 配置当前应用程序的会话状态设置。 配置结构的示例&#xff1a; <configuration> <system.web> <sessionState> <sessionState mode"Off|InProc|StateServer|SQLServer" cookieless"true…

reload端口 tomcat_tomcat上部署网站的三种方式

一、利用webapps文件夹自动部署这是最简单的方式&#xff0c;只要将网站直接拷贝到&#xff1a;tomcat根目录下的webapps文件夹里举例&#xff1a;helloworld文件夹下创建里index.html文件&#xff0c;然后把helloworld文件夹移动到tomcat根目录下webapps文件夹里&#xff0c;重…

LeetCode 1095. 山脉数组中查找目标值(二分查找)

1. 题目 给你一个 山脉数组 mountainArr&#xff0c;请你返回能够使得 mountainArr.get(index) 等于 target 最小 的下标 index 值。 如果不存在这样的下标 index&#xff0c;就请返回 -1。 何为山脉数组&#xff1f;如果数组 A 是一个山脉数组的话&#xff0c;那它满足如下…

不能用蛮力法解决的问题_溆浦事蒙汉:脱贫攻坚绝不能心浮气躁骄傲自满疲倦厌战...

脱贫攻坚绝不能心浮气躁骄傲自满疲倦厌战——蒙汉到卢峰镇检查“四支队伍”集村部工作情况检查南华山村“四支队伍”集村部工作情况与大潭村贫困户舒采米座谈红网溆浦讯(记者 伍交才)8月28日&#xff0c;市人大常委会副主任、县委书记蒙汉到卢峰镇南华山村、大潭村检查“四支队…

Oracle 性能调优 概述

在过去的十年中&#xff0c; Oracle 已经成为世界上最专业的数据库之一。对于 IT 专家来说&#xff0c;就是要确保利用 Oracle 的强大特性来提高他们公司的生产力。最有效的方法之一是通过 Oracle 调优。它有大量的调整参数和技术来改进你的 Oracle 数据库的性能。 Oracle 调优…

LeetCode 801. 使序列递增的最小交换次数(动态规划)

1. 题目 我们有两个长度相等且不为空的整型数组 A 和 B 。 我们可以交换 A[i] 和 B[i] 的元素。注意这两个元素在各自的序列中应该处于相同的位置。 在交换过一些元素之后&#xff0c;数组 A 和 B 都应该是严格递增的&#xff08;数组严格递增的条件仅为A[0] < A[1] <…

mock模拟接口测试 vue_vue+mock.js实现前后端分离

之前都是介绍在普通项目中使用mock.js&#xff0c;那么本次就来介绍一下在vue中使用mock.js实现前后端分离。安装&#xff1a;npm install mockjs这里先写个小案例介绍一下具体使用&#xff0c;写法不规范&#xff0c;仅供参考。然后案例讲完后我们讲具体的规范使用那么一起来看…

进一步的去了解正则[一]

1 正则是什么. 请先看 http://www.phpchina.com/html/11/n-34811.html 几k 的解释后. 原地址已被更改&#xff0c;重新找了一个教程&#xff0c;请点击。 http://deerchao.net/tutorials/regex/regex.htm2 实例剖析.1. $str <FORM NAME"ADFA" ACTION"AS…

LeetCode 123. 买卖股票的最佳时机 III(动态规划)

1. 题目 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意: 你不能同时参与多笔交易&#xff08;你必须在再次购买前出售掉之前的股票&#xff09;。 示例 1: 输入: […

mysql异步复制参数_MySQL Replication(异步复制)基本原理

1、复制进程Mysql的复制(replication)是一个异步的复制&#xff0c;从一个Mysqlinstace(称之为Master)复制到另一个Mysqlinstance(称之Slave)。实现整个复制操作主要由三个进程完成的&#xff0c;其中两个进程在Slave(Sql进程和IO进程)&#xff0c;另外一个进程在Master(IO进程…