• Nginx的负载均衡与调度算法


    一、什么是负载均衡


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

    二、负载均衡调度算法

    1、轮询(默认调度算法)

    特点:每个请求按时间顺序逐一分配到不同的后端服务器处理。
    适用业务场景:后端服务器硬件性能配置完全一致,业务无特殊要求时使用。

    upstream backendserver { 
    server 192.168.0.14:80 max_fails=2 fail_timeout=10s; 
    server 192.168.0.15:80 max_fails=2 fail_timeout=10s; 
    } 
    

    2、加权轮询

    特点:指定轮询几率,weight值(权重)和访问比例成正比,用户请求按权重比例分配。
    适用业务场景:用于后端服务器硬件性处理能力不平均的情形。

    upstream backendserver { 
    server 192.168.0.14:80 weight=5 max_fails=2 fail_timeout=10s; 
    server 192.168.0.15:80 weight=10 max_fails=2 fail_timeout=10s;
    }
    

      

    3、ip_hash

    特点:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session会话保持问题。
    适用业务场景:适用于需要账号登录的系统,会话连接保持的业务。

    upstream backendserver { 
    ip_hash; 
    server 192.168.0.14:80 max_fails=2 fail_timeout=10s; 
    server 192.168.0.15:80 max_fails=2 fail_timeout=10s; 
    } 
    

      

    4、最少连接数 least_conn

    特点:按nginx反向代理与后端服务器之间的连接数,连接数最少的优先分配。

    适用业务场景:适用于客户端与后端服务器需要保持长连接的业务。

    upstream backendserver { 
    least_conn;
    server 192.168.0.14:80 max_fails=2 fail_timeout=10s; 
    server 192.168.0.15:80 max_fails=2 fail_timeout=10s; 
    } 
    

      

    5、fair(需编译安装第三方模块 ngx_http_upstream_fair_module)

    特点:按后端服务器的响应时间来分配请求,响应时间短的优先分配。
    适用业务场景:对访问响应速度有一定要求的业务。

    upstream backendserver {
    fair; 
    server 192.168.0.14:80 max_fails=2 fail_timeout=10s; 
    server 192.168.0.15:80 max_fails=2 fail_timeout=10s; 
    }
    

      

    6、url_hash(需编译安装第三方模块 ngx_http_upstream_hash_module)

    特点:按访问url的hash结果来分配请求,使同一个url访问到同一个后端服务器。
    适用业务场景:适用于后端服务器为缓存服务器时比较有效。

    upstream backendserver { 
    server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
    server 192.168.0.15:80 max_fails=2 fail_timeout=10s; 
    hash $request_uri; 
    }
    

      

    三、负载均衡展示


    反向代理端:192.168.126.135
    后端服务器:192.168.126.130   192.168.126.133
    配置轮询

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

     1 [root@proxy ~]#vim /usr/local/nginx/conf/nginx.conf
     2 http {                   //upstream必须要在http段配置;
     3     include       mime.types; 
     4     default_type  application/octet-stream;
     5     proxy_cache_path /cache/nginx/ levels=1:1 keys_zone=mycache:32m;
     6 
     7     upstream  upstream_server {     //这里是定义了一个名字叫做upstream_server的后端服务器池,并把后端
     8         server  192.168.126.130;        的服务器添加到此池中;
     9         server 192.168.126.133;
    10 
    11     }
    12 
    13 
    14 
    15         location / {
    16            proxy_pass http://upstream_server;
    17         }
    18 
    19 [root@proxy ~]# /usr/local/nginx/sbin/nginx   -s reload 
    20 [root@proxy ~]# 
    21 [root@proxy ~]# ss -tunlp | grep nginx 
    22 tcp    LISTEN     0      128       *:80                    *:*                   users:(("nginx",pid=7260,fd=6),("nginx",pid=7255,fd=6))
    23 [root@proxy ~]# 

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

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

    web2

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

    3)访问测试(默认为轮询)

     

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

    加权轮询配置:
    1)修改nginx代理服务器的配置文件

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

    2)重载配置文件并查看

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

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

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

    1 http {
    2     include       mime.types;
    3     default_type  application/octet-stream;
    4     upstream  upstream_server {
    5         ip_hash;    //指明使用ip_hash算法进行调度;
    6         server  192.168.126.130;
    7         server 192.168.126.133;
    8 
    9     }

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

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

    2 [root@proxy conf]# 

     

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

    1 http {
    2     include       mime.types;
    3     default_type  application/octet-stream;
    4     upstream  upstream_server {
    5         least_conn;  //指明使用最少连接数算法;
    6         server  192.168.126.130;
    7         server 192.168.126.133;
    8     }

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

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

    2 [root@proxy conf]#  

    其他常用配置项:

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

     原文:https://blog.csdn.net/Micky_Yang/article/details/89156306

  • 相关阅读:
    java基础>包、访问权限、命名规范 小强斋
    java基础>Static 和 Final 关键字 小强斋
    java基础>对象的创建过程(初始化、析构、清理) 小强斋
    iPhone 上少用三元操作符 ? :
    QQ群人满了
    面向对象C语言(ObjectiveC)编程简介
    java Integer.ValueOf(int)和new Integer(int)性能比较
    关于在iPhone上合并2个应用程序(App)成一个
    java Preferences持久化使用示例
    Memcache VS MySQL Query Cache.
  • 原文地址:https://www.cnblogs.com/sucretan2010/p/12528608.html
Copyright © 2020-2023  润新知