varnish 允许定义多个backend后端服务器,那么如何如何实现负载均衡呢
可以通过后端服务器控制组来管理:即定义 director 来管理
1.典型的backend配置
# 第一个backend
backend server1 {
.host = "127.0.0.1"; #web服务器或者应用服务器IP地址
.port = "80"; #web服务器或者应用服务器端口
}
# 第二个backend
backend server2 {
.host = "127.0.0.2"; #web服务器或者应用服务器IP地址
.port = "80"; #web服务器或者应用服务器端口
}
2.director定义
像这种有多个后端服务器的配置,就得挑选一种策略来管理
varnish 提供多种算法,比如循环、随机、hash路由、client路由、dns等方式
(1))round-robin 采用循环的方式依次选择backend
(2)random 根据所设置的权重(weight)来选择 backend
(3)client 根据请求的客户端属性(IP、cookie、session)来选择 backend
(4) hash 根据hash表来选择
(5))dns 根据dns解析来选择
2.1 round-robin
director server_director round-robin {
{.backend = server1;}
{.backend = server2;} #还可以继续定义
}
2.2 random
director server_director random {
.retries = 5; #表示varnish尝试找到一个 backend 的最大次数
{.backend = server1; .weight = 2;}
{.backend = server2; .weight = 1;}
}
2.3 client
生产系统一般都是集群环境,且基本都是[会话保持]也就是[sticky session]
所谓 session粘性,能保证你访问一个Url之后,在这个站点打开的其他Url,都是去访问同一个服务器
因此针对这种情况,如果varnish没找到缓存内容,那么对这个用户而言:所有请求会到一个固定的后端服务器
好处就是:如果有多层级缓存架构,那么你不用担心缓存链匹配不正确
当然session粘性的坏处大家都知道,一但那台机器挂了。。。也会指向那台机器
针对 client 的配置策略,建议去varnish官网看例子:http://mesmor.com/2012/02/15/varnish-client-director-with-sticky-session/
director server_director client {
{.backend = server1; .weight = 2;}
{.backend = server2; .weight = 1;}
}
注意:如果选用client算法,别忘了设置client的唯一标志identity,在 vcl_recv 节点配置
sub vcl_recv {
set client.identity = req.http.cookie; #或者 http.ip
# ... 其他配置
}
2.4 hash
hash表的原理和client差不多,配置也相似
director server_director hash {
{.backend = server1; .weight = 2;}
{.backend = server2; .weight = 1;}
}
2.5 dns
director server_director dns {
.list = {
.host_header = "www.xxx.com";
.port = "80";
.connect_timeout = 0.4;
"192.168.15.0"/24; # IP段 0~255
"192.168.16.128"/25;
}
.ttl = 5m; #查找缓存时间
.suffix = "xxx.com"; #主机名后缀
}
最后注意:定义好director之后,在要使用的地方先声明:比如sub_recv函数里面
sub vcl_recv {
set req.backend = server_director;
# ... 其他配置
}