varnish后端的备份

varnish后端的备份

跑上nginx+varnish的结构已经有一段时间了,比较稳定,再加上这段时间主要工作是民工活(搬运等体力活),没去关心这些东西。

忙完一段,有闲暇看看这些东西的文档和邮件列表。

原来一直觉得varnish虽然也支持round robin的后端负载均衡,但缺乏对主备系统的支持,也就是平时向后端的请求负载全部落在一个后端服务上,当这个后端服务宕了,才落到另一个后端服务上去。以前也转过这个念头,但貌似用vcl很难实现这个功能。

在varnish的wiki网站上增加了这样一条:http://varnish.projects.linpro.no/wiki/VCLExampleRestarts,上次看到这个东西,也没有空去试一下。

貌似从2067就开始支持了,呵呵,以前一直没注意到,直到上次重装系统的时候。

于是修改了一下自己的VCL:

在recv里增加了

if (req.restarts == 0) {
    set req.backend = backend1;
} else  {
    set req.backend = backend2;
}

在fetch里增加了

if (obj.status != 200 && req.restarts == 0) {
    restart;
}

这样,如果backend1对于请求返回200,则走正常流程,否则看转向请求backend2,如果backend2也返回200(此时req.restarts 不再是0),则转出错流程,不向后端重复请求。在这个配置下,我把原来apache服务也起在8080上,作为nginx的备份,平时是没有流量的。

查看varnish日志,确实体现了这样的情况

   16 VCL_return   c lookup
   16 VCL_call     c hash
   16 VCL_return   c hash
   16 VCL_call     c miss    /*请求的东西在缓存里没有*/
   16 VCL_return   c fetch   /*于是到后端取*/
   20 TxRequest    b GET
   20 TxURL        b /images/toolbar1.gif
   20 TxProtocol   b HTTP/1.1
   20 TxHeader     b Host: xxx.xxx.com
   20 TxHeader     b X-Real-IP: xxx.xxx.xxx.70
   20 TxHeader     b X-Forwarded-For: xxx.xxx.xxx.70
   20 TxHeader     b Accept: */*
   20 TxHeader     b Referer:
http://xxx.xxx.com/index.php
   20 TxHeader     b Accept-Language: zh-cn
   20 TxHeader     b Accept-Encoding: gzip, deflate
   20 TxHeader     b User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; QQDownload 1.7)
   20 TxHeader     b Cookie: xxxxxxxxxxxxxxxxxxxxxxxxxxx
   20 TxHeader     b X-Varnish: 485739665
   20 TxHeader     b X-Forwarded-for: 127.0.0.1
   20 RxProtocol   b HTTP/1.1
   20 RxStatus     b 404    /*后端1说没这个东西*/
   20 RxResponse   b Not Found
   20 RxHeader     b Server: nginx
   20 RxHeader     b Date: Tue, 08 Apr 2008 01:29:29 GMT
   20 RxHeader     b Content-Type: text/html
   20 RxHeader     b Content-Length: 522
   20 RxHeader     b Connection: keep-alive
   16 ObjProtocol  c HTTP/1.1
   16 ObjStatus    c 404
   16 ObjResponse  c Not Found
   16 ObjHeader    c Server: nginx
   16 ObjHeader    c Date: Tue, 08 Apr 2008 01:29:29 GMT
   16 ObjHeader    c Content-Type: text/html
   20 BackendReuse b backend1
   16 TTL          c 485739665 RFC 518400 1207619349 1207618169 0 0 0
   16 VCL_call     c fetch
   16 VCL_return   c restart     /*由于上次返回的是404,于是restart*/
   16 VCL_call     c recv
   16 VCL_return   c lookup
   16 VCL_call     c hash
   16 VCL_return   c hash
   16 VCL_call     c miss
   16 VCL_return   c fetch
   17 BackendClose   backend2    /*这次是到后端2去取的*/
   17 BackendOpen  b backend2 xxx.xxx.xxx.xxx 54163 xxx.xxx.xxx.xxx 8080
   17 TxRequest    b GET
   17 TxURL        b /images/toolbar1.gif
   17 TxProtocol   b HTTP/1.1
   17 TxHeader     b Host: xxx.xxx.com
   17 TxHeader     b X-Real-IP: xxx.xxx.xxx.70
   17 TxHeader     b X-Forwarded-For: xxx.xxx.xxx.70
   17 TxHeader     b Accept: */*
   17 TxHeader     b Referer:
http://xxx.xxx.com/index.php
   17 TxHeader     b Accept-Language: zh-cn
   17 TxHeader     b Accept-Encoding: gzip, deflate
   17 TxHeader     b User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; QQDownload 1.7)
   17 TxHeader     b Cookie: xxxxxxxxxxxxxxxxxxxxxxxxxxx
   17 TxHeader     b X-Varnish: 485739665
   17 TxHeader     b X-Forwarded-for: 127.0.0.1
   17 RxProtocol   b HTTP/1.1
   17 RxStatus     b 404    /*还是没有取到*/
   17 RxResponse   b Not Found
   17 RxHeader     b Date: Tue, 08 Apr 2008 01:29:29 GMT
   17 RxHeader     b Server: Apache/2.2.2 (Unix) xxxxxxxxxxxxxxx
   17 RxHeader     b Content-Length: 404
   17 RxHeader     b Content-Type: text/html; charset=iso-8859-1
   16 ObjProtocol  c HTTP/1.1
   16 ObjStatus    c 404
   16 ObjResponse  c Not Found
   16 ObjHeader    c Date: Tue, 08 Apr 2008 01:29:29 GMT
   16 ObjHeader    c Server: Apache/2.2.2 (Unix) xxxxxxxxxxxxxxxxxxxxxxxxxxx
   16 ObjHeader    c Content-Type: text/html; charset=iso-8859-1
   17 BackendReuse b backend1
   16 TTL          c 485739665 RFC 518400 1207619349 1207618169 0 0 0
   16 VCL_call     c fetch
   16 VCL_return   c pass   
   16 Length       c 404
   16 VCL_call     c deliver
   16 VCL_return   c deliver

由于是实际日志,上面摘取的部分修改了一些信息。


你可能感兴趣的:(varnish后端的备份)