# “负载均衡”背后的算法

> 本文公开全文。

原文：https://utgd.net/article/20840

🔗 原文链接

当单个服务器无法满足需求时，企业通常会选择部署多个服务器，并通过负载均衡器来分配传入的请求。

本文详细探讨了从简单到复杂的负载均衡算法，帮助读者理解如何在实际环境中优化服务器性能。

文章从最基础的 “轮询” 算法开始，这是一种将请求依次分配给各服务器的方法。当请求速率增加到每秒 3 个时，单个服务器无法处理，导致请求被丢弃。通过增加服务器并采用轮询算法，可以避免请求丢弃。但在实际应用中，服务器性能和请求成本往往存在差异，这使得简单的轮询算法效果不佳。

为了应对这一问题，文章介绍了 “加权轮询” 算法，通过给每个服务器分配权重，根据服务器的性能分配请求。动态加权轮询则进一步优化，通过实时监测服务器的响应时间来调整权重，更好地适应服务器性能的变化。然而，这些方法仍无法完全解决请求和服务器性能的巨大差异。

随后，文章引入了 “最少连接数” 算法，通过跟踪每个服务器的未完成请求数，将新请求分配给未完成请求最少的服务器。这种方法不仅简单易行，而且在处理高变异性请求和服务器性能时表现出色。

在讨论了几种常见算法后，作者提出了一种结合 “动态加权轮询” 和 “最少连接数” 优点的新算法 ——“峰值指数加权移动平均”（PEWMA）算法。该算法通过记录每个服务器最近的响应时间并与未完成请求数相乘，动态调整请求分配。尽管 PEWMA 算法在复杂性上有所增加，但它在处理延迟方面表现优异，尤其是在高百分位数的延迟优化上效果显著。

简单总结一下这几种策略：

- 单服务器：初始设定中，单服务器每秒处理 1 个请求，当请求增加到 3 个每秒时，会导致请求被丢弃。

- 轮询算法：最简单的负载均衡方式，适用于所有服务器性能相同且请求成本相等的情况。

- 请求队列：引入请求队列以减少请求丢弃，但会增加某些请求的延迟。

- 加权轮询：通过人为设置权重，分配请求到性能更好的服务器，但实际应用中手动设置权重难度大。

- 动态加权轮询：通过服务器响应延迟动态调整权重，更好地适应服务器性能的变化。

- 最少连接数算法：通过跟踪每个服务器的未完成请求数，将新请求分配给未完成请求最少的服务器。

- 峰值指数加权移动平均算法（PEWMA）\: 结合动态加权轮询和最少连接数算法，优化延迟和弹性。

作者在文章中多次强调，尽管这些算法在模拟环境中表现良好，但在实际应用中，进行基准测试是至关重要的。

> “你必须总是根据自己的工作负载进行基准测试，而不是盲目接受互联网上的建议。”

此外，文章底部还提供了一个可视化的负载均衡模拟工具，供读者调整参数并观察不同算法的表现。

---

[前往标准阅读页](https://utgd.net/article/20840?audience=web)
