负载均衡算法
负载均衡 (Load Balancing) 是一种将网络请求流量根据特定算法分发到后端多台服务器的技术。其核心目标是优化资源使用、最大化吞吐量、缩短响应时间并避免任何单一服务器的过载,从而提高应用的可用性和可靠性。
随机算法
这是最基础的负载均衡思想,实现简单。
-
基本随机
-
工作原理:从可用的服务器列表中完全随机地选择一台来处理请求。
-
优点:实现极其简单。
-
缺点:无法感知服务器的性能差异。性能好的服务器和性能差的服务器接收请求的概率是相同的,可能导致性能差的服务器过载。
-
-
加权随机
-
工作原理:在基本随机的基础上为每台服务器分配一个权重值 (Weight),权重越高的服务器被选中的概率越大。一种较优的实现方式是计算所有服务器的总权重,然后生成一个在总权重范围内的随机数,最后遍历服务器列表,通过区间判断来确定请求应由哪台服务器处理。
-
优点:考虑了服务器的性能差异,能将更多请求导向性能更强的服务器。
-
缺点:随机性本身存在不确定性,在请求量不够大的情况下,分配结果可能不符合预期权重。
-
轮询算法 (Round Robin)
轮询算法通过一种确定性的、循环的方式来分配请求。
-
基本轮询
-
工作原理:按顺序将每个新请求依次分配给服务器列表中的下一台服务器,当到达列表末尾时,再从头开始。
-
优点:实现简单,请求分配绝对均匀。
-
缺点:与基本随机一样,它忽略了服务器的性能差异,无法做到根据服务器能力来分配负载。
-
-
加权轮询 (Weighted Round Robin)
-
工作原理:为每台服务器分配权重,根据权重来决定轮询的次数。例如,服务器A权重为3,B为1,则请求序列可能是
A, A, A, B, A, A, A, B, ...。 -
缺点:简单的实现会导致请求在短时间内集中在同一台高权重服务器上,造成瞬时压力过大,而不是平滑地交错分配。
-
-
平滑加权轮询 (Smooth Weighted Round Robin)
-
工作原理:这是对加权轮询的重大优化,也是目前工业界应用最广的算法之一(如 Nginx)。它引入了“动态权重”或“当前权重”的概念。
-
每次调度时,遍历所有服务器,让它们的“当前权重”增加各自的“静态权重”。
-
从所有服务器中选出“当前权重”最大的那一台作为处理本次请求的服务器。
-
将选中服务器的“当前权重”减去所有服务器的“静态权重”之和。
-
重复此过程。
-
-
优点:能够在遵循权重的同时,平滑、交错地分发请求,避免了普通加权轮询的流量突发问题。
-
适用场景:非常适合处理大量短连接的服务,如 HTTP 请求。在后端服务器处理每个请求的时间基本相同时,效果最佳。
-
源地址哈希算法 (Source IP Hash / Consistent Hashing)
此类算法的核心目标是实现“会话保持”或“会话粘性”,即确保来自同一客户端的请求始终被定向到同一台后端服务器。
-
工作原理
-
基本IP哈希: 对请求的源IP地址进行哈希计算,然后用服务器数量取模,根据结果将请求分配到对应的服务器。
-
一致性哈希: 为了解决基本哈希在服务器增减时导致大量会话映射失效的问题,一致性哈希被提出。它将服务器和请求的哈希值都映射到一个环形空间上(例如 0 ~ 2^32-1)。一个请求会顺时针寻找环上的第一个服务器节点进行处理。
-
-
虚拟节点优化
-
问题:当服务器数量较少时,它们在哈希环上的分布可能不均匀,导致负载倾斜。
-
解决方案:引入“虚拟节点”概念。一台物理服务器可以映射为多个虚拟节点,这些虚拟节点被更均匀地散布在哈希环上,从而大大提高了负载的均衡性。
-
-
优点:能够实现会话保持,对于需要维护用户状态(如购物车、登录状态)且没有部署分布式会话管理的应用非常有用。
-
缺点:当某台服务器故障时,原来分配给它的所有会话都会失效或需要重新分配。
-
适用场景:需要会话粘性的场景,尤其是在应用层不方便或无法使用 Cookie 进行会话保持的协议中。
最小连接数算法 (Least Connections)
这是一种根据服务器当前真实负载情况进行决策的动态负载均衡算法。
-
工作原理:负载均衡器会记录每台后端服务器当前建立的活跃连接数。当一个新的请求到来时,它会被发送到当前活跃连接数最少的那台服务器。
-
加权最小连接数 (Weighted Least Connections)
-
工作原理:在最小连接数的基础上,结合服务器的权重。调度器会优先选择
(活跃连接数 / 权重)这个比值最小的服务器。这样既考虑了当前负载,也兼顾了服务器本身的处理性能。 -
优点:非常智能,能根据服务器的实际负载状态动态调整,将请求导向最空闲的服务器,实现更优的负载均衡效果。
-
缺点:需要实时统计和维护所有服务器的连接数,实现相对复杂。
-
-
适用场景:后端服务器处理请求所需时间差异较大的场景。尤其适合长连接应用(如数据库连接、FTP、WebSocket 等),能有效避免某台服务器因处理慢速请求而导致连接堆积。
| 算法类型 | 核心思想 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 轮询 (平滑加权) | 按权重循环、平滑地分配请求 | 简洁高效,无状态,分配平滑 | 无法感知服务器真实负载 | 大量短连接、请求处理时间相近的服务 (如 Web 服务器) |
| 源地址哈希 | 根据客户端IP哈希,实现会话粘性 | 保证同一客户端的请求落到同一服务器 | 服务器增减或故障可能影响部分会话 | 需要会话保持且无分布式会话机制的应用 |
| 最小连接数 (加权) | 将请求分配给当前连接数最少的服务器 | 动态感知真实负载,均衡效果好 | 实现复杂,需要维护连接数状态 | 长连接服务、请求处理时间差异大的场景 (如数据库代理) |
| 随机 (加权) | 根据权重随机分配 | 实现简单 | 随机性导致分配不够精确 | 简单场景或作为其他复杂算法的补充 |