Nginx 负载均衡策略

简介

在多个应用实例中使用负载均衡是一种常用的技术,他可以优化资源利用率,最大限度的提高吞吐量,减少延迟,增强容错。
在多个web应用服务器中,使用nginx 可以有效的做到HTTP负载均衡和流量分配,提高性能,扩展性和稳定性

负载均衡机制

nginx 支持以下负载均衡机制:
nginx可以根据客户端ip进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除非那个后端服务器宕了才会换一个。

nginx的upstream目前支持的7种方式的分配,分别是:

1. 轮询策略,
2. 权重轮询策略,
3. ip_hash策略,
4. 最少连接负载均衡
5. fair策略,
6. url_hash策略,
7. sticky策略等。

目前我总结的nginx负载策略共两大类,分别是:内置策略和扩展策略。

内置策略有四种
包括:轮询策略、加权轮询策略、 最少连接负载均衡和ip_hash策略。默认情况下内置策略会编译进Nginx的内核,只需要在nginx配置中指明参数即可。
扩展策略有三种
包括:fail 策略,url_hash 策略,sticky 策略。

  • 轮询方式(RR 默认)
    把请求以循环的方式分布在不同应用服务器上,每个请求按照时间顺序逐一分配到不同的后端服务器,如果服务器down 掉,能自动剔除。

    http {
         upstream bakendserver{
            server server1:8080 max_fails=3 fail_timeout=3s ;
            server server2:8080 max_fails=3  fail_timeout=3s ;
        }
        server {
            listen 80;
            location / {
            proxy_pass http://backendserver;
            }
        }
    }
    

    在上面的示例中,有三个相同的应用实例运行在server1~server2中。当没有配置负载均衡时,它默认使用轮询方式。所有的请求都被代理(proxied)在服务器群组 backendserver,nginx使用HTTP负载均衡来分发请求。

    nginx反向代理负载均衡实现包括以下:HTTP,HTTPS,FastCGI,uwsgi,SCGI,和memcached

    配置HTTPS的负载均衡取代HTTP,只需要使用https协议即可。

    当为FastCGI,uwsgi,SCGI和memcached设置负载均衡时,分别使用fastcgi, uwsgi_pass, scgi_pass, memcached_pass指令即可。

  • 加权轮询(weight)
    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 weight值越大,分配到的访问几率越高。

    http {
        upstream bakendserver{
           server server1:8080 max_fails=3 fail_timeout=3s weight=8;
           server server2:8080 max_fails=3  fail_timeout=3s weight=9;
       }
       server {
           listen 80;
           location / {
           proxy_pass http://backendserver;
           }
       }
    }
    
  • 最少连接负载均衡(least_conn)
    当某些请求需要很长时间才能完成请求时,这种情况用最少连接方式来控制应用实例更公平一些。
    使用最少连接方式,nginx不会过度的去请求一个比较繁忙的服务器,而且把新请求分发到一些不忙的服务器上。

    在服务器群组配置中使用least_conn指令,最少连接负载均衡就会启用:

    http {
         upstream bakendserver {
            least_conn;
            server server1:8080 max_fails=3 fail_timeout=3s ;
            server server2:8080 max_fails=3  fail_timeout=3s ;
        }
        server {
            listen 80;
            location / {
            proxy_pass http://backendserver;
            }
        }
    }
    
  • ip_hash(保留Session)
    请注意轮询和最少连接的负载均衡方案,它们客户端后续的请求可能被分发到不同的服务器上,这样就不能保证同一个客户端一直被指向到同一台服务器上。

    如果有这样一个需求,就是想把一个客户端绑定到特定的服务器上–换句话说,就是使客户端的Session有粘性和持久化始终选择特定的机器,这种情况可以使用ip_hash负载均衡方式来处理。

    使用ip_hash的情况下,客户端的IP地址会被当做一个哈希表的key来决定这个客户端的请求是由服务器群组里的哪一台服务器去处理。这种方式保证了同一个客户端,它的请求总会被指向到同一台服务器上,除非这台服务器不可用。

    配置ip-hash负载均衡,只需要在服务(upstream)群组中添加ip_hash指令即可:

       http {
            upstream bakendserver {
               ip_hash;
               server server1:8080 max_fails=3 fail_timeout=3s weight=3;
               server server2:8080 max_fails=3 fail_timeout=3s weight=4;
           }
           server {
               listen 80;
               location / {
               proxy_pass http://backendserver;
               }
           }
       }
    

    注意:ip_hash模块和后面的Sticky模块不能够同时使用。

  • Fail (第三方插件)
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。
    该策略请求转发到负载最小的后端服务器节点上。Nginx通过后端服务器节点对响应时间来判断负载情况,响应时间最短的节点负载就相对较轻,Nginx就会将前端请求转发到此后端服务器节点上。

    http {
         upstream bakendserver {
            server server1:8080 max_fails=3 fail_timeout=3s weight=3;
            server server2:8080 max_fails=3 fail_timeout=3s weight=4;
            fair;
        }
        server {
            listen 80;
            location / {
            proxy_pass http://backendserver;
            }
        }
    }
    

    注意:这种策略具有很强的自适应性,但是实际的网络环境往往不是那么简单,因此需要慎用。

  • url_hash(第三方插件)
    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
    在upstream中加入hash语句,hash_method是使用的hash算法。

    http {
         upstream bakendserver {
             hash $request_uri;//非域名后面的资源部分
             hash_method crc32;
            server server1:8080 max_fails=3 fail_timeout=3s weight=3;
            server server2:8080 max_fails=3 fail_timeout=3s weight=3;
        }
        server {
            listen 80;
            location / {
            proxy_pass http://backendserver;
            }
        }
    }
    
  • Sticky策略
    该策略在多台服务器的环境下,为了确保一个客户端只和一台服务器通讯,它会保持长连接,并在结束会话后再次选择一个服务器,保证了压力均衡。

       http {
            upstream bakendserver {
              sticky;
               server server1:8080 max_fails=3 fail_timeout=3s weight=3;
               server server2:8080 max_fails=3 fail_timeout=3s weight=3;
           }
           server {
               listen 80;
               location / {
               proxy_pass http://backendserver;
               }
           }
       }
    

    注意:如果浏览器不支持cookie,那么sticky不生效,毕竟整个模块是给予cookie实现。Sticky模块和ip_hash模块不能够同时使用。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值