Grace模式、Saint模式

一、probe(后端探针)

  探测后端,确定他们是否健康,返回的状态用req.backend.healthy核对

backend b1 {
     .host = "127.0.0.1";
     .port = "8080";
     .connect_timeout = 1s;
     .first_byte_timeout = 5s;
     .between_bytes_timeout = 2s;
     .max_connections=1000;
     .probe = {           .url = "/index.jsp"; //访问backend的路径,缺省是”/"
                                .timeout = 0.3 s; //定义probe的过期时间
                                .window = 8; //要检查后端服务器的次数
                                .threshold = 3; //.window里面要有多少polls成功就认为后端是健康的
                                .initial = 3; //当varnish启动的时候,要确保多少个probe正常
                            }
     
 }

二、ACLs :访问控制列表

 acl purgeallow {
      "127.0.0.1";
 }


 sub vcl_recv {
    
             .....
         if(req.request =="PURGE") {
             if(!client.ip ~ purgeallow){
                     error 405 "not allowed";
                 }
                 return(lookup);
         }
               ......

}    

三、Grace模式

当几个客户端请求同一个页面的时候,varnish只发送一个请求到后端服务器,然后让那个其他几个请 求挂起等待返回结果,返回结果后,复制请求的结果发送给客户端。 如果您的服务每秒有数千万的点击率,那么这个队列是庞大的,没有用户喜欢等待服务器响应。为了解 决这个问题,可以指示varnish去保持缓存的对象超过他们的TTL(就是该过期的,先别删除),并且去提供旧 的内容给正在等待的请求。 为了提供旧的内容,首先我们必须有内容去提供。

Grace模式解决了两个问题: 1:通过提供旧的内容,避免请求扎堆。 2:如果后端坏了,提供旧的内容。

sub vcl_fetch { 

             set beresp.grace = 30m;
}

sub vcl_recv {
 
         if (! req.backend.healthy) { 
             set req.grace = 5m;
        } else { 
            set req.grace = 15s;
        }

}
     

四、Saint模式

sub vcl_fetch {
  if (beresp.status == 500) {
      set beresp.saintmode = 10s;
      return(restart);
  } 
  set beresp.grace
= 5m; }

设置beresp.saintmode为10秒时,varnish会不请求该服务器10秒。或多或少可以算是一个黑名单。restart被执行时,如果我们有其他后端可以提供该内容,varnish会请求它们。当没有其他后端可用,varnish就会提供缓存中的旧内容。

原文地址:https://www.cnblogs.com/xiaoliangup/p/9211730.html