首页 > ngxin负载均衡请求重复怎么办?

ngxin负载均衡请求重复怎么办?

目前有三台服务器,ABC
A 在外网做负载均衡,利用 upstream 转发到 B,C
A 中 upstream 的设置里,B 和 C 都是一样的,为 max_fails=2 fail_timeout=30s
BC 的 upstream 设置只转发到本地的一个端口,后面也都写了 max_fails=2 fail_timeout=30s,但是应该是无效的.
现在有个问题就是某个请求会重复两次.
根据 log 里的内容,A 的 nginx 的 log 里此请求只出现了一次.
在 B 的 log 里出现了一次,B 中返回码为 499,request_time 为 60 秒
然后在 C 的 log 内也出现了一次,返回码为 200.

所以我的想法是,A 先转发到 B,B 接受请求后的后台程序执行了该请求,但是响应时间过长,导致返回 499,于是 A 的 nginx 以为请求没有被响应,就把此请求转发到 C,C 又重新接受了请求.导致了该请求被执行了两次.

如果真的是这种原因的话,那么我有几个小小的问题
第一,这个 60 秒是怎么算出来的?如果是按照 A 中的 max_fails=2 fail_timeout=30s 的设置得出的话,朝 B 转发两次,这样总共不应该是有三次请求的执行吗?(B 的两次和 C 的一次)
第二,A 中 nginx 的 log 在 B 失败之后转发的记录是没有被记录在 log 里的吗?
第三,这种情况有什么有效的处理方法吗?
望各位 nginx 大牛不吝赐教.


  1. 因为问题描述稍微有点混乱,所以这不是一个答案,只是根据你的描述,给出一些推测(No.1)知识点(No.2)。

  2. fail_timeout=30,而request_time=60,刚好是30X2,说明先后请求了两个服务器,而且都超时失败了。

  3. 一个请求只会产生一条access log,不过$upstream_addr会忠实的记录请求的过程,如“192.168.1.1:80, 192.168.1.2:80;当然$upstream_status也会这样做。

  4. 如果有效处理是定位问题的话,第二条应该已经给了你答案了。


第一:60s应该是B的执行时间,B如果失败Nginx应该是立刻转发到另外的server的,max_fails的意思是在两次失败以后nginx会把这个server标记为不可用,并不是失败了立刻继续请求两次
第二:对A来说只是来了一次请求

【热门文章】
【热门文章】