我们有两台服务器,web1 和 web2,每台都运行 Apache 和 Varnish。它们是负载平衡的,持续时间为 30 分钟。
在我们的测试中,我们发现某些情况是页面缓存在 Varnish 的一个实例(比如 web1)上,但没有缓存在 web2 上的 Varnish 上。
有没有办法让它们保持同步?这样当一个页面在 web1 中缓存(或清除)时,它也会被加载到 web2(或从 web2 中清除),反之亦然?
我们有两台服务器,web1 和 web2,每台都运行 Apache 和 Varnish。它们是负载平衡的,持续时间为 30 分钟。
在我们的测试中,我们发现某些情况是页面缓存在 Varnish 的一个实例(比如 web1)上,但没有缓存在 web2 上的 Varnish 上。
有没有办法让它们保持同步?这样当一个页面在 web1 中缓存(或清除)时,它也会被加载到 web2(或从 web2 中清除),反之亦然?
您可以使用一种清漆作为另一种清漆的后端。
您可以执行以下操作:
// 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;
}
}
但请注意,这似乎不适用于 ESI。
我也在寻找解决同样问题的解决方案,但还没有找到。
一种解决方法可能是:
在您的网络服务器之前放置一个 HAProxy 并激活粘性会话。因此,用户只会被引导到他之前访问过的一个清漆服务器(并保存相同的缓存数据)。
要正确清除这两种清漆,您的脚本或应用程序应该遍历所有清漆服务器的列表并一一清除它们。
在我看来,不推荐这种解决方案。Varnish 应该支持建立一个网格,所有服务器都可以随着时间的推移同步(最终一致性)。