我知道这个主题有很多问题和答案。但其中大多数是Varnish 3或不使用round_robin导演。
目前我已使用以下VCL进行测试:
sub vcl_init {
new bar = directors.round_robin();
bar.add_backend(cbweb1);
bar.add_backend(cbweb2);
}
sub vcl_recv {
set req.backend_hint = bar.backend();
unset req.http.Cookie;
}
sub vcl_deliver {
if(resp.status == 404 && req.restarts < 1)
{
return(restart);
}
}
在我的小测试中,这似乎有效。但我不明白这是如何工作的。
bar.backend()是否会记住哪些服务器已被使用并跳过这些服务器?或者这只是全局循环,是否有可能,如果在处理期间有另一个请求进入,服务器将被调用两次?
更新的 以下VCL似乎有效:
sub vcl_init {
new bar = directors.round_robin();
bar.add_backend(cbweb1);
bar.add_backend(cbweb2);
}
sub vcl_recv {
set req.backend_hint = bar.backend();
}
sub vcl_backend_fetch
{
if (bereq.retries > 0)
{
if(bereq.http.X-Backend == "cbweb1")
{
set bereq.backend = cbweb2;
}
else
{
set bereq.backend = cbweb1;
}
}
}
sub vcl_backend_response {
set bereq.http.X-Backend = beresp.backend.name;
if (beresp.status == 404 && bereq.retries < 1) {
return(retry);
}
}
答案 0 :(得分:1)
我认为它因你的循环而在你的测试中起作用。它会一个接一个地尝试服务器。
我认为在生产设置中,由于并发请求,这将无效。
如果你重试,它将再次通过vcl_recv并从导演获得backend_hint,无论req.restarts值是什么。如果你想要一个不同的后端,那么你将不得不对其进行编码。
一个想法可能是(代码未经过测试,您将不得不调整X-backend比较):
subprocess.Popen