使用varnish 4缓存来自多个服务器的相同请求的不同内容。看起来它缓存来自一个服务器的第一个请求,并为每个后续请求保持相同的内容。
做curl会给出两个缓存和不同年龄的响应。
是否有任何因素如负载或粘性行为的其他因素? 使用Jmeter和apache基准测试加载但仍然有相同的行为。
我的vcl_hash好吗?想要使用url和后端服务器的ip的哈希组合保存对象。
在我的情况下,看起来就像在缓存对象的ttl之后,varnish从第二个服务器缓存并返回相同的内容,直到ttl完成。但这不是我们所期望的那样吗?
我错过了什么吗?使用循环法和hash_data。下面是我的config.vcl
backend s1{
.host = "190.120.90.1";
}
backend s2{
.host = "190.120.90.2";
}
sub vcl_init {
new vms = directors.round_robin();
vms.add_backend(s1);
vms.add_backend(s2);
}
sub vcl_recv {
set req.backend_hint = vms.backend();
}
sub vcl_hash {
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
return(lookup);
}
答案 0 :(得分:3)
第一个要考虑的事情是,只有在从中获取对象后才会拥有后端ip。因此,您无法在哈希方法上使用该ip,因为在获取之前会发生vcl_hash。
第二次是关于循环赛的。它仅在Varnish获取对象时发生,因此当对象已被缓存时不会发生。
要回答您的问题正确,需要了解您的应用为何为同一请求提供不同内容。如果请求始终相同,您如何指出正在请求哪个后端?必须有一些像cookie,标题或请求的原始IP,它应该指示哪一个必须响应该请求。
知道可以设置特定的后端并在vcl_hash中使用它。例如,我们假设您要根据名为backend_choice
的标头来设置后端:
sub vcl_recv {
if (req.http.backends_choice == "s1") {
set req.backend_hint = s1;
# If the header is not "s1" or does not exist
} else {
set req.backend_hint = s2;
}
...
}
sub vcl_hash {
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
# We use the selected backend to hash the object
hash_data(req.backend_hint);
return(lookup);
}
希望这个答案能满足您的需求。如果我遗漏了某些内容,请随时发表评论或添加您的问题,我很乐意在回答中添加一些信息。