05 Nginx负载均衡

2020年11月4日 study

2021年5月12日 review

01 Linux服务器安装JDK8和jar包上传

安装JDK8:

JAVA_HOME=/usr/local/software/jdk/jdk8
CLASSPATH=$JAVA_HOME/lib
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH

注意:配置环境变量的时候,等号=两边不能有空格,不然会报错;

02 后端应用集群构建

SpringBoot应用和接口说明:

  • demo-1.jar监听8080端口;
  • demo-2.jar监听8081端口;

接口说明:(要在阿里云中开启端口访问权限才能成功调用接口)

进程启动:

  • 直接启动:java -jar demo-1.jar
  • 守护进程方式启动:nohup java -jar demo-1.jar &

03 Nginx负载均衡

负载均衡(Load Balance)

  • 分布式系统中一个非常重要的概念,当访问的服务具有多个实例时,需要根据某种“均衡”的策略决定请求发往哪个节点,这就是所谓的负载均衡;
  • 原理是将数据流量分摊到多个服务器执行,减轻每台服务器的压力,从而提高吞吐量

负载均衡的种类

  • 通过硬件来进行解决,常见的硬件有NetScaler、F5、Radware和Array等商用的负载均衡器,但比较昂贵;
  • 通过软件来进行解决,常见的软件有LVS、Nginx等,它们是基于Linux系统并且开源的负载均衡策略;
  • 目前性能和成本来看,Nginx是目前多数公司的首选;

配置案例:

upstream lbs {
    server 47.115.23.41:8080;
    server 47.115.23.41:8081;
}
    
server {
    listen       80;
    server_name  47.115.23.41;

    location /api/ {
        proxy_pass http://lbs;
        proxy_redirect default;    
    }

}
  • upstream一般放在虚拟主机server上面,lbs为取的一个名字,在下面引用。
  • 请求流程:用户通过域名server_name请求到了虚拟主机server,然后与location中的路径匹配,如果满足,则proxy_pass到upstream里面,有很多个server,会通过负载均衡策略(默认为轮询),分发到某个server。
  • proxy_redirect default; 可以不加这行。

刷新,轮询

04 Nginx常见的负载均衡策略

  1. 节点轮询(默认)

    • 简介:每个请求按顺序分配到不同的后端服务器;
    • 场景:会造成可靠性低和负载分配不均衡,适合静态文件服务器;
  2. weight权重配置

    • 简介:weight和访问比率成正比,数字越大,分配得到的流量越高;
    • 场景:服务器性能差异大的情况使用;
upstream lbs {
    server 47.115.23.41:8080 weight=5;
    server 47.115.23.41:8081 weight=10;
}
server {
    listen       80;
    server_name  47.115.23.41;

    location /api/ {
        proxy_pass http://lbs;
        proxy_redirect default;    
    }
}
  1. ip_hash(固定分发)
    • 简介:根据请求按访问ip的hash结果分配,这样每个用户就可以固定访问一个后端服务器;
    • 场景:服务器业务分区、业务缓存、Session需要单点的情况;
upstream lbs {
        ip_hash;
        server 47.115.23.41:8080;
        server 47.115.23.41:8081;
}
server {
    listen       80;
    server_name  47.115.23.41;

    location /api/ {
        proxy_pass http://lbs;
        proxy_redirect default;    
    }
}

upstream还可以为每个节点设置状态值:

  • down表示当前的server暂时不参与负载;
  • server 47.115.23.41:8080 down;
  • backup其它所有的非backup机器down的时候,会请求backup机器,这台机器压力会最轻,配置也会相对低;
  • server 47.115.23.41:8080 backup;

注释:测试backup的时候,可以kill没有加backup的那个server,之后就会调用加了backup的server了。

05 Nginx后端节点可用性探测

如果某个应用挂了,请求不应该继续分发过去;

  • max_fails:允许请求失败的次数,默认为1,当超过最大次数时就不会请求;
  • fail_timeout:max_fails次失败后,暂停的时间,默认为10s;

参数解释

  • max_fails=N:设定Nginx与后端节点通信尝试失败的次数;
  • fail_timeout参数定义的时间内,如果失败的次数达到此值,Nginx就认为这个节点不可用;
  • 在下一个fail_timeout时间段到来前,服务器不会再被尝试;
  • 失败的尝试次数默认是1,如果设为0就会停止统计尝试次数,认为服务器是一直可用的;

具体什么是nginx认为的失败呢?

  • 可以通过指令proxy_next_upstream来配置什么是失败的尝试。
  • 注意默认配置时,http_404状态不被认为是失败的尝试。
upstream lbs {
        server 47.115.23.41:8080 max_fails=2 fail_timeout=60s;
        server 47.115.23.41:8081 max_fails=2 fail_timeout=60s;
}
server {
    listen       80;
    server_name  47.115.23.41;

    location /api/ {
        proxy_pass http://lbs;
        proxy_next_upstream error timeout http_500 http_503 http_404;    
    }
}

案例实操:

  • kill一个节点后,然后访问接口大于10次,如果访问不到,Nginx会把这个节点剔除;
  • 重启这个节点,在fail_timeout周期里面不会再获取流量;
posted @ 2021-05-12 20:16  ddhhdd  阅读(62)  评论(0)    收藏  举报