(四)实际项目中负载均衡调度算法实际应用

本文详细介绍了三种常用的负载均衡软件——HAProxy、nginx和LVS的调度算法,包括轮询、最少连接、源地址散列等多种算法,并提供了具体的配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

部分内容参考网上,如有问题,请留言。
实际项目中负载均衡软件是怎么实现负载均衡功能的呢?通过特定的负载均衡算法来实现:

(一).HAProxy的负载均衡调度算法有如下8种:

一、roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;
二、static-rr,表示根据权重,建议关注;
三、leastconn,表示最少连接者先处理,建议关注;
四、source,表示根据请求源IP,建议关注;
五、uri,表示根据请求的URI;
六、url_param,表示根据请求的URl参数'balance url_param' requires an URL parameter name
七、hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
八、rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
其实这些算法各有各的用法,我们平时应用得比较多的应该是roundrobinsourcelestconn,大家可以重点关注下。这里我用 HAProxy+Keepalived时没有考虑HAProxy进程级别的高HA,一来是因为淘宝也在用它作为负载均衡器,稳定性肯定不需要怀疑;二来在 测试时发现确实相当的稳定,杀掉HAProxy进程还必须用kill -9,所以没有在这上面浪费时间了;在测试时也确实考虑过用HAProxy+Keepalived做双主架构,后来发现不是太好维护就算了。

(二).nginx 负载均衡调度算法及5种配置方式:

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、weight

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:
upstream bakend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}

3、ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
例如:
upstream bakend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}

4、fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backend {
server server1;
server server2;
fair;
}

5、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}

6.tips:

