当前位置:   article > 正文

nginx 负载均衡方法_nginx iphash

nginx iphash

负载均衡方法

nginx 负载均衡一共3种方法

  • round-robin 轮询 简称RR
    • 就是请求会依次分配给server,按照顺序来
  • least-connected 最少连接
    • 请求会分配给当前connection最少的server
  • ip-hash
    • 根据客户端ip的hash值来分配请求,一般适合粘性session场景,比如后端服务未实现session共享,某个用户在server1登录后,后续请求都要分配到server1

最简单的负载均衡设置

http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://myapp1;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在上述例子中,设置了3个server,没有指定负载均衡方法,默认是round-robin 轮询。
如果想使用最少连接,则设置least_conn指令。

upstream myapp1 {
        least_conn;
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

如果想使用ip-hash,适用粘性session场景,则设置ip_hash指令。

upstream myapp1 {
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

也可以指定权重,在前边的例子中所有的server都是平等的,如果某台server性能高,想多承接写请求,则使用权重,

upstream myapp1 {
        server srv1.example.com weight=3;
        server srv2.example.com;
        server srv3.example.com;
    }
  • 1
  • 2
  • 3
  • 4
  • 5

上边的例子表示,每5个请求,srv1处理3个,srv2、srv3各处理1个。可以将权重和ip-hash、least-conn一起使用,在实践中,通常采用 least-conn与weight联合使用,可以实现更好地负载均衡,防止有的server空闲,它的分配规则是,请求会分配给active conns/weight最小值的server。
通过负载均衡+backup,就可以实现高可用。以下示例表示,当srv1、srv2都不可用时,启用backup。

upstream myapp1 {
        server srv1.example.com weight=3;
        server srv2.example.com;
        server srv3.example.com backup;
    }
  • 1
  • 2
  • 3
  • 4
  • 5

那么srv1、srv2不可用的标准是什么呢?

服务不可用的标准

服务不可用指的是在指定时间内失败尝试达到阈值,比如默认的10秒内失败1次就认为server不可用,那么什么是失败尝试呢?默认失败尝试是三次握手失败或超时(握手超时、read data超时),proxy_next_upstream可以更改默认失败尝试,比如返回500/404则认为失败尝试。如果请求失败,nginx会将请求转发到下一个server。
fail_timeout内失败max_fails次,server会被标记为不可用,fail_timeout也指定了server恢复间隔,fail_timeout后,会分配一个请求,如果成功,则再将server标识为可用。
server指令中,指定max_fails(最大失败次数)、fail_timeout(失败超时时间)

upstream backend {
    server backend1.example.com weight=5;
    //30秒内,失败尝试3次,则server不可用
    server 127.0.0.1:8080       max_fails=3 fail_timeout=30s; 
    server unix:/tmp/backend3;
    server backup1.example.com  backup;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

援引nginx官方文档

Syntax: proxy_next_upstream error | timeout | invalid_header |
http_500 | http_502 | http_503 | http_504 | http_403 | http_404 |
http_429 | non_idempotent | off …;
Default: proxy_next_upstream error timeout;
Context: http, server, location
Specifies in which cases a request should be passed to the next server:
error
an error occurred while establishing a connection with the server, passing a request to it, or reading the response header;
timeout
a timeout has occurred while establishing a connection with the server, passing a request to it, or reading the response header;

前边提到的server不可用属于入站/被动检测(in band/passive),当请求来了才能知道server可不可用,nginx plus(nginx的商业版)支持主动检测,nginx会按照策略主动发起请求,测试server是否可用。

个人公众号

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/755855
推荐阅读
相关标签
  

闽ICP备14008679号