负载均衡器静默处理服务器错误

负载均衡器静默处理服务器错误

我正在寻找一个可以静默处理服务器错误的 HTTP 负载平衡器。我想要的是平衡每个请求的负载,以便它能够正常工作,在最坏的情况下也会出现一点超时。

  • 如果工作中的 Web 节点返回 HTTP 500 服务器错误,则负载平衡器必须使用另一个 Web 节点重试该请求。如果第二个节点确实返回另一个 500 错误,则对最后一个节点执行相同操作(我假设有 3 个节点)。如果最后一个节点返回 500 错误,则将其显示给最终用户。

  • 如果服务器节点超时(需要 1 或 2 秒以上的时间来应答),则请求必须路由到另一台服务器,客户端应该在 2 秒以上的时间内收到好的答复。

答案1

你可以使用HttpProxy模块(它是相当标准的模块,通常位于 nginx 内部)来实现这样的负载均衡器。

Nginx 轻量、快速且具有很多功能(甚至可以在其中嵌入 lua 代码)。

您的用例的示例配置如下

upstream backend { 
 server 10.0.0.1; 
 server 10.0.0.2;
 server 10.0.0.3;
}
server {
   listen      80;
   server_name _;

   location / {
        proxy_pass  http://backend;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_redirect off;
        proxy_buffering off;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

秘诀是proxy_next_upstream指令,决定在什么情况下将请求传输到下一个服务器。可能的值包括:

  • 错误 — 连接到服务器、向服务器发送请求或读取其响应时发生错误;
  • 超时 — 与服务器连接、传输请求或从服务器读取响应时发生超时;
  • invalid_header — 服务器返回一个空的或者不正确的答案;
  • http_500 — 服务器返回代码 500
  • http_502 — 服务器返回代码 502
  • http_503 — 服务器返回代码 503
  • http_504 — 服务器返回代码 504
  • http_404 — 服务器返回代码 404
  • off — 禁止将请求转移到下一个服务器

答案2

Apache 也可以通过两种方式实现此行为

第一个,使用 failonstatus

该指令是 mod_proxy 模块中的 failonstatus

例如,我曾经在生产环境中使用以下配置

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy "balancer://mycluster">
    BalancerMember "https://bod_node3.wavin.com:8443" route=1 connectiontimeout=5 keepalive=On retry=1200
    BalancerMember "https://bod.wavin.com:9443" route=2 connectiontimeout=5 keepalive=On  retry=1200
    ProxySet stickysession=ROUTEID
    ProxySet lbmethod=bytraffic
    ProxySet failonstatus=500,503,502
</Proxy>

第二种方法,我认为最好的选择是使用模块 mod_proxy_hcheck https://httpd.apache.org/docs/2.4/mod/mod_proxy_hcheck.html

目前,我正在使用此模块来检测后端问题

LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
LoadModule watchdog_module modules/mod_watchdog.so
...
ProxyPass "/" "balancer://mycluster/" stickysession=JSESSIONID|jsessionid
    <Proxy "balancer://mycluster">
        BalancerMember "https://bod_node3.wavin.com:8443" route=node3 connectiontimeout=5 keepalive=On retry=1200 hcmethod=GET hcuri=/BOE/CMC/
        BalancerMember "https://bod.wavin.com:9443" route=node4 connectiontimeout=5 keepalive=On  retry=1200 hcmethod=GET hcuri=/BOE/CMC/
    ProxySet lbmethod=bytraffic
</Proxy>

答案3

我猜你想提供 HTTP 服务?

Nginx 提供了很多功能,包括您正在寻找的所有功能:http://wiki.nginx.org

特别检查上游和代理设置,在那里您可以实现所有要求:http://wiki.nginx.org/HttpUpstreamModule http://wiki.nginx.org/HttpProxyModule

答案4

您在这里寻找的是代理或合理昂贵的负载均衡器。

在代理方面,squid/nginx 可以相对合理地完成工作 - 选择哪一个取决于个人喜好,但拥有足够的资源也很重要(如果没有,那么 nginx 无疑是最好的选择)

从硬件方面来看……F5 负载均衡器可以做这类事情,同时还能确保高可扩展性。

相关内容