nginx负载均衡的5种策略

2021-06-16 10:47:38 浏览数 (1)

轮询

默认方式

weight

权重方式

ip_hash

依据IP分配方式

least_conn

最少连接数

fail(第三方)

响应时间

url_hash(第三方)

依据URL分配方式

1、轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 参数:

fail_timeout

与max_fails结合使用.

max_fails

设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了

fail_time

服务器会被认为停机的时间长度,默认为10s。

backup

标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。

down

标记服务器永久停机了。

注意:

  • 在轮询中,如果服务器down掉了,会自动剔除该服务器。
  • 缺省配置就是轮询策略。
  • 此策略适合服务器配置相当,无状态且短平快的服务使用。
代码语言:javascript复制
upstream backserver {
server 172.16.1.7;
server 172.16.1.8 backup;
server 172.16.1.9 max_fails=3 fail_timeout=20s;
}
 server {
         listen 80;
         location / {
         proxy_pass http://backserver ;
        }
     }

2、指定权重 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

代码语言:javascript复制
upstream backserver {
server 172.16.1.7 weight=10;
server 172.16.1.8 weight=6;
server 172.16.1.9;
}
server {
         listen 80;
         location / {
         proxy_pass http://backserver ;
        }
     }

3、IP绑定 ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

代码语言:javascript复制
upstream backserver {
ip_hash;
server 172.16.1.7:88;
server 172.16.1.8:80;
server 172.16.1.9;
}
server {
         listen 80;
         location / {
         proxy_pass http://backserver ;
        }
     }

4、fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。

代码语言:javascript复制
upstream backserver {
server 172.16.1.7;
server 172.16.1.8;
server 172.16.1.9;
fair;
}
server {
         listen 80;
         location / {
         proxy_pass http://backserver ;
        }
     }

5、url_hash(第三方) 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

代码语言:javascript复制
upstream backserver {
hash $request_uri consistent;
server 172.16.1.7;
server 172.16.1.8;
server 172.16.1.9;

}
server {
         listen 80;
         location / {
         proxy_pass http://backserver ;
        }
     }
session共享问题

  在最简单的一主一备、负载均衡的集群下,比如两台tomcat服务器和一台nginx负载均衡服务器。当用户访问时,nginx分配给tomcat1服务器处理登陆业务,用户登陆成功,在tomcat1记录了其登陆信息,当页面刷新时,nginx将用户请求分配给tomcat2服务器,在tomcat2服务器上没有用户登陆session,这样就需要用户再次登陆,如果足够巧合,刚好再次登陆的请求转到tomcat1服务器,显示用户登陆,再次刷新刚好又分配给tomcat2服务器,又没有登陆,甚至形成既登陆又没有登陆的矛盾局面。这就造成了不好的体验。   一般的解决办法是,tomcat服务器之间开启session共享广播,当tomcat1服务器记录了session数据后,就广播给其他tomcat服务器。但是,tomcat的session共享的节点数是有上限的。当集群中配置的tomcat节点机到达一定数量后(一般是5个),节点内部通信的流量可能被session广播占满,导致无法顺畅的处理其他业务,特别是难以适应高并发的场景。   避免session广播形成节点上限的解决办法是,配置单点登录的session服务器,适应redis缓存模拟session保存登陆信息。 解决nginx负载均衡的session共享问题

0 人点赞