2016-07-26 41 views
1

我们使用Varnish Cache作为前端服务给很多客户,而我们通过宽限期服务器陈旧内容,而任何后端生病。增加后端生病时的清漆宽限时间

我们现在有一个失败的后端,我们想增加宽限期(虽然它生病了),这是一种可能的情况吗?我试着在文档中挖掘并没有发现任何东西。

光油4

回答

1

清漆缓存4.x的服务内容陈旧时生病后端是一个普遍使用的缓存。你只需要实现你自己的vcl_hit子程序。这个想法是使用高宽限期值(如24小时)缓存的内容,但限制的宽限期,以一个小的时间窗口(例如10秒)时,你的后台是健康的:

sub vcl_hit { 
    if (obj.ttl >= 0s) { 
     # Normal hit. 
     return (deliver); 
    } 

    # We have no fresh fish. Lets look at the stale ones. 
    if (std.healthy(req.backend_hint)) { 
     # Backend is healthy. Limit age to 10s. 
     if (obj.ttl + 10s > 0s) { 
      return (deliver); 
     } else { 
      # No candidate for grace. Fetch a fresh object. 
      return(fetch); 
     } 
    } else { 
     # Backend is sick. Use full grace. 
     if (obj.ttl + obj.grace > 0s) { 
      return (deliver); 
     } else { 
      # No graced object. 
      return (fetch); 
     } 
    } 
} 

欲了解更多信息,请查询:

+0

谢谢,但我仍然没有得到它。情景是,我有你所说的vcl_hit,并设置宽限为5h,后端生病了。我想增加这些5小时,让我们说10小时左右,但它仍然生病,这是一种可能的情况? –

+1

据我所知,如果您使用宽限值为X小时的内容将内容存储在Varnish Cache中,则该内容将在存储插入X小时后从存储中删除,并且在VCL中无法执行任何操作避免(你有''beresp.keep'',但我认为这里没有用)。因此,唯一的解决方案是使用高于最长期望后端中断的宽限值来存储objets。 –

+0

明白了,谢谢,我非常感谢你的帮助:) –