【常用配置】负载均衡

2021/10/08 14:15:51

以往一个域名对应一个服务器,在流量很大时对服务器造成很大的负担,会导致响应缓慢甚至出现响应错误,负载均衡就是将流量分散到多个服务器上,减轻对单一服务器的压力。

nginx 使用负载均衡

将 HTTP 流量代理到一组服务器。

  1. 在 http 上下文中用 upstream 定义一组服务器
  2. 在 server 上下文中用 proxy_pass 将请求代理到这组服务器上
http {

    upstream backend {
        server 192.168.8.74:8000;
        server 192.168.8.74:8003;
    }

    server {
        listen       8888;
        server_name  localhost;
        location / {
          proxy_pass http://backend;
        }
    }
}

负载均衡方法

NGINX 开源支持四种负载均衡方法,NGINX Plus 增加了两种方法。

循环(默认)

请求在服务器之间均匀分布,并考虑服务器权重。

最少连接

请求被发送到活动连接数最少的服务器,并考虑服务器权重。

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

IP Hash

请求发送到的服务器由客户端 IP 地址确定。

在这种情况下,要么使用 IPv4 地址的前三个八位字节,要么使用整个 IPv6 地址来计算哈希值。

该方法保证来自同一地址的请求到达同一服务器,除非它不可用。

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

如果其中一台服务器需要暂时从负载平衡轮换中移除,则可以使用 down 参数对其进行标记,以保留客户端 IP 地址的当前散列。由该服务器处理的请求会自动发送到组中的下一个服务器:

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

通用 Hash

请求发送到的服务器由用户定义的键确定,该键可以是文本字符串、变量或组合。例如,密钥可以是成对的源 IP 地址和端口,或 URI,如本例所示:

upstream backend {
    hash $request_uri consistent;
    server backend1.example.com;
    server backend2.example.com;
}

该指令的可选 consistent 参数 hash 启用 ketama 一致性哈希负载平衡。

请求根据用户定义的散列键值均匀分布在所有上游服务器上。

如果将上游服务器添加到上游组或从上游组中删除,则仅重新映射少数键,从而在负载平衡缓存服务器或其他累积状态的应用程序的情况下最大限度地减少缓存未命中。

最少时间 - PLUS

对于每个请求,NGINX PLUS 选择具有最低平均延迟和最低数量的活动连接。

upstream backend {
    least_time header;
    server backend1.example.com;
    server backend2.example.com;
}

可选参数

  • header – 从服务器接收第一个字节的时间

  • last_byte – 从服务器接收完整响应的时间

  • last_byte inflight – 从服务器接收完整响应的时间,考虑到不完整的请求

随机 - PLUS

每个请求都将传递到随机选择的服务器。

随机负载平衡方法应被用于在多个负载平衡器传递请求到相同组的后端分布式环境。

upstream backend {
    random two least_time=last_byte;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    server backend4.example.com;
}

服务器权重

使用 weight 参数设置服务器权重。

https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/open in new window

参考

HTTP Load Balancingopen in new window