我们有两个服务器,web1和web2,每个服务器都运行Apache和Varnish。它们是负载均衡的,持续时间为30分钟。
在我们的测试中,我们发现在某些情况下,页面被缓存在一个Varnish实例(比如web1)上,而不是缓存在web2上的Varnish上。
有没有办法让它们保持同步?所以当一个页面在web1中被缓存(或清除)时,它也会被加载到(或从) web2中,反之亦然?
发布于 2011-08-18 02:54:10
您可以使用一种清漆作为另一种清漆的后端。
你可以这样做:
// 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;
}
}
但请注意,这看起来像是doesn't work with ESIs。
发布于 2017-08-12 23:56:53
我也在寻找一个解决同样问题的解决方案,但还没有找到。
一种解决方法可能是:
在您的web服务器前放置一个HAProxy,并激活粘性会话。因此,用户只会被定向到他之前访问过的一个varnish服务器(并保存相同的缓存数据)。
要正确清除这两个varnish,您的脚本或应用程序应该遍历所有varnish服务器的列表并逐个清除它们。
在我看来,这个解决方案是不被推荐的。Varnish应该支持设置网格,所有服务器都可以随着时间的推移进行同步(最终保持一致)。
https://stackoverflow.com/questions/7095153
复制相似问题