同步多个Varnish Cache服务器

4
我们有两台服务器,web1和web2,每台服务器都运行着Apache和Varnish。它们是负载均衡的,并具有30分钟的持久性。
在我们的测试中,我们发现某些情况下页面被缓存在Varnish的一个实例上(比如web1),但是没有被缓存在web2的Varnish上。
是否有一种方法可以使它们保持同步?这样当一个页面在web1上被缓存(或清除缓存)时,它也会被加载到(或从)web2上,反之亦然?
2个回答

1

你可以将一个Varnish作为另一个Varnish的后端。

你可以像这样做:

// use random director so you can fall back to web
director varnish random {
    {
        .backend = varnish2;
        .weight  = 100000000;
    }
    {
        .backend = web;
        .weight = 1;
    }
}

acl othervarnish {
        "{hostname}";
}

sub vcl_recv {
  set req.backend = web;

  // switch backend to varnish only if you haven't come from there
  if (!client.ip ~ othervarnish) {
     set req.backend = varnish;
  }
}

但请注意,这似乎与ESIs不兼容


谢谢@Pax。如果您愿意并将它们同步,那么没有办法让两个Varnish服务器“并行”吗?我们有两个前置服务器以防其中一个出现故障。保留冗余性会很好。 - KM.

0

我也在寻找解决相同问题的方法,但是还没有找到。

一个变通方法可能是:

在您的Web服务器之前放置HAProxy并激活粘性会话。因此,用户将仅被引导到他之前访问过(并且持有相同缓存数据的)一个Varnish服务器。

为了正确地清除两个Varnish,您的脚本或应用程序应迭代遍历所有Varnish服务器的列表,并逐个清除它们。

在我看来,这种解决方案并不推荐。 Varnish应该支持建立一个网格,所有服务器可以随着时间的推移进行同步(最终一致性)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接