nginx容灾配置,rpc重试机制,upstream配置
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx容灾配置,rpc重试机制,upstream配置相关的知识,希望对你有一定的参考价值。
参考技术A proxy_next_upstream_timeout 和 proxy_xx_timeout的关系是怎样的?proxy_xx_time 都是针对upstream里面一个节点的超时时间,请求一个节点可以看做是一个原子操作,这个原子操作无论怎样都会按照自己的proxy_xx_timeout完成一次请求,在所有proxy_xx_timeout结束后依然得不到结果,这一次请求就超时了结束了
这次原子请求结束后,再来根据proxy_next_upstream_timeout来决定是否可以重试到下一个节点,如果原子请求结束后,用时还没到达proxy_next_upstream_timeout设置的时间,并且那么可以继续重试原子请求。
重试多少次?直到重试到proxy_next_upstream_timeout设置的时间 或者 proxy_next_uptream_tries 次数,只要有一个条件满足,重试就停止。 意味着:在proxy_next_upstream_timeout时间内可以重试proxy_next_uptream_tries 次。
如果在一个原子请求里,proxy_xx_timeout结束之前,proxy_next_upstream_timeout的时间更早结束,也就是说proxy_xx_timeout的时间总和 > proxy_next_upstream_timeout ,那么当原子请求完,就可以直接结束,不用重试了,因为早已超过了proxy_next_upstream_timeout 的超时时间。
这里一个很重要的概念是:proxy_xx_timeout是一个节点请求的原子超时时间,进去这原子请求里面,就无视外面的proxy_next_upstream_timeout 时间。怎么也得这原子请求结束了再来看是否能重试
假设现在upstream有两个节点,一个8100,一个8200,并且这两个端口都不会应答,都会超时
分析:原子请求需要花费10秒,10秒出来,proxy_next_upstream_timeout的5秒已经过去,不会再重试,此时access_log看到请求10秒后返回504timeout
分析:第一个原子请求8100花费2秒,出来后看到proxy_next_upstream_timeout=5,此时还剩下3秒,可以再重试,到了下一个节点8200,8200也会超时,此时proxy_next_upstream_timeout剩下1秒,还可以重试,但是没有节点了,此时access_log看到请求 4秒 后返回504timeout。 注意这里不会等待5秒再超时。没有节点了就直接返回504
上面的讨论都是针对节点超时来看是否能重试节点,当然实际上可能会因为节点5xx,4xx来决定重试,
proxy_next_upstream error timeout http_502 http_504; 这个配置就是决定什么情况需要进行重试的,这里配置的就是超时、502、504、异常返回。这种不是极端超时的情况,一般都能proxy_next_upstream_timeout在这超时范围内重试
nginx的这个proxy_next_upstream_timeout 是rpc微服务容灾的核心配置,这个配置简单但非常重要,决定着服务在异常的时候能否重试到别的节点,如果配置不当不能重试,那就会影响用户体验。
Nginx# 负载均衡配置(容灾)
反向代理
实现负载均衡之前,我们首先需要先实现反向代理;
反向代理:通俗的讲,即用户请求时不必直接请求到Web服务器,而是将请求发送给代理服务器,由代理服务器有策略的将请求分配给不同的Web服务器。此处的代理服务器即是 Nginx
使用nginx的 upstream
模块实现反向代理:
-
修改 nginx的配置文件 nginx.conf
http # 反向代理配置 upstream myServer # 配置服务的访问路径 server localhost:8080; server listen 80; server_name localhost; location / root html; proxy_pass http://myServer; # 注意此处最后没有 / index index.html index.htm;
使用nginx进行如此配置后,就可以实现 访问http://localhost:80 直接跳转到 http://localhost:8080网址
负载均衡
负载均衡:把大量的请求按照指定的方式均衡的分配给集群中的每台服务器。避免大量的请求只请求某一台服务器,从而导致服务器宕机的情况。
1. 轮询(默认)
修改 upstream 处的反向代理配置,实现每个请求按时间顺序,逐一分配到不同的web服务器
http
# 反向代理配置
upstream myServer
# 配置服务的访问路径
server localhost:8080;
server 192.168.191.100:8989; # 在此处新增一个web服务器的地址
server
listen 80;
server_name localhost;
location /
root html;
proxy_pass http://myServer; # 注意此处最后没有 /
index index.html index.htm;
proxy_pass http://myServer
:表示将所有请求转发到 myServer 服务器组中配置的某一台服务器上upstream
模块:配置反向代理服务器组,Nginx会根据配置,将请求分发给组内的某一台服务器,myServer 是服务器组的名称- upstream模块下的
server指令
:配置处理请求的服务器 IP或域名,端口可选(不配置则默认80端口)
通过上面的配置,Nginx默认将请求依次分配给 localhost,192.168.191.100来处理。
可以通过修改下面的参数来改变默认的分配策略:
-
weight
:权重,默认为1,表示将请求平均分配给每个服务器 -
max_fails
:最大允许失败次数,默认为1,表示某台服务器允许请求的失败次数,超过最大次数后,在 fail_timeout 的时间内,新的请求将不会分配給这台机器。如果设置为 0,表示这台Server为永久无效状态,然后将请求发给定义了proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream 指令的Server来处理这次错误的请求。
-
fail_timeout
:失败的超时时间,默认为 10s,表示某台服务器达到 max_fails次失败后,在 fail_timeout期间内,都不会收到新请求
upstream myServer
server localhost:8080 weight=2; # 代表这台服务器,相较于下面的服务器,分到请求的概率更大
server 192.168.191.100:8989 max_fails=3 fail_timeout=20; # 代表如果请求它失败 3次后,20内不会再请求它
backup
:表示备份机,服务器组中的其它服务器都挂了后,才会生效max_conns
:限制分配给某台Server处理的最大连接数量,默认为0(不限制),表示超过这个数量后,将不会分配新的连接给它
upstream myServer
server localhost:8080 backup; # 代表只有当下面192.168.191.100这台服务器挂了后,才会启用它
server 192.168.191.100:8989 max_conns=1000; # 代表最多给这台机器分配1000个请求,第1001个不会再分配给它
2. weight
同上面介绍的一样,weight代表权重,默认为 1,值越大,代表分配到请求的概率就越大
upstream myServer
server localhost:8080 weight=2; # 代表请求分配给它的概率,与下面的服务器概率相同(weight都为2)
server 192.168.191.100:8989 weight=2;
3. ip_hash
第一次请求时,根据客户端的IP算出一个hash值,然后将请求分配到集群中的某一台服务器中。后面该客户端的所有请求,都将通过hash算法,找到之前的那台服务器进行处理。
可以解决会话 Session丢失的问题,不管刷新多少遍,始终访问的都是同一台服务器。
upstream myServer
ip_hash;
server localhost:8080;
server 192.168.191.100:8989;
4. least_conn
将请求分配给连接数最少的服务器,Nginx会自动统计哪些服务器的连接数最少。
upstream myServer
least_conn;
server localhost:8080;
server 192.168.191.100:8989;
5. 第三方负载策略
5.1 fair
根据服务器的响应时间来分配请求,响应时间短的优先分配;
需要 fair模块的支持,下载地址:https://github.com/xyang0917/…;下载完成后,需要重新编译源码,覆盖之前的nginx
upstream myServer
fair;
server localhost:8080;
server 192.168.191.100:8989;
注意:使用fair 负载策略后,weight参数也就不起作用了
5.2 url_hash
按请求 url的 hash结果来分配请求,使每个url 定向到同一个后台服务器(服务器做缓存时比较有效)
Nginx 1.7.2 之后,url_hash模块已经集成到 nginx源码中,无需单独安装
upstream myServer
url_hash;
server localhost:8080;
server 192.168.191.100:8989;
以上是关于nginx容灾配置,rpc重试机制,upstream配置的主要内容,如果未能解决你的问题,请参考以下文章