caching - Varnish 4以从具有不同内容的多台服务器缓存

标签 caching varnish varnish-vcl varnish-4

使用 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);
}

最佳答案

首先要考虑的事情是,只有在从对象中提取了对象之后,您才拥有后端ip。因此,您无法在哈希方法上使用该ip,因为vcl_hash在获取之前发生。

第二个与轮循有关。它仅在Varnish提取对象时发生,因此当对象已被缓存时就不会发生。

要准确回答的问题,需要知道为什么您的应用程序为同一请求提供不同的内容。如果请求始终相同,您如何指示正在请求哪个后端?请求中必须有诸如Cookie, header 或原始IP之类的东西,该信息应指示哪个人必须响应该请求。

知道可以设置特定的后端并在vcl_hash中使用它。出于示例目的,假设您要基于名为backend_choice的 header 设置后端:

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);
}

希望这个答案能满足您的需求。如果有什么我想念的,请随时发表评论或添加到您的问题中,我很乐意在回答中添加一些信息。

关于caching - Varnish 4以从具有不同内容的多台服务器缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40751646/

相关文章:

caching - Go 中的 RWMutex 未按预期工作

image - Monotouch 的异步图像下载器/缓存

perl - 获取$ ENV奇怪的问题{'QUERY_STRING'}

kubernetes - 准备就绪和活跃度探测失败: HTTP probe failed with statuscode: 503 during starting of Varnish using Helm Chart Kubernetes”

Varnish 缓存对象时间

php - Magento松节油 Varnish 不能正常工作

caching - 如何使 Varnish 不缓存某个文件夹

ASP.NET 对象缓存 - 多少才算太多?

javascript - 我可以告诉 Web 浏览器不要缓存特定文件吗?