对于 Nginx 来说,请求到达 Nginx,Nginx 作为反向代理服务器,有绝对的决策权,可以按照规则将请求分配给它知道的节点中的一个,通过这种分配,使得所有节点需要处理的请求量处于相对平均的状态,从而实现负载均衡。

Nginx 支持的负载均衡策略很多,比较重点的如下:

  • round robin(轮询)

  • random(随机)

  • weight(权重)

  • fair(按响应时长,三方插件)

  • url_hash(url 的 hash 值)

  • ip_hash(ip 的 hash 值)

  • least_conn(最少连接数)

 

最佳实现

最佳实践,其实就是最常见、最普通的默认配置,当然也是在一定程度上最好用的配置。不知道用什么方式的时候,就可以选择用这一类型。轮询不用多说。这里的随机,其实在大量请求的情况下,按照概率的理论等同于轮询的方式

最基本的配置方法,它是upstream模块默认的负载均衡,每个请求按时间顺序分配到不同的后端服务器上面

  • fail_timeout:与max_fails结合使用
  • max_fails:设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了
  • fail_time:服务器被认为停机的时间长度,默认为10s
  • backup:标记该服务器为备用服务器,当主服务停止时,请求会被发送到这台服务器
  • down:标记服务器不参与负载均衡

在轮询策略的基础上指定轮询的几率,weight的默认值为1,weight的数值与访问比率成正比

  • 权重越高分配到需要处理的请求越多。
  • 此策略可以与least_conn和ip_hash结合使用。
  • 此策略比较适合服务器的硬件配置差别比较大的情况

轮询配置参考

#默认配置就是轮询策略
upstream server_group {
   server test1.example.com;
   server test2.example.com;
}

server {
    listen  80;
    server_name  localhost; # 浏览器访问域名
    location / {
        proxy_pass  http://server_group/;
    }
}

随机配置参考

upstream server_group { 
   random; 
   server test1.example.com; 
   server test2.example.com; 
   server test3.example.com; 
   server test4.example.com;
}

  

性能优先

让业务节点中性能更强的机器得到更多请求,这也是一个比较好的分配策略。

什么是性能更好的机器?这个问题也有很多的维度去考量。

  • 从经验或硬件上分为高权重、低权重的机器。
  • 按照节点请求的响应时长来决定是多分配请求,还是少分配请求。
  • 按照保持的连接数。一般来说保持的连接数越多说明处理的任务越多,也是最繁忙的,可以将请求分配给其他机器处理。

 

权重的配置参考

 

upstream server_group {
    server 192.168.226.147:8080 weight=5;
    #默认为不配置权重为1
    server 192.168.226.148:8080;
}

 

 

 

响应的时长(fair)配置参考:需要在 Nginx 编译时加入 nginx-upstream-fair 模块

upstream server_group{
   fair;
   server test1.example.com; 
   server test2.example.com; 
   server test3.example.com; 
   server test4.example.com;
}

  

最少连接数(least_conn)配置参考

upstream server_group {
    least_conn;
    server test1.example.com;
    server test2.example.com;
}

保持稳定

ip_hash:是将每个请求按照访问ip的hash结果进行分配,这种方式可以保证同一个用户会固定访问一个后端服务器。优点:可以保证session会话,解决服务器之间session不能共享的问题;

url_hash:是根据url的hash结果进行分配请求,每一个url会固定到同一个服务器上,配合缓存使用,可以减少不必要的下载和资源时间的浪费。每次同一个url请求到达同一个服务器上,第一次加载后放入缓存,后面再次请求,

least_conn:直接取缓存资源。如果不采用url_hash,可能会导致请求到达不同的服务器,资源出现重新加载的情况。第三方的负载均衡策略需要安装第三方的插件。

将请求转发给连接数较少的后端服务器。每个后端服务器配置可能不同,处理的请求也有可能不同,对于处理的请求有快有慢,least_conn是根据后端服务器的连接情况,动态的选择连接数量较少的一台服务器来处理当前的请求

ip_hash 配置参考 

upstream server_group {
    ip_hash;
    server 192.168.226.147:8080;
    server 192.168.226.148:8080;
}

 

 

url_hash 配置参考(第三方)

upstream server_group{
    hash $request_uri consistent;
    server test1.example.com;
    server test2.example.com;
    server test3.example.com;
}

least_conn  

upstream server_group {
  least_conn;
  server 192.168.0.100:8080;
  server 192.168.0.101:8080;

  }

  

 

 

 posted on 2023-09-06 11:23  boye169  阅读(36)  评论(0编辑  收藏  举报