• Nginx实现负载均衡的几种方式


    前言

    什么是负载均衡

    负载均衡的记几种常用方式

    前言

    要理解负载均衡,必须先搞清楚正向代理和反向代理。

    • 正向代理,代理的是用户。
    • 反向代理,代理的是服务器

    正向代理:类似一个跳板机,代理访问外部资源。比如我们国内访问谷歌,直接访问访问不到,我们可以通过一个正向代理服务器,请求发到代理服,代理服务器能够访问谷歌,这样由代理去谷歌取到返回数据,再返回给我们,这样我们就能访问谷歌了

    用途:

      (1)访问原来无法访问的资源,如google

          (2) 可以做缓存,加速访问资源

      (3)对客户端访问授权,上网进行认证

      (4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息

     反向代理(Reverse Proxy):实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器

     

    作用:

    (1)保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网

    (2)负载均衡,通过反向代理服务器来优化网站的负载

    小结

    正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端.


    反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端

    看图理解一:

    看图理解二:

    正向代理中,proxy和client同属一个LAN,对server透明;
    反向代理中,proxy和server同属一个LAN,对client透明。
    实际上proxy在两种代理中做的事都是代为收发请求和响应,不过从结构上来看正好左右互换了下,所以把后出现的那种代理方式叫成了反向代理

    正向代理: 买票的黄牛

    反向代理: 租房的代理

    什么是负载均衡

    当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。

    我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。

    负载均衡是用反向代理的原理实现的。

    在服务器集群中,Nginx起到一个代理服务器的角色(即反向代理),为了避免单独一个服务器压力过大,将来自用户的请求转发给不同的服务器。

    负载均衡用于从“upstream”模块定义的后端服务器列表中选取一台服务器接受用户的请求。一个最基本的upstream模块是这样的,模块内的server是服务器列表:

      #动态服务器组
        upstream dynamic_zuoyu {
            server localhost:8080;  #tomcat 7.0
            server localhost:8081;  #tomcat 8.0
            server localhost:8082;  #tomcat 8.5
            server localhost:8083;  #tomcat 9.0
        }
    

    在upstream模块配置完成后,要让指定的访问反向代理到服务器列表:

    #其他页面反向代理到tomcat容器
            location ~ .*$ {
                index index.jsp index.html;
                proxy_pass http://dynamic_zuoyu;
            }
    

    这就是最基本的负载均衡实例,但这不足以满足实际需求;目前Nginx服务器的upstream模块支持6种方式的分配:

    负载均衡策略
    轮询 默认方式
    weight 权重方式
    ip_hash 依据ip分配方式
    least_conn 最少连接方式
    fair(第三方) 响应时间方式
    url_hash(第三方) 依据URL分配方式

    负载均衡的几种常用方式

    1、轮询(默认)

    最基本的配置方法,上面的例子就是轮询的方式,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。

    有如下参数:

    fail_timeout 与max_fails结合使用。
    max_fails
    设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了,
    fail_time 服务器会被认为停机的时间长度,默认为10s。
    backup 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。
    down 标记服务器永久停机了。

    注意:

    • 在轮询中,如果服务器down掉了,会自动剔除该服务器。
    • 缺省配置就是轮询策略。
    • 此策略适合服务器配置相当,无状态且短平快的服务使用。

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

    # 动态服务器组
    upstream dynamic_zuoyu {
        server localhost:8080   weight=2;  #tomcat 7.0
        server localhost:8081;  #tomcat 8.0
        server localhost:8082   backup;  #tomcat 8.5
        server localhost:8083   max_fails=3 fail_timeout=20s;  #tomcat 9.0
    } 
    # 示例二
    upstream backserver {
        server 192.168.0.14 weight=3;
        server 192.168.0.15 weight=7;
    }  
    # 权重越高,在被访问的概率越大,如上例,分别是30%,70%。

    在动态服务器组的例子中:weight参数用于指定轮询几率,weight的默认值为1,;weight的数值与访问比率成正比,比如Tomcat 7.0被访问的几率为其他服务器的两倍。

    注意:

    • 权重越高分配到需要处理的请求越多。
    • 此策略可以与least_conn和ip_hash结合使用。
    • 此策略比较适合服务器的硬件配置差别比较大的情况。

    3、ip_hash

    上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。

    我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。

    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

    #动态服务器组
    upstream dynamic_zuoyu {
        ip_hash;    #保证每个访客固定访问一个后端服务器
        server localhost:8080   weight=2;  #tomcat 7.0
        server localhost:8081;  #tomcat 8.0
        server localhost:8082;  #tomcat 8.5
        server localhost:8083   max_fails=3 fail_timeout=20s;  #tomcat 9.0
    }
    
    # 示例二
    upstream backserver {
        ip_hash;
        server 192.168.0.14:88;
        server 192.168.0.15:80;
    }
    # 示例三:此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。
    upstream dynamic_zuoyu {
        least_conn;    #把请求转发给连接数较少的后端服务器
        server localhost:8080   weight=2;  #tomcat 7.0
        server localhost:8081;  #tomcat 8.0
        server localhost:8082 backup;  #tomcat 8.5
        server localhost:8083   max_fails=3 fail_timeout=20s;  #tomcat 9.0
    }

    4、fair(第三方)
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。

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

    5、url_hash(第三方)

    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取。

    #动态服务器组
    upstream dynamic_zuoyu {
        hash $request_uri;    #实现每个url定向到同一个后端服务器
        server localhost:8080;  #tomcat 7.0
        server localhost:8081;  #tomcat 8.0
        server localhost:8082;  #tomcat 8.5
        server localhost:8083;  #tomcat 9.0
    }
    # 示例二
    upstream backserver {
        server squid1:3128;
        server squid2:3128;
        hash $request_uri;
        hash_method crc32;
    }

    每个设备的状态设置为:

    1.down 表示单前的server暂时不参与负载
    2.weight 默认为1.weight越大,负载的权重就越大。
    3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
    4.fail_timeout:max_fails次失败后,暂停的时间。
    5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

    配置实例:

    #user  nobody;
    worker_processes  4;
    events {
        # 最大并发数
        worker_connections  1024;
    }
    http{
        # 待选服务器列表
        upstream myproject{
            # ip_hash指令,将同一用户引入同一服务器。
            ip_hash;
            server 125.219.42.4 fail_timeout=60s;
            server 172.31.2.183;
            }
    
        server{
                    # 监听端口
                    listen 80;
                    # 根目录下
                    location / {
                        # 选择哪个服务器列表
                        proxy_pass http://myproject;
                    }
    
                }
    }
    

    未完待续……

  • 相关阅读:
    HDU 1028 简单动态规划
    poj2250 动态规划+路径标记
    计算机网络你还懵逼吗?第二弹biubiubiu
    几款值得推荐的android(安卓)开源框架简介
    Android Studio安装更新终极解决方式
    个人开发者做一款Android App需要知道的事情
    Android webservice的用法详细讲解
    Android图片加载与缓存开源框架:Android Glide
    进入社会看到的一片总结,若有感慨
    Android 开源组件 ----- Android LoopView无限自动轮转控件
  • 原文地址:https://www.cnblogs.com/wangcheng9418/p/15205593.html
Copyright © 2020-2023  润新知