> For the complete documentation index, see [llms.txt](https://cnwangzhou.gitbook.io/grokking-system-design/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cnwangzhou.gitbook.io/grokking-system-design/ch18.md).

# 18. 负载均衡

负载均衡器是任何分布式系统中的另一个关键部分。负载均衡器协助将流量分散到不同服务器中，以提升应用、网站或数据库的响应速度和可用性。负载均衡器也会在分布请求的同时跟踪所有资源的状态。如果一台服务器无法接收新请求、没有相应或者错误率显著提升，负载均衡器将停止向这样的服务器发送流量。

负载均衡器通常位于客户端和接收输入网络与应用流量的服务器之间，使用不同的算法将流量分不到多台后端服务器中。通过平衡多台服务器之间的应用请求，负载均衡器减少单台服务器的负载，避免任何一台应用服务器成为单点故障，从而提升应用的总体可用性和响应速度。

![](https://3100185414-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FgozhSDAYrrQ6G5G7iYxs%2Fuploads%2Fgit-blob-aa4232e5bfdae3b25875ba5f7ba0c1bab35abb7f%2Fch18_1.png?alt=media)

为了充分利用可扩展性和冗余性，我们可以尝试在系统的每一层平衡负载。我们可以在三个位置添加负载均衡器：

* 在用户和网络服务器之间；
* 在网络服务器和内部平台层之间，例如应用服务器或缓存服务器；
* 在内部平台层和数据库之间。

![](https://3100185414-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FgozhSDAYrrQ6G5G7iYxs%2Fuploads%2Fgit-blob-a8470f47efbcba2953b3167d22ece20ed91ae6bb%2Fch18_2.png?alt=media)

## 1. 负载均衡的优点

* 用户可以体验更快和没有中断的服务。用户不需要等待单台性能低下的服务器完成之前的任务。相反，用户的请求立即被传送到一个更可用的资源。
* 服务提供者经历的停机时间更少，吞吐量更高。甚至一整台服务器的宕机不会影响终端用户体验，因为负载均衡器会将服务转移到一台健康的服务器。
* 负载均衡器使得系统管理员可以更容易地处理输入请求，同时减少用户的等待时间。
* 智能的负载均衡器提供了预测分析等优点，可以在流量瓶颈发生之前检测到。因此，智能的负载均衡器提供了可用于组织系统的观察。这些是自动化的关键，可以帮助驱动业务决策。
* 系统管理员将经历更少的失败或高负载的部件。不同于单台设备执行大量工作，负载均衡可以安排多台设备分别执行少量工作。

## 2. 负载均衡算法

**负载均衡器如何选择后端服务器**？负载均衡器在向后端服务器发送请求之前考虑两个因素。首先确保选择的服务器在正确地回应，然后使用一个预设的算法从健康的服务器几何中选择一台服务器。我们将讨论这些算法。

**健康检测**——负载均衡器应该只向「健康」的后端服务器发送流量。为了监测后端服务器的健康程度，「健康检测」有规律地试图连接后端服务器，确保服务器在监听。如果一台服务器在健康检测中失败，这台服务器将自动被移出服务器池，不会有流量发送给这台服务器，知道这台服务器再次回应健康检测。

有多种负载均衡方法，根据不同的需要使用不同的算法。

* **最少连接方法**——这个方法将流量定向到活跃连接数最少的服务器。当服务器之间有大量不均衡分布的持久客户端连接时，这个方法非常有用。
* **最短响应时间方法**——这个算法将流量定向到活跃连接数最少且平均响应时间最短的服务器。
* **最少带宽方法**——这个方法选择当前处理流量（使用的单位是兆比特/秒，Mbps）最少的服务器。
* **轮询调度方法**——这个方法在服务器列表中循环，将每个新请求发送给下一台服务器。当到达列表末尾时，从列表起始位置继续循环。当服务器的规格相等且没有很多持久连接时，该方法最适用。
* **加权轮询调度方法**——加权轮询调度方法可以用于更好地处理服务器有不同的处理容量的情况。每台服务器被赋予一个权重（一个表示处理容量的整数）。高权重的服务器在低权重的服务器之前接收新连接，高权重的服务器比低权重的服务器接收更多的连接。
* **IP 哈希**——使用该方法，计算客户端的 IP 地址的哈希值，用于将请求重定向到服务器。

## 3. 冗余负载均衡器

负载均衡器可能成为单点故障。为了解决这个问题，可以将第二台负载均衡器和第一台负载均衡器连接，组成一个集群。每台负载均衡器检测另一台负载均衡器的状态，由于两台负载均衡器具备相等的能力可以处理流量和失败检测，当主负载均衡器宕机时，第二台负载均衡器可以接手。

![](https://3100185414-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FgozhSDAYrrQ6G5G7iYxs%2Fuploads%2Fgit-blob-4bb4f917edb6c705363b870272e520f8c2afd25c%2Fch18_3.png?alt=media)

以下链接有一些关于负载均衡器的高质量讨论：

\[1] [What is load balancing](https://avinetworks.com/what-is-load-balancing/) \[2] [Introduction to architecting systems](https://lethain.com/introduction-to-architecting-systems-for-scale/) \[3] [Load balancing](https://en.wikipedia.org/wiki/Load_balancing_\(computing\))
