2016-11-22 58 views
1

使用清漆4缓存来自多个服务器的相同请求的不同内容。它看起来像缓存来自一台服务器的第一个请求,并为每个后续请求不断提供相同的内容。清漆4从多个不同内容的服务器缓存

做卷曲给予两个缓存和不同年龄的响应。

是否有像负载或其他任何粘性行为的因素? 使用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); 
} 

回答

3

首先要考虑的是,你将有只有在对象已经从它取出后端IP。所以你不能在你的散列方法上使用该ip,因为vcl_hash发生在fetch之前。

是关于循环法。它只有在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); 
} 

希望这个答案满足您的需求。如果有什么我错过了,随时发表评论或添加到您的问题,我会很高兴为我的答案添加一些信息。

+0

完美..我想错了..你的答案应该为我工作..关于不同的内容,响应缓存并提供缓存的对象,并在平均时间,如果用户更新他的内容在社交网络缓存对象应该是无效并返回新的资源(我需要考虑我认为的体系结构) – user1609085

+1

我建议您在您的Varnish配置中实施清除,并在需要使对象无效时使用它。这里是它的链接:http://book.varnish-software.com/4.0/chapters/Cache_Invalidation.html#http-purge – alejdg