varnish集群

#在前篇varnish安装与配置中,配置了一个后端服务器。

######################################
backend default {
.host = “192.168.0.12″;
.port = “8080″;
}

#现在添加一个新的backend服务器

backend test {
.host = “192.168.0.12″;
.port = “8000″;
}

#要定义特殊的url被发送到哪里

sub vcl_recv {
if (req.url ~ “^/abcd/”) {
set req.backend = test;
} else {
set req.backend = default;
}
}
#########################################

Directors

可以把多台 backends 聚合成一个组,这些组被叫做 directors。这样可以增强性能和弹力。您可以定义多个backends和多个group在同一个directors。

###################################
backend server1 {
.host = “192.168.0.12″ ;
.port = “8080″ ;
}

backend server2 {
.host = “127.0.0.1″ ;
.port = “8080″ ;
}

director myvarnish round-robin {
{ .backend = server1; }
{ .backend = server2; }
}

#但要记得在vcl_recv中设置bachend = myvarnish。

sub vcl_recv
{
if (req.http.host !~ “www\.myvarnish\.com$”)
{ error 404 “Unknown HostName!”; }
set req.backend = myvarnish;
}
##########################################

Health checks
在之前的两个后端服务器上加上健康检查。

########################################
backend server1 {
.host = “192.168.0.12″ ;
.port = “8000″ ;
.probe = {
.url = “/”;           #哪个 url需要varnish请求。
.interval = 5s;     #检查的间隔时间。
.timeout = 1 s;   #等待多长时间探针超时。
.window = 5;      #维持5个sliding window的结果。
.threshold = 3;   #至少有三次window是成功的,就宣告bachend健康。
}
}

backend server2 {
.host = “127.0.0.1″ ;
.port = “8080″ ;
.probe = {
.url = “/”;
.interval = 5s;
.timeout = 1 s;
.window = 5;
.threshold = 3;
}
}
############################################
以上红色部分为Health checks配置。如果一个backend down掉了,varnish将不会发送流量给这个后端。

grace mode

如果后端需要很长时间来生成一个对象,这里有一个线程堆积的风险。为了避免这 种情况,你可以使用 Grace。他可以让 varnish 提供一个存在的版本,然后从后端生成新 的目标版本。
当同时有多个请求过来的时候,varnish只发送一个请求到后端服务器,在“set beresp.grace = 30m; ”时间内复制旧的请求结果给客户端。

vcl_fetch

如果您的服务每秒有数千万的点击率,那么这个队列是庞大的,没有用户喜欢等待服务器响应。为了使用过期的 cache 给用户提供服务,我们需要增加他们的 TTL,保存所有cache 中的内容在 TTL过期以后30 分钟内不删除,使用以下VCL:

sub vcl_fetch {
set beresp.grace = 30m;
}

vcl_recv

Varnish 还不会使用过期的目标给用户提供服务,所以我们需要配置以下代码,在cache过期后的15 秒内,使用旧的内容提供服务:

sub vcl_recv {
set req.grace = 15s;
}
为什么要多保存过去的内容 30 分钟?当然,如果你使用了健康检查,你可以通过健康状态设置保存的时间:

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

posted on 2012-09-19 01:00  晓风残梦  阅读(2485)  评论(0编辑  收藏  举报

导航