• Nginx 负载均衡


    Nginx 负载均衡详解

    负载均衡简介

    什么是负载均衡

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

    负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

    简单的来说。负载均衡可以减少服务器的压力,将原本一台服务器所要承受的访问量分给了多台,并提高了项目的可用性,当一台服务器挂掉的时候也不会导致整个项目瘫痪。

    负载均衡的目的

    负载均衡的目的是为了解决单个节点压力过大,造成Web服务响应过慢,严重的情况下导致服务瘫痪,无法正常提供服务,由于一个Web服务同时能处理的用户并发请求的数量有限,同时还有机器故障的情况,所以一个Web站点通常会在N台机器上各部署一套同样的程序。当某一个服务挂掉的时候,还有第二个、第三个、第N个服务。。。继续为用户提供服务,给用户的感觉,你的服务还在正常的运行!在这些提供同样服务的机器当中,在硬件配置方面也各不一样,这样就会存在部份机器性能非常好,能快速计算并响应用户的请求,另外一部份机器可能配置差点,响应用户的请求的时间会长一些。

    这就需要我们思考一个问题?如果有一个服务正在同时处理1000个用户的请求,这个服务的上限可能最多能同时处理1000个用户的请求,这时它已经很忙了,如果此时又有一个新请求过来,我们仍然把这个请求分配给这台机器,这时候这个请求就只能在干等着,等这个服务处理完那些请求后,再继续处理它。这样在浏览器中的反应就像12306我们在春节买票一样,卡在那不动了,让用户眼巴巴的干着急。而能提供同样服务的其它机器,这时确很空闲。这样不仅是对服务器资源的浪费,也充分发挥不出弄多台服务器装同一个服务的最高价值。我们通常称对某一台机器的访问量称为负载量,如何将一个用户的请求,合理的分配到一台能快速响应用户请求的服务器上,我们就需要用到一些负载策略。也就体现出了文章主题的用意了:负载均衡,将用户的所有HTTP请求均衡的分配到每一台机器上,充分发挥所有机器的性能,提高服务的质量和用户体验。负载均衡可以通过负载均衡网络硬件设备和Web服务器软件来实现,前者设备成本较高,小公司通常负担不起,所以后者一般是我们的首选。实现负载均衡常用的Web服务器软件有Nginx、HAProxy、LVS等,本文主要介绍Nginx的负载均衡策略。

    负载均衡的常用功能

    客户端的请求转发功能:按照一定的算法【权重、轮询】,将客户端请求转发到不同应用服务器上,减轻单个服务器压力,提高系统并发量。

    服务器的故障转移功能:通过心跳检测的方式,判断应用服务器当前是否可以正常工作,如果服务器宕掉,自动将请求发送到其他应用服务器。

    服务器故障恢复自动添加功能:如检测到发生故障的应用服务器恢复工作,自动将其添加到处理用户请求队伍中。

    Nginx内置三种负载策略

    Nginx负载均衡是通过upstream模块来实现的,内置实现了三种负载策略;

    配置负载均衡服务器集群:

    upstream mysvr { 
          server 192.168.10.121:3333;
          server 192.168.10.122:3333;
     }
     server {
            ....
            location  ~*^.+$ {         
               proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表         
            }
     }
    

    upstream:定义一个服务集群。
    proxy_pass: 将匹配的请求代理转发到proxy_pass后面配置的服务上,这里因为需要配置负载均衡,所以这里http://后面必须要跟上upstream定义的服务集群。

    注意:upstream定义服务集群时,配置的服务地址只能是域名+端口或者ip+端口,不能带有协议和路径,否则nginx会报nginx: [emerg] invalid host in upstream这个错误信息。

    轮询(默认weight=1)

    img

    nginx默认就是轮询其权重都默认为1,nginx将所有请求均匀的分给集群中的每台服务器。服务器处理请求的顺序:ABABABABAB....

    upstream test {
    	server 127.0.0.1:7001; 		# 等同于server 127.0.0.1:7001 weight=1;
    	server 150.109.118.85:7001; # 等同于server 150.109.118.85:7001 weight=1;
    }
    
    server {
    	listen 8081;
    	server_name localhost;
    
    	location / {
    		proxy_pass http://test/;
    	}
    }
    

    权重轮询(weight)

    通过配置权重,指定轮询几率,权重和访问比率成正比,用于应用服务器性能不均的情况。如果后端服务器down掉,能自动剔除。比如以下配置,下面服务器的请求顺序为:ABBABBABBABBABB....

    upstream bakend {
        server 192.168.1.10 weight=1;
        server 192.168.1.11 weight=2;
    }
    

    ip_hash

    img

    每个请求按访问ip的hash结果分配,会让相同的客户端 ip 请求相同的服务器。可以解决session不能跨服务器的问题。如果后端服务器down掉,要手工down掉。

    upstream mysvr { 
          server 127.0.0.1:7878; 
          server 192.168.10.121:3333;
          ip_hash;
        }
    

    Nginx负载均衡相关参数

    down

    标识down的服务器暂时不支持资源请求。

    upstream test {
    	server 127.0.0.1:7001 down;
    	server 150.109.118.85:7001;
    }
    

    上面负载均衡的例子中,因为127.0.0.1:7001标识为down,所以不会有请求转发到这个服务,所有的请求都会转发到150.109.118.85:7001这个服务。

    weight

    集群中服务的权重值,默认是1。在只有weight这一个影响条件下,且集群中服务都正常,nginx会将更多的请求转发到weight更大的服务。

    upstream test {
    	server 127.0.0.1:7001 weight=2;
    	server 150.109.118.85:7001 weight=1;
    }
    

    这个集群中127服务和150服务各处理的请求比例为2:1。

    max_fails

    允许服务处理请求时服务出错的次数,默认为1。当服务处理请求发生错误的次数超过max_fails时,后面的请求暂时不会转发到这台发生错误的服务。

    upstream test {
    	server 127.0.0.1:7001 max_fail=1;
    	server 150.109.118.85:7001;
    }
    

    fail_timeout

    当服务处理请求发生错误的次数超过max_fails以后,nginx会暂时禁止将请求转发到这个服务。当过去fail_timeout设置的时间以后,nginx会尝试将请求转发到刚才被禁止的服务,如果服务正常,那么后续的请求可以继续转发到这台服务,如果服务错误,那么继续等待fail_timeout时间后再来检测。fail_timeout默认时间是10s。

    upstream test {
    	server 127.0.0.1:7001 max_fail=1 fail_timeout=10s;
    	server 150.109.118.85:7001;
    }
    

    backup

    备用服务器,当所有非backup服务发生错误被停用或者设置为down时,nginx会启用标识为backup的服务。

    upstream test {
    	server 127.0.0.1:7001 backup;
    	server 150.109.118.85:7001;
    }
    

    max_conns

    这个功能存在于nginx商业版。同一服务同时处理请求的个数。防止服务因处理请求过多,服务器性能不足,发生宕机的情况。

    upstream test {
    	server 127.0.0.1:7001 max_conns=10000;
    	server 150.109.118.85:7001;
    }
    

    slow_start

    这个功能存在于nginx商业版。当集群中错误服务等待fail_timeout时间后,nginx检测到这个服务能够正常使用后,再等待slow_start时间后,才正式使用这个服务。

    upstream test {
    	server 127.0.0.1:7001 slow_start=30s;
    	server 150.109.118.85:7001;
    }
    

    总结

    upstream backend {
      #down表示当前的服务器暂时不可用,不参与负载均衡
      server www.aaa.com down;
      #max_conns=100表示此服务器的最大连接数为100
      server www.bbb.com:1234 max_conns=100;
      #weight表示权重,权重越大,被分配到的次数就越多
      server www.ccc.com weight=3;
      #backup表示这是预留的备份服务器,只在其他的节点都不可用的时候才启用
      server www.ddd.com backup;
      #max_fails在连续超过3次失败后,30秒内不要再分发请求到此服务器,默认fail_timeout为10秒
      server x.x.x.x:8080 max_fails=3 fail_timeout=30s;
    }
    
     server {
        listen 80; 
        location / {
        	# 表示将所有请求转发到tomcats服务器组中配置的某一台服务器上。
            proxy_pass http://tomcats;
         }
     }
    }
    

    参考

  • 相关阅读:
    BZOJ1527 : [POI2005]Pun-point
    2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016)
    2016-2017 ACM-ICPC Northwestern European Regional Programming Contest (NWERC 2016)
    NAIPC-2016
    BZOJ2498 : Xavier is Learning to Count
    ACM ICPC Vietnam National Second Round
    XVI Open Cup named after E.V. Pankratiev. GP of Ukraine
    XVI Open Cup named after E.V. Pankratiev. GP of Peterhof
    HDU5509 : Pattern String
    BZOJ4583 : 购物
  • 原文地址:https://www.cnblogs.com/hanlk/p/14219928.html
Copyright © 2020-2023  润新知