upstream bakend{#定义负载均衡设备的Ip及设备状态
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
在需要使用负载均衡的server中增加
proxy_pass http://bakend/;
每个设备的状态设置为:
1.down 表示单前的server暂时不参与负载
2.weight 默认为1.weight越大,负载的权重就越大。
3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误 。
4.fail_timeout:max_fails次失败后,暂停的时间。
5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

7.nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug
client_body_temp_path 设置记录文件的目录 可以设置最多3层目录
location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡。

(三)LVS十种调度算法

1、静态调度:

①rr(Round Robin):轮询调度,轮叫调度

轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。【提示:这里是不考虑每台服务器的处理能力】

②wrr:weight,加权(以权重之间的比例实现在各主机之间进行调度)

由于每台服务器的配置、安装的业务应用等不同,其处理能力会不一样。所以,我们根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。

③sh:source hashing,源地址散列。主要实现会话绑定,能够将此前建立的session信息保留了

源地址散列调度算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的并且没有超负荷,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同。它的算法流程与目标地址散列调度算法的基本相似,除了将请求的目标IP地址换成请求的源IP地址,所以这里不一个一个叙述。

④Dh:Destination hashing:目标地址散列。把同一个IP地址的请求,发送给同一个server。

目标地址散列调度算法也是针对目标IP地址的负载均衡,它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

2、动态调度

①lc(Least-Connection):最少连接

最少连接调度算法是把新的连接请求分配到当前连接数最小的服务器,最小连接调度是一种动态调度短算法,它通过服务器当前所活跃的连接数来估计服务器的负载均衡,调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1,当连接中止或超时,其连接数减一,在系统实现时,我们也引入当服务器的权值为0时,表示该服务器不可用而不被调度。
简单算法:active*256+inactive(谁的小,挑谁)

②wlc(Weighted Least-Connection Scheduling):加权最少连接。

加权最小连接调度算法是最小连接调度的超集,各个服务器用相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权限,加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。
简单算法:(active*256+inactive)/weight【(活动的连接数+1)/除以权重】(谁的小,挑谁)

③sed(Shortest Expected Delay):最短期望延迟 基于wlc算法

简单算法:(active+1)*256/weight 【(活动的连接数+1)*256/除以权重】

④nq(never queue):永不排队(改进的sed)

无需队列,如果有台realserver的连接数=0就直接分配过去,不需要在进行sed运算。

⑤LBLC(Locality-Based Least Connection):基于局部性的最少连接

基于局部性的最少连接算法是针对请求报文的目标IP地址的负载均衡调度,不签主要用于Cache集群系统,因为Cache集群中客户请求报文的布标IP地址是变化的,这里假设任何后端服务器都可以处理任何请求,算法的设计目标在服务器的负载基本平衡的情况下,将相同的目标IP地址的请求调度到同一个台服务器,来提高个太服务器的访问局部性和主存Cache命中率,从而调整整个集群系统的处理能力。
基于局部性的最少连接调度算法根据请求的目标IP地址找出该目标IP地址最近使用的RealServer,若该Real Server是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。

⑥LBLCR(Locality-Based Least Connections withReplication):带复制的基于局部性最少链接

带复制的基于局部性最少链接调度算法也是针对目标IP地址的负载均衡,该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。


### 负载均衡调度算法概述 负载均衡的核心目标是通过合理的请求分发机制,优化服务系统的性能、可用性和资源利用率[^1]。为了达到这一目的,不同的负载均衡器实现了多种调度算法,这些算法各有优劣,并适用于不同场景。 常见的负载均衡调度算法包括但不限于轮询法(Round Robin)、加权轮询法(Weighted Round Robin)、最少连接数法(Least Connections)、加权最少连接数法(Weighted Least Connections)、源地址哈希法(Source Hashing),以及其他更高级的动态调整方法[^2]。 #### 各类负载均衡调度算法及其特点 1. **轮询法 (Round Robin)** 这是最简单的负载均衡算法之一,它按照顺序依次将请求发送到各个服务器上。这种方法假设所有服务器具有相同的处理能力,因此能均匀分布流量。 2. **加权轮询法 (Weighted Round Robin)** 加入权重的概念后,可以根据各服务器的实际性能为其分配不同的请求比例。高性能的服务器会被赋予更高的权重值,从而接收更多请求。 3. **最少连接数法 (Least Connections)** 此算法优先把新来的请求转发给当前活跃连接数最小的那个节点。这样可以有效减少单台机器过载的可能性,尤其当某些操作耗时较长时更为重要。 4. **加权最少连接数法 (Weighted Least Connections)** 它是在“最少连接”的基础上增加了对服务器性能差异的支持。即不仅考虑哪个服务器上的现有连接少,还会结合该服务器的能力给予适当倾斜。 5. **源地址哈希法 (Source Hashing)** 使用客户端IP地址作为键生成散列函数的结果,以此决定应该由哪一台特定的服务器响应此用户的请求。这种方式常用于需要维持会话状态的应用程序中。 6. **其他复杂算法** 在一些特殊情况下,还可以采用基于预测模型或者反馈控制理论设计出来的更加智能型的调度策略。比如利用机器学习技术分析历史访问模式来进行预判性的任务指派;或者是引入健康检测机制动态剔除故障主机等等[^3]。 #### 实现方式与层次区别 从协议栈的角度来看,负载均衡分为(Layer 4, L4) 和七层(Layer 7, L7)[^4]: - 层负载均衡主要关注TCP/IP层面的数据包重定向,效率高但灵活性较低; - 七层负载均衡则深入HTTP/HTTPS等应用层协议内部,具备解析URL路径参数甚至修改报文体内容的功能,虽然消耗更多的计算资源却提供了极大的定制空间。 无论在哪一层面上运作,最终都需要依靠具体的软件产品或硬件设备去完成上述提到的各种逻辑运算过程。例如Nginx、HAProxy属于开源解决方案代表作,F5 BIG-IP则是商业级高端选项中的佼佼者。 --- ### 示例代码展示 以下是使用Python模拟最基础版本的轮询调度算法: ```python class LoadBalancer: def __init__(self, servers): self.servers = servers self.index = 0 def get_server(self): server = self.servers[self.index % len(self.servers)] self.index += 1 return server servers_list = ["ServerA", "ServerB", "ServerC"] lb = LoadBalancer(servers_list) for _ in range(5): print(lb.get_server()) ``` 以上脚本定义了一个简易版的负载均衡器类`LoadBalancer`,并通过循环调用实例方法`get_server()`演示如何轮流选取下一可用的服务端点名称列表项。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值