gpt4 book ai didi

varnish - 如何使用 varnish 将请求发送到 localhost httpd 服务器,但如果不健康,将请求循环发送到一组其他节点

转载 作者:行者123 更新时间:2023-12-03 17:45:07 25 4
gpt4 key购买 nike

我们有一组 6 个后端服务于我们的网站。因为我们使用多个数据中心,所以我们发现当我们让 varnish 将请求发送到 localhost httpd 服务器(在端口 81 上运行)时,对我们来说性能最佳。这当然是 varnish 支持的非常基本的配置,可以使用 fallback Director 来完成:

director default fallback {
{ .backend = localbackend; }
{ .backend = web1; }
{ .backend = web2; }
{ .backend = web3; }
etc...
}

然而,后备主管会按顺序尝试其他后端,直到找到一个健康的后端。最大的问题是,在上面的配置中,如果 localbackend 失败,web1 将占用所有流量!!!这会使 web1 过载,并且会生病。然后所有请求都转到 web3...现在它将获得正常流量的 3 倍...导致级联故障。

因此,我们需要一个配置,如果它是健康的,它将允许所有请求发送到 localhost httpd 服务器,但如果不是,则以循环类型的方式将请求发送到其他健康的服务器。

预先感谢您提供您可能想到的任何建议和解决方案......非常感谢您的帮助。

最佳答案

它可以通过多种方式完成,最简单的一种是:

  • 将本地主机设置为默认后端
  • 为其余后端创建一个循环 Controller
  • 检查顶部 vcl_recv如果默认后端是健康的,如果它没有切换到循环 Controller 。

  • 使用这种方法,您甚至可以在当前请求失败时切换后端。

    就像是:
    probe my_probe {
    .url = "/";
    .interval = 1s;
    .timeout = 0.2 s;
    .window = 3;
    .threshold = 2;
    .initial = 1;
    }
    backend default {
    .host = 127.0.0.1;
    .probe = my_probe;
    }
    backend server1 {
    .host = 192.168.8.21;
    .probe = my_probe;
    }
    backend server2 {
    .host = 192.168.8.22;
    .probe = my_probe;
    }
    backend server3 {
    .host = 192.168.8.23;
    .probe = my_probe;
    }
    director server_pool round-robin {
    { .backend = server1; }
    { .backend = server2; }
    { .backend = server3; }
    }

    sub vcl_recv {
    if ( req.backend == default
    && ! req.backend.healthy
    ) {
    set req.backend = server_pool;
    }
    /* Uncomment if you want to divert restarted requests to the server pool
    * if (req.restarts > 0) {
    * set req.backend = server_pool;
    * }
    */
    }

    关于varnish - 如何使用 varnish 将请求发送到 localhost httpd 服务器,但如果不健康,将请求循环发送到一组其他节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9602838/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com