在Varnish 4重试期间更改后端

时间:2016-02-18 00:11:21

标签: varnish varnish-vcl

我希望能够在Varnish 4的重试中更改后端。我们已经使用Varnish 3在不同的(较旧的)应用程序上工作,但我无法弄清楚v4,也找不到太多文档。我们想要的设置是拥有2组导向器 - 一个用于尝试与varnish在同一数据中心中的本地服务器的初始请求,因为这样更快,然后只有在失败的情况下,从其他导向器中随机选择其他导向器。数据中心。

在第3版中,这很简单:

sub vcl_recv {
    if (req.restarts == 0) {
        set req.backend = defaultdirector;
    } else {
        set req.backend = backupdirector;
    }
}

#Then in vcl_fetch and/or vcl_error something like:
if (beresp.status >= 500 && req.restarts < some_max) {
    return(restart);
}

但是现在在v4中,重启已经被替换为重试,整个文档是:

  

在3.0中,可以在注意到后端响应错误后返回(重启),以更改为不同的后端。

     

现在称为return(重试),然后跳回vcl_backend_fetch。

     

这只影响后端获取线程,客户端处理不受影响。

然而,我仍然看到一些人的示例代码包含return(restart)而不是return(retry),而不是使用retry命令的单个示例。

我知道清漆不应该再次在vcl_recv中完成所有工作(例如剥离cookie),因为它只是与后端的通信失败了,所以跳回到后端获取是有意义的而不是重做所有前端处理,但如果我尝试在vcl_backend_fetch中更改后端,则会出现编译错误。我如何使这项工作?

1 个答案:

答案 0 :(得分:8)

official documentation有点误导。实际上,重新启动仍然存在:您可以在 vcl_deliver 中捕获错误,并使用 req.backend_hint <在 vcl_recv 中相应地设置后端/强>:

sub vcl_recv {
    if (req.restarts == 0) {
        set req.backend_hint = defaultdirector.backend();
    } else {
        set req.backend_hint = backupdirector.backend();
    }
}

sub vcl_deliver {
    if (resp.status >= 500 && req.restarts < some_max) {
        return(restart);
    }
}

或者,如果它更合适,您可以在 vcl_backend_response vcl_backend_fetch 之间使用重试

sub vcl_backend_fetch {
    if (bereq.retries > 0) {
        set bereq.backend = backupdirector.backend();
    }
}

sub vcl_backend_response {
    if (beresp.status >= 500 && bereq.retries < some_max) {
        return(retry);
    }
}