nginx负载均衡介绍

nginx负载均衡介绍

文章包含以下几个部分:

  1. 负载均衡介绍
  2. nginx负载均衡策略
  3. nginx负载均衡其他状态参数

下面具体介绍:

1 负载均衡介绍

负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强。

9vI3Sf.png

当nginx作为反向代理,分发到多台服务器时,就涉及到如何合理的分发到各个服务器上的问题。上图就是一个简单的负载均衡示意图,Internet的访问www.mydomain.com的请求会按照一定的策略分配给三台Web服务器上。下面一节介绍nginx常用的均衡策略。

2 nginx负载均衡策略

nginx的负载均衡策略可以划分为两大类:内置策略和扩展策略。

内置策略包含轮询、加权轮询和ip hash,在默认情况下会编译进nginx内核,只需在nginx配置中指明参数即可。

下面结合nginx.conf配置讲解一下这几种策略

2.1 轮询(默认)

即在不指定其他策略的情况下启用这种默认策略,nginx.conf配置实例:

    upstream  www.mydomain.com {
         server 192.168.2.3 ; #server1
         server 192.168.2.4 ; #server2
         server 192.168.2.5 ; #server3
        }

在此种情况下,若来了连续几个请求,会依次分配给server1/2/3,如连续6个访问请求,1、4请求会分配给server1;2、5请求分配给server2;3、6请求分配给server3。

因为配置较为简单清晰,效果也较好,一般经常采用。

2.2 加权轮询

即指定每台服务器被访问的weight权重,nginx.conf配置实例:

    upstream  www.mydomain.com {
         server 192.168.2.3  weight=1; #server1
         server 192.168.2.4  weight=2; #server2
         server 192.168.2.5  weight=3; #server3
        }

在此种配置的情况下,若连续来了6个请求,会分配1个请求给server1,分配2个请求给server2,分配3个请求给server3。

nginx采用的是先深度搜索算法,即将首先将请求都分给高权重的机器,直到该机器的权值降到了比其他机器低,才开始将请求分给下一个高权重的机器;第二,当所有后端机器都down掉时,nginx会立即将所有机器的标志位清成初始状态,以避免造成所有的机器都处在timeout的状态,从而导致整个前端被夯住。

此种分配策略,一般使用在服务器性能差别较大,使用默认轮询时会造成服务器使用情况严重不均衡。当服务器性能基本一致时,大部分不会使用这种策略。

2.3 ip hash

前述的两种负载均衡方案中,同一客户端连续的Web请求可能会被分发到不同的后端服务器进行处理,因此如果涉及到会话Session,那么会话会比较复杂。常见的是基于数据库的会话持久化。要克服上面的难题,可以使用基于IP地址哈希的负载均衡方案。这样的话,同一客户端连续的Web请求都会被分发到同一服务器进行处理。

upstream  www.mydomain.com {
         server 192.168.2.3 ; #server1
         server 192.168.2.4 ; #server2
         server 192.168.2.5 ; #server3
         ip_hash ;
        }

优点:能较好地把同一个客户端的多次请求分配到同一台服务器处理,避免了加权轮询无法适用会话保持的需求。

缺点:当某个时刻来自某个IP地址的请求特别多,那么将导致某台后端服务器的压力可能非常大,而其他后端服务器却空闲的不均衡情况。

延伸阅读:从源码的角度深入分析内置负载均衡策略,见参考资料2。

除了以上几种内置策略外,nginx还有许多第三方的负载均衡策略(外置策略),外置策略并没有编译进nginx源码中,如果需要使用,需要下载源码进行编译。以下简要介绍几种外置策略。

2.4 fair

fair是根据后端服务器的响应时间判断负载情况,从中选出负载最轻的机器进行分流。这种策略具有很强的自适应性,但是实际的网络环境往往不是那么简单,因此要慎用。

upstream  www.mydomain.com {
         server 192.168.2.3 ; #server1
         server 192.168.2.4 ; #server2
         server 192.168.2.5 ; #server3
         fair ;
        }

2.5 url_hash

按请求url的hash结果来分配请求,使每个url定向到同一个后端服务器,服务器做缓存时比较有效。

upstream  www.mydomain.com {
         server 192.168.2.3 ; #server1
         server 192.168.2.4 ; #server2
         server 192.168.2.5 ; #server3
         hash $request_uri;
        }

3 nginx负载均衡状态参数

Down:表示当前的server暂时不参与负载均衡。

Backup:预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。

max_fails:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。

fail_timeout:在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。

配置实例:

    upstream  www.mydomain.com {
         server 192.168.2.3 ; 
         #server1

         server 192.168.2.4  down; 
         #server2暂时不参与负载均衡,可用于预留扩展服务器
         
         server 192.168.2.5  backup; 
         #server3为后备服务器,当其他节点均不可用时,会请求server3

         server 192.168.2.6  max_fails=2  fail_timeout=2; 
         #server4允许请求失败2次,失败2次失败后,暂停2s服务
        }

参考资料

  1. 百度百科:nginx ,https://baike.baidu.com/item/nginx/3817705?fr=aladdin
  2. 解析nginx负载均衡 ,http://blog.jobbole.com/24574/
  3. 负载均衡—-实现配置篇(nginx),http://www.cnblogs.com/oshine/p/3953259.html
  4. nginx代理功能与负载均衡详解,http://www.cnblogs.com/knowledgesea/p/5199046.html

如有疑问,欢迎交流

Table of Contents