Nginx的六种负载均衡算法

Nginx的六种负载均衡算法

Scroll Down

66923129_p0_ma1ster1200.jpg

负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

负载均衡的功能:

  • 转发
  • 故障移除
  • 恢复添加
  • 高可用 HA

目前,要实现负载均衡的办法很多,主要有以下两种:

  1. 一种是通过硬件来进行解决,常见的硬件有NetScaler、F5、Radware和Array等商用的负载均衡器,但是它们是比较昂贵的
  2. 一种是通过软件来进行解决的,常见的软件有LVS、Nginx、apache等,它们是基于Linux系统并且开源的负载均衡策略.

今天,我们要说的就是使用NGINX实现低成本的高可用性负载均衡。

nginx的负载均衡

R6Blogvisual011024x590.png

如同上图,nginx的作用,用户再上网的时候访问网站,nginx会根据各种条件将请求发送带后台的条件匹配的服务器上,而转发的条件有6种:

  1. 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器;
  2. weight:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的
  3. ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
  4. url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。后台服务器为缓存的时候效率。
  5. fair:这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持 fair的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair模块。
  6. 最少连接负载均衡:least-connected/最少连接。当某些请求需要更长时间来完成时,最少连接可以更公平的控制应用实例上的负载。

6种负载均衡算法

1、默认轮训

默认轮询, 如果你是直接复制上面的upstream的话你使用的就是默认轮询方式,请求会随机派发到你配置的服务器上。

轮训配置

  #设定负载均衡服务器列表
  upstream zabbx.cn {
        
        #后端服务器访问规则
        server 192.168.10.100:8000        #server1
        server 192.168.10.101:8001        #server2
        server 192.168.10.102:8002        #server3
       }

  server {
        listen 80;
        server_name 192.168.10.10;

        location / {
                proxy_pass http://zabbx.cn;
        }
     }

在上面的例子中, 同一个应用有3个实例分别运行在srvver1-srvver3。当没有特别指定负载均衡方法时, 默认为round-robin/轮询。所有请求被代理到服务器集群zabbx.cn, 然后nginx实现HTTP负载均衡来分发请求。

proxy_pass http://zabbx.cn :表示将所有请求转发到zabbx.cn服务器组中配置的某一台服务器上。

upstream模块:配置反向代理服务器组,Nginx会根据配置,将请求分发给组里的某一台服务器。tomcats是服务器组的名称。

upstream模块下的server指令:配置处理请求的服务器IP或域名,端口可选,不配置默认使用80端口。通过上面的配置,Nginx默认将请求依次分配给100,101,102来处理,可以通过修改下面这些参数来改变默认的分配策略:

max_fails

默认为1。某台Server允许请求失败的次数,超过最大次数后,在fail_timeout时间内,新的请求将不会分配给这台机器。如果设置为0,Nginx会将这台Server置为永久无效状态,然后将请求发给定义了proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream指令来处理这次错误的请求。

fail_timeout

默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它

upstream tomcats {
    server 192.168.0.100:8080  weight=2  max_fails=3  
 fail_timeout=15;
    server 192.168.0.101:8080  weight=3;
    server 192.168.0.102:8080  weight=1;
}

192.168.0.100这台机器,如果有3次请求失败,nginx在15秒内,不会将新的请求分配给它。

max_conns

限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制。注意:1.5.9之后的版本才有这个配置

upstream tomcats {
    server 192.168.0.100:8080   max_conns=1000;
}

表示最多给100这台Server分配1000个请求,如果这台Server正在处理1000个请求,nginx将不会分配新的请求给到它。假如有一个请求处理完了,还剩下999个请求在处理,这时nginx也会将新的请求分配给它。

配置完成后

//检查 nginx 配置是否正确

nginx -t  

//重新加载 nginx 配置

service nginx reload 

2、weight

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

upstream backserver {
    server 192.168.10.10  weight=4;
    server 192.168.10.11  weight=6;
}

权重越高,在被访问的概率越大,如上例,分别是40%,60%。

3、ip_hash

上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。 我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream backserver {
    ip_hash;
    server 192.168.10.13:81;
    server 192.168.10.14:82;
}

4、fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream backserver {
    server server1;
    server server2;
    fair;
}

5、url_hash(第三方)

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

upstream backserver {
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
}

在需要使用负载均衡的server中增加

proxy_pass http://backserver/; 
upstream backserver{ 
    ip_hash; 
    server 127.0.0.1:9090   down; (down 表示单前的server暂时不参与负载) 
    server 127.0.0.1:8080   weight=2; (weight 默认为1.weight越大,负载的权重就越大) 
    server 127.0.0.1:6060 ;
    server 127.0.0.1:7070   backup; (其它所有的非backup机器down或者忙的时候,请求backup机器) 
} 

设置后端负载均衡服务器的状态

  • down,表示当前的server暂时不参与负载均衡。
  • backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因 此这台机器的压力最轻。

注意:backup不能和ip_hash同时配置。因为ip_hash只能访问同一台服务器,而backup是在只有所有参与 负载均衡的服务器出现故障时,才会请求备份机。当所有负载均衡的服务器出现故障了,ip_hash的将无法 请求了。

6.最少连接负载均衡

使用最少连接负载均衡时,nginx试图尽量不给已经很忙的应用服务器增加过度的请求, 而是分配新请求到不是那么忙的服务器实例。

nginx中通过在服务器集群配置中使用least_conn指令来激活最少连接负载均衡方法:

upstream zabbx.cn { 
            least_conn;
            server 192.168.101.60:81;
            server 192.168.101.77:80;
        }

原理:根据上添加的服务器判断哪台服务器分的连接最少就把请求给谁。

注意:

  • nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
  • client_body_in_file_only设置为On 可以讲client post过来的数据记录到文件中用来做debug
  • client_body_temp_path设置记录文件的目录 可以设置最多3层目录
  • location对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡

配置实例:

#user  nobody;

worker_processes  4;
events {
# 最大并发数
worker_connections  1024;
}
http{
    # 待选服务器列表
    upstream zabbx.cn{
        
        # ip_hash指令,将同一用户引入同一服务器。
        ip_hash;
        server 192.168.10.1 fail_timeout=60s;
        server 192.168.10.2;
    }

    server{
        # 监听端口
        listen 80;

        # 根目录下
        location / {

        # 选择哪个服务器列表
            proxy_pass http://zabbx.cn;
        }

    }