# 负载均衡原理、种类和算法

* [负载均衡原理](#负载均衡原理)
* [负载均衡类型](#负载均衡类型)
* [负载均衡算法](#负载均衡算法)

## 负载均衡原理

随机、轮训、加权 源地址hash法、最小连接数、最快响应速度等

负载均衡(Load Balance，简称LB)是一种服务器或网络设备的集群技术。 负载均衡将特定的业务(网络服务、网络流量等)分担给多个服务器或网络设备，从而提高了业务处理能力，保证了业务的高可用性。 负载均衡基本概念有：实服务、实服务组、虚服务、调度算法、持续性等，其常用应用场景主要是服务器负载均衡，链路负载均衡。 负载均衡器主要分为硬件负载均衡和软件负载均衡两大类。

应用集群：将同一应用部署到多台机器上，组成处理集群，接收负载均衡设备分发的请求，进行处理，并返回相应数据。

负载均衡设备：将用户访问的请求，根据负载均衡算法，分发到集群中的一台处理服务器。（一种把网络请求分散到一个服务器集群中的可用服务器上去的设备）

负载均衡的作用（解决的问题）： 1.解决并发压力，提高应用处理性能（增加吞吐量，加强网络处理能力）； 2.提供故障转移，实现高可用； 3.通过添加或减少服务器数量，提供网站伸缩性（扩展性）； 4.安全防护；（负载均衡设备上做一些过滤，黑白名单等处理）

## 负载均衡类型

根据实现技术不同，可分为DNS负载均衡，HTTP负载均衡，IP负载均衡，链路层负载均衡等。

DNS负载均衡 HTTP负载均衡（Nginx,Haproxy） IP负载均衡：在网络层通过修改请求目标地址进行负载均衡。 链路层负载均衡：通信协议的数据链路层修改mac地址，进行负载均衡。 混合型负载均衡：

根据OSI模型可将负载均衡分为： 1）二层负载均衡（一般是用虚拟mac地址方式，外部对虚拟MAC地址请求，负载均衡接收后分配后端实际的MAC地址响应）； 2）三层负载均衡（一般采用虚拟IP地址方式，外部对虚拟的ip地址请求，负载均衡接收后分配后端实际的IP地址响应）； 3）四层负载均衡（在三次负载均衡的基础上，用 ip+port 接收请求，再转发到对应的机器）； 4）七层负载均衡（根据虚拟的url或是IP，主机名接收请求，再转向相应的处理服务器）。 这其中，最常见的是四层和七层负载均衡

## 负载均衡算法

常用的负载均衡算法分为两类： 1）一种是静态负载均衡； 轮询法： 随机法： 源地址哈希法： 加权轮询法： 加权随机法： 键值范围法： 2）一种是动态负载均衡。 最小连接数法： 最快响应速度法： 观察模式法：

负载均衡算法： 常用的负载均衡算法有，轮询，随机，最少链接，源地址散列，加权等方式；

1. 轮询（Round Robin，RR）：加权轮询（Weighted Round Robin，WRR） 将所有请求，依次分发到每台服务器上，适合服务器硬件同相同的场景。 优点：服务器请求数目相同； 缺点：服务器压力不一样，不适合服务器配置不同的情况；
2. 随机（Random） 请求随机分配到各个服务器。 优点：使用简单； 缺点：不适合机器配置不同的场景；
3. 最少连接（Least Connections）：加权最少链接（Weighted Least Connections）简称WLC 将请求分配到连接数最少的服务器（目前处理请求最少的服务器）。 优点：根据服务器当前的请求处理情况，动态分配； 缺点：算法实现相对复杂，需要监控服务器请求连接数；
4. Hash源地址散列（Source hashing） 根据IP地址进行Hash计算，得到IP地址。 优点：4将来自同一IP地址的请求，同一会话期内，转发到相同的服务器；实现会话粘滞。 缺点：目标服务器宕机后，会话会丢失；
5. 加权 在轮询，随机，最少链接，Hash’等算法的基础上，通过加权的方式，进行负载服务器分配。 优点：根据权重，调节转发服务器的请求数目； 缺点：使用相对复杂；

参考 <https://blog.csdn.net/Kim\\_Weir/article/details/80550133> <https://www.jianshu.com/p/215b5575107c> <https://www.jianshu.com/p/7bb52818b8a9> <https://blog.51cto.com/7346473/1597135> <https://segmentfault.com/a/1190000019026606> <https://blog.csdn.net/a724888/article/details/80775778>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://youngzil.gitbook.io/notes/shu-ju-jie-gou-yu-suan-fa/suan-fa/fu-zai-jun-heng-yuan-li-zhong-lei-he-suan-fa.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
