Nginx的负载均衡与调度算法

1、什么是负载均衡
随着互联网的发展,网站的访问量也越来越大,服务器网站所提供的服务模式也在发生着改变,例如:当一台服务器无法承受巨大的访问流量时,使用多台服务器共同承载访问流量;再比如对客户的访问做资源判断,静态资源请求使用调度器调度到后端静态服务器群进行响应,动态资源请求调度到后端动态资源服务器群进行响应。这样就可以使用户访问量得到有效的负载的效果。而Nginx可以做到对用户访问量的负载均衡效果。

2、调度算法
1)轮询(默认)
  每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2)加权轮询
  指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
3)ip_hash
  每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session   的问题。
3)fair(第三方)
  按后端服务器的响应时间来分配请求,响应时间短的优先分配。
4)url_hash(第三方)
  根据用户所请求的url资源路径分配到后端不同的服务器
5)最少连接数
  根据当前后端服务器所响应的客户端情况,把当前访问请求调度到后端服务器响应相对较   少服务器上。

3、负载均衡展示
反向代理端:192.168.126.135
后端服务器:192.168.126.130   192.168.126.133
配置轮询

1)修改代理服务器的主配置文件

[root@proxy ~]#vim /usr/local/nginx/conf/nginx.conf
http {                   //upstream必须要在http段配置;
    include       mime.types; 
    default_type  application/octet-stream;
    proxy_cache_path /cache/nginx/ levels=1:1 keys_zone=mycache:32m;

    upstream  upstream_server {     //这里是定义了一个名字叫做upstream_server的后端服务器池,并把后端
        server  192.168.126.130; 	   的服务器添加到此池中;
        server 192.168.126.133;

    }



        location / {
           proxy_pass http://upstream_server;
        }

[root@proxy ~]# /usr/local/nginx/sbin/nginx   -s reload 
[root@proxy ~]# 
[root@proxy ~]# ss -tunlp | grep nginx 
tcp    LISTEN     0      128       *:80                    *:*                   users:(("nginx",pid=7260,fd=6),("nginx",pid=7255,fd=6))
[root@proxy ~]# 

2)定义后端服务器的web页面
web1

[root@www ~]#vim /var/www/html/index.html
<h1>Test Page form  web1 </h1>
[root@www ~]# systemctl restart httpd 
[root@www ~]# 

web2

[root@web2 ~]# vim /var/www/html/index.html 
<h1>Test Page from web2</h1>
[root@web2 ~]# service  httpd  restart 
停止 httpd:                                               [失败]
正在启动 httpd:httpd: apr_sockaddr_info_get() failed for web2
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [确定]
[root@web2 ~]# 

3)访问测试(默认为轮询)
在这里插入图片描述

在这里插入图片描述

有时,我们会根据后端服务器性能的高低来负载客户端流量,这时我们就希望性能强的服务器可以尽量多的处理用户请求,性能差一点的服务器处理少一点用户请求;我们就需要用到加权轮询这个调度算法。
加权轮询配置:

1)修改nginx代理服务器的配置文件

[root@proxy conf]# vim nginx.conf
    include       mime.types;
    default_type  application/octet-stream;
    upstream  upstream_server {
        server  192.168.126.130 weight=2;  //修改第一个server的权重为2;
        server 192.168.126.133 weight=1;  //修改第二个server的权重为1;

    }

2)重载配置文件并查看

[root@proxy conf]# /usr/local/nginx/sbin/nginx -s reload
[root@proxy conf]# 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

还有时,我们希望同一个ip地址的客户端请求只发送到后端固定的server服务器,因为可能客户端会有session信息的需要,这时,我们就不得不把同一个ip客户端请求始终调度到同一台server服务器上,此时,便可以使用ip_hash算法。
ip_hash配置:

1)修改nginx负载均衡器的配置文件

http {
    include       mime.types;
    default_type  application/octet-stream;
    upstream  upstream_server {
        ip_hash;    //指明使用ip_hash算法进行调度;
        server  192.168.126.130;
        server 192.168.126.133;

    }

2)重载配置并查看(此时,不管如何刷新,都只会调度到同一台后端服务器上)

[root@proxy conf]# /usr/local/nginx/sbin/nginx -s reload
[root@proxy conf]# 

在这里插入图片描述

还有时,我们会根据服务器当前连接客户端的数量来进行调度,连接较少的服务器端可以把新请求发送给它,这样可以尽量做到结果公平;这就需要用到least_connection最少连接数算法。
least_conn调度算法配置:
1)修改nginx负载均衡器配置文件

http {
    include       mime.types;
    default_type  application/octet-stream;
    upstream  upstream_server {
        least_conn;  //指明使用最少连接数算法;
        server  192.168.126.130;
        server 192.168.126.133;
    }

2)重载配置文件,并查看(用于只有我一个客户端请求,所以对后端server的连接数是相同的,此时和轮询的效果相同)

[root@proxy conf]# /usr/local/nginx/sbin/nginx -s reload
[root@proxy conf]# 

在这里插入图片描述
在这里插入图片描述

其他常用配置项:

   upstream  upstream_server {
        #fair;  //使用响应时长最短调度算法;
        server  192.168.126.130 down;  //down表示当前server不参与负载均衡调度;
        server 192.168.126.133 backup; //backup表示作为备用服务器,当其他服务器出现问题是,才调度到这个server;
    }
      max_fails:代理服务器允许的请求后端服务器的最大失败次数,默认为1,当请求一次失败后,就认为此后端服务器挂掉了,就不会把用户请求调度到此服务器上;
      fail_timeout:请求失败后的超时时长;

猜你喜欢

转载自blog.csdn.net/Micky_Yang/article/details/89156306