nginx负载均衡与调度算法

nginx负载均衡

nginx的负载均衡功能是通过upstream命令实现的,由ngx_http_upstream_module模块支持,它的负载均衡实现机制比较简单,容易理解。相比LVS,nginx负载均衡默认后端服务器具有健康状检测功能,检测方式是基于端口检测,在后端服务器比较少的情况下性能突出,如果后端负载节点比较多,所有的请求都从一台代理服务器进出,容易造成请求阻塞,这种情况可以在nginx代理服务前端增加一层LVS进行分流,nginx代理做多节点来缓解。

nginx负载均衡算法

1:轮询(默认的模式),每个请求按时间顺序逐一分配到不同的服务器,如果后端某台服务器死机,自动剔除故障系统使用户使用不受影响。

2:权重(weight),指定轮询的权值,weigth值越大,分配到访问的概率就越高,只要用于后端服务器性能不均衡的情况下。

3:ip_hash,每个请求按访问ip的哈希结果分配,这样来自同一ip的访客固定访问一台后端服务器。能够有效解决动态网页存在的session共享问题。

4:least_conn 最少连接调度算法,同时考虑服务器的权重,当server拥有不同的权重时其为wlc,当所有后端主机连接数相同时,则使用wrr,适用于长连接

5:hash key [consistent] 基于指定的key的hash表来实现对请求的调度,此处的key可以直接文本、变量或二者组合
作用:将请求分类,同一类请求将发往同一个upstream server,key值可以用$request_uri 或 $remote_addr,
当使用consistent参数时,将启用ketama一致性hash算法,适用于后端是Cache服务器(如varnish)时使用hash $request_uri consistent; 或者 hash $remote_addr consistent;

在http upstream模块中,可以通过server指令指定后端服务器的ip地址和端口,同时还可以设定每台后端服务器在负载均衡中的状态。

upstream中可附加指令

1:down,表示当前的server不参与负载均衡。

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

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

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

5: keepalive 连接数N; 为每个worker进程保留的空闲的长连接数量,可节约nginx端口,并减少连接管理的消耗

配置负载均衡

轮询负载

http段设置

upstream webserver {

                server 192.168.214.133:80 max_fails=3 fail_timeout=30s;
                server 192.168.214.187:80 max_fails=3 fail_timeout=30s;

        }

server 段设置

  location ~ \.(html|jpg|png|jpeg)$ {

                proxy_pass http://webserver;
                proxy_next_upstream http_404;   #请求资源不存在返回404页面(404页面必须加http前缀)
        }

测试

[root@nfs ~]# for i in {1..10};do curl www.a.com/index.html;done
web server 1 page
web server 2 page
web server 1 page
web server 2 page
web server 1 page
web server 2 page
web server 1 page
web server 2 page
web server 1 page
web server 2 page

加权轮询

http段


upstream webserver { server 192.168.214.133:80 weight=3 max_fails=3 fail_timeout=30s; server 192.168.214.187:80 max_fails=3 fail_timeout=30s; }

将192.168.214.133 权重设为3

测试

[root@nfs ~]# for i in {1..10};do curl www.a.com/index.html;done
web server 2 page
web server 1 page
web server 1 page
web server 1 page
web server 2 page
web server 1 page
web server 1 page
web server 1 page
web server 2 page
web server 1 page

ip_hash

upstream webserver {
                ip_hash;
                server 192.168.214.133:80 max_fails=3 fail_timeout=30s;
                server 192.168.214.187:80 max_fails=3 fail_timeout=30s;

        }

测试

[root@nfs ~]# for i in {1..10};do curl www.a.com/index.html;done
web server 2 page
web server 2 page
web server 2 page
web server 2 page
web server 2 page
web server 2 page
web server 2 page
web server 2 page
web server 2 page
web server 2 page

least_conn最少连接

 upstream webserver {
                least_conn;
                server 192.168.214.133:80 weight=3 max_fails=3 fail_timeout=30s;
                server 192.168.214.187:80 max_fails=3 fail_timeout=30s;

        }

测试

[root@nfs ~]# for i in {1..10};do curl www.a.com/index.html;done
web server 1 page
web server 1 page
web server 2 page
web server 1 page
web server 1 page
web server 1 page
web server 2 page
web server 1 page
web server 1 page
web server 1 page

hash key:一致性hash

 upstream webserver {
                hash $request_uri consistent;
                server 192.168.214.133:80 weight=3 max_fails=3 fail_timeout=30s;
                server 192.168.214.187:80 max_fails=3 fail_timeout=30s;

        }
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注