zoukankan      html  css  js  c++  java
  • 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;
         }
     }
    }
    

    参考

  • 相关阅读:
    Object-C中
    实例变量可见度修饰符
    Object-C 类和对象
    C语言中线程和进程的区别
    动态内存分配
    C语言中union关键字
    C语言结构体
    const define static extern 关键词详解
    基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(一)
    Ubuntu18.04+CUDA9.0+cuDNN7.1.3+TensorFlow1.8 安装总结
  • 原文地址:https://www.cnblogs.com/hanlk/p/14219928.html
Copyright © 2011-2022 走看看