负载均衡基础(经常使用)算法
从这个博客转载: http://blog.csdn.net/u014649204/article/details/25115039
平衡算法设计的好坏直接决定了集群在负载均衡上的表现,设计不好的算法,会导致集群的负载失衡。一般的平衡算法主要任务是决定怎样选择下一个集群节点。然后将新的服务请求转发给它。有些简单平衡方法能够独立使用,有些必须和其他简单或高级方法组合使用。而一个好的负载均衡算法也并非万能的,它一般仅仅在某些特殊的应用环境下才干发挥最大效用。因此在考察负载均衡算法的同一时候。也要注意算法本身的适用面,并在採取集群部署的时候依据集群自身的特点进行综合考虑,把不同的算法和技术结合起来使用。
3.1 轮转法:
轮转算法是全部调度算法中最简单也最easy实现的一种方法。
在一个任务队列里。队列的每一个成员(节点)都具有同样的地位。轮转法简单的在这组成员中顺序轮转选择。
在负载平衡环境中。均衡器将新的请求轮流发给节点队列中的下一节点,如此连续、周而复始。每一个集群的节点都在相等的地位下被轮流选择。这个算法在DNS域名轮询中被广泛使用。
轮转法的活动是可预知的,每一个节点被选择的机会是1/N。因此非常easy计算出节点的负载分布。
轮转法典型的适用于集群中全部节点的处理能力和性能均同样的情况,在实际应用中,一般将它与其它简单方法联合使用时比較有效。
3.2 散列法
散列法也叫哈希法(HASH),通过单射不可逆的HASH函数。依照某种规则将网络请求发往集群节点。哈希法在其它几类平衡算法不是非常有效时会显示出特别的威力。
比如,在前面提到的UDP会话的情况下,因为轮转法和其它几类基于连接信息的算法,无法识别出会话的起止标记,会引起应用混乱。
而採取基于数据包源地址的哈希映射能够在一定程度上解决问题:将具有同样源地址的数据包发给同一server节点,这使得基于高层会话的事务能够以适当的方式执行。
相对称的是,基于目的地址的哈希调度算法能够用在Web Cache集群中,指向同一个目标网站的訪问请求都被负载平衡器发送到同一个Cache服务节点上,以避免页面缺失而带来的更新Cache问题。
3.3 最少连接法
在最少连接法中,平衡器纪录眼下全部活跃连接。把下一个新的请求发给当前含有最少连接数的节点。这样的算法针对TCP连接进行。但因为不同应用对系统资源的消耗可能差异非常大。而连接数无法反映出真实的应用负载,因此在使用重型Webserver作为集群节点服务时(比如Apacheserver)。该算法在平衡负载的效果上要打个折扣。为了降低这个不利的影响。能够对每一个节点设置最大的连接数上限(通过阈值设定体现)。
3.4 最低缺失法
在最低缺失法中,平衡器长期纪录到各节点的请求情况,把下个请求发给历史上处理请求最少的节点。与最少连接法不同的是。最低缺失记录过去的连接数而不是当前的连接数。
3.5 最快响应法
平衡器记录自身到每个集群节点的网络响应时间。并将下一个到达的连接请求分配给响应时间最短的节点,这样的方法要求使用ICMP包或基于UDP包的专用技术来主动探測各节点。
在大多数基于LAN的集群中,最快响应算法工作的并非非常好,由于LAN中的ICMP包基本上都在10ms内完毕回应,体现不出节点之间的差异;假设在 WAN上进行平衡的话,响应时间对于用户就近选择server而言还是具有现实意义的;并且集群的拓扑越分散这样的方法越能体现出效果来。
这样的方法是高级平衡基于拓扑结构重定向用到的主要方法。
3.6 加权法
加权方法仅仅能与其它方法合用。是它们的一个非常好的补充。加权算法依据节点的优先级或当前的负载状况(即权值)来构成负载平衡的多优先级队列,队列中的每一个等待处理的连接都具有同样处理等级,这样在同一个队列里能够依照前面的轮转法或者最少连接法进行均衡,而队列之间依照优先级的先后顺序进行均衡处理。
在这里权值是基于各节点能力的一个预计值。
网上比較具体的说明
实现负载均衡的算法
我们知道,负载均衡器在负载均衡设备中的作用是至关重要的,它起着承上启下的作用。一方面接收用户的网络请求,一方面把请求依照某种算法转接到特定的应用server中,实现负载均衡。所以,负载均衡器中的算法是至关重要的。大多数负载均衡设备实现了下面多种算法。
1、轮询调度
轮询调度(Round Robin Scheduling)算法就是以轮询的方式依次将请求调度到不同的server。即每次调度运行i = (i + 1) mod n,并选出第i台server。算法的长处是其简洁性。它无需记录当前全部连接的状态,所以它是一种无状态调度。
在实际实现过程中。通常会为每台server设定一个权重值,这就是权重轮询调度算法。
2、最小连接调度(Least-Connection Scheduling)
最小连接调度(Least-Connection Scheduling)算法是把新的连接请求分配到当前连接数最小的server。
最小连接调度是一种动态调度算法,它通过server当前所活跃的连接数来预计server的负载情况。
在实际实现过程中,通常会为每台server设定一个权重值,这就是加权最小连接调度(Weighted Least-Connection Scheduling)
3、 基于局部性的最少链接(LBLC)
基于局部性的最少链接调度(Locality-Based Least Connections Scheduling,下面简称为LBLC)算法是针对请求报文的目标IP地址的负载均衡调度,眼下主要用于Cache集群系统,由于在Cache集群中客户请求报文的目标IP地址是变化的。
LBLC调度算法先依据请求的目标IP地址找出该目标IP地址近期使用的server,若该server是可用的且没有超载,将请求发送到该server; 若server不存在。或server超载或有server处于其一半的工作负载,则用“最少链接”的原则选出一个可用的server。将请求发送到该server。
4、带复制的基于局部性最少链接(LBLCR)
带复制的基于局部性最少链接调度(Locality-Based Least Connections with Replication Scheduling。下面简称为LBLCR)算法也是针对目标IP地址的负载均衡。眼下主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组server的映射,而LBLC算法维护从一个目标IP地址到一台server的映射。
LBLCR调度算法将“热门”网站映射到一组Cacheserver(server集合)。当该“热门”网站的请求负载添加时,会添加集合里的Cacheserver,来处理不断增长的负载; 当该“热门”网站的请求负载降低时,会降低集合里的Cacheserver数目。这样,该“热门”网站的映像不太可能出如今全部的Cacheserver上,从而提供Cache集群系统的使用效率。
5、目标地址散列调度(Destination Hashing Scheduling)
目标地址散列调度(Destination Hashing Scheduling)算法是针对目标IP地址的负载均衡,但它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台server。
目标地址散列调度算法先依据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出相应的server,若该server是可用的且未超载,将请求发送到该server,否则返回空。
6、 源地址散列调度(Source Hashing Scheduling)
和目的地址散列调度类似。唯一的区别在于,根据散列函数散列密钥的源地址。
在实践中,,源地址和目的地址哈希散列调度调度可以结合防火墙集群使用,他们可以确保整个系统的唯一入口。