什么是负载均衡?


nginx负载均衡算法

  1. 轮询 (round-robin)
    轮询为负载均衡中较为基础也较为简单的算法,它不需要配置额外参数。假设配置文件中共有 M 台服务器,该算法遍历服务器节点列表,并按节点次序每轮选择一台服务器处理请求。当所有节点均被调用过一次后,该算法将从第一个节点开始重新一轮遍历。
    特点:由于该算法中每个请求按时间顺序逐一分配到不同的服务器处理,因此适用于服务器性能相近的集群情况,其中每个服务器承载相同的负载。但对于服务器性能不同的集群而言,该算法容易引发资源分配不合理等问题。
    2.权重
    为了避免普通轮询带来的弊端,加权轮询应运而生。在加权轮询中,每个服务器会有各自的 weight。一般情况下,weight 的值越大意味着该服务器的性能越好,可以承载更多的请求。该算法中,客户端的请求按权值比例分配,当一个请求到达时,优先为其分配权值最大的服务器。
    特点:加权轮询可以应用于服务器性能不等的集群中,使资源分配更加合理化。
  2. IP 哈希(IP hash)
    ip_hash 依据发出请求的客户端 IP 的 hash 值来分配服务器,该算法可以保证同 IP 发出的请求映射到同一服务器,或者具有相同 hash 值的不同 IP 映射到同一服务器。
    特点:该算法在一定程度上解决了集群部署环境下 Session 不共享的问题。

Session 不共享问题是说,假设用户已经登录过,此时发出的请求被分配到了 A 服务器,但 A 服务器突然宕机,用户的请求则会被转发到 B 服务器。但由于 Session 不共享,B 无法直接读取用户的登录信息来继续执行其他操作。

实际应用中,我们可以利用 ip_hash,将一部分 IP 下的请求转发到运行新版本服务的服务器,另一部分转发到旧版本服务器上,实现灰度发布。再者,如遇到文件过大导致请求超时的情况,也可以利用 ip_hash 进行文件的分片上传,它可以保证同客户端发出的文件切片转发到同一服务器,利于其接收切片以及后续的文件合并操作。

4.最少连接数(Least Connections):
Nginx会将请求发送到当前连接数最少的后端服务器,以确保负载均衡。这种方式适用于后端服务器的连接数不均衡的情况,可以更有效地分配请求。
假设共有 M 台服务器,当有新的请求出现时,遍历服务器节点列表并选取其中连接数最小的一台服务器来响应当前请求。连接数可以理解为当前处理的请求数。

5.自定义算法:
Nginx还支持使用Lua脚本等自定义算法实现负载均衡。开发人员可以编写自己的算法来根据特定的需求进行请求分发。

怎么实现nginx负载均衡?
要实现负载均衡,需要在Nginx的配置文件中定义后端服务器的集群或上游服务器。可以使用upstream指令定义服务器组,并在location指令中使用负载均衡算法来分发请求。例如:

1、轮询(默认)
轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器 down 掉后,能自动剔除。

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
    }
}

上述配置中,upstream指令定义了一个名为backend的服务器组,包含了多台后端服务器。在location指令中,使用proxy_pass指令将请求转发给backend服务器组,Nginx会根据负载均衡算法将请求分发给后端服务器。

2、权重(weight)
轮询的加强版,既可以指定轮询比率,weight 和访问几率成正比,主要应用于后端服务器异质的场景下。

upstream backend {
    server 192.168.182.110:8000 weight=1;
    server 192.168.182.111:8000 weight=2;
}

3、IP散列(ip_hash)
每个请求按照访问 Ip(即Nginx的前置服务器或客户端IP)的 hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决 session 一致问题。

upstream backend {
    ip_hash;
    server 192.168.182.110:8000 weight=1;
    server 192.168.182.111:8000 weight=2;
}

负载均衡生效

暂停 Nginx 并重启
// 暂停 Nginx 服务
sudo nginx -s stop
// 启动 Nginx 服务
nginx -s reload