vainish加速器实现多个web后端服务器间的负载均衡
- 实际上企业当中的web后端服务器(为客户端提供资源的服务器)的性能有好有坏,性能差一点的就让它少干一点活,性能好的就多分担一点,现在假设就是server2这个web服务器性能比较差,server3这个服务器性能比较好,客户端通过varnish加速器访问server2的时候去轮询server3,实际上, 在企业中server2和server3上面存放的资源一模一样,只是为了实验效果明显起见,写为www.ranran.org和bbs.ranran.org。当客户端第一次访问server2的时候varnish去问server2要资源,当客户端第二次访问server2的时候varnish去问server3要资源,这个时候server2和server3上面的资源一模一样,客户端根本察觉不到,也缓解了server2(性能差)的访问压力。
- 这个思想就是在server2和server3之间实现调度(负载均衡),这个调度就是在varnish这个加速器上面实现的,实现负载均衡的调度算法很多,为了实验效果明显起见,我们使用轮询的方式均衡。
- 负载均衡的目的:就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,减轻服务器的压力,加快响应速度,保证:即使有一台服务机宕机,也能正常提供服务!
1、在 server1(ip:172.25.70.1)—varnish服务器 上,编辑 varnish核心配置文件/etc/varnish/default.vcl
- vcl4.0以后定义负载均衡需要导入模块:/usr/lib64/varnish/vmods/libvmod_directors.so
#vcl4.0以后定义负载均衡需要导入模块,一定要加在正确的位置,不能加在文件的最开头,要加在vcl4.0;下面
import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so";
#定义负载均衡,加在backend web1/web2{...}之后
sub vcl_init {
new lb = directors.round_robin();
#说明:负载均衡所构成的集群,或者说lb的此套件中的负载均衡的服务器
lb.add_backend(web1);
lb.add_backend(web2);
}
#在访问web1的时候会使用负载均衡,在web1和web2之间进行轮询,在访问web2时不进行负载均衡
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend_hint = lb.backend(); ##当访问www.westos.org时,请求转到lb
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend_hint = web2;
} else {
return (synth(405));
# 405表示请求的方式不对,常见请求的方式有get、post、head、put!
# 404表示服务器响应了,但是服务器没有此资源,客户端的请求错误!
# 503表示服务器不存在,或者存在但没有开启服务!
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
2、重启服务:systemctl restart varnish
3、手动清理缓存: varnishadm ban req.url “~” /
4、此时,在 真机–客户端 上测试:curl www.ranran.org 会发现 访问web1时并没有轮询web2
- 出现此现象的原因,varnish加速器缓存了web1的资源,故 可在文件中加入return(pass),目的是不让varnish加速器缓存web服务器的资源,每次客户端请求,varnish加速器都会向web服务器要资源,如果缓存了就看不到负载均衡的效果。
5、在 server1(ip:172.25.70.1)—varnish服务器 上,编辑 varnish核心配置文件/etc/varnish/default.vcl , 重启服务:systemctl restart varnish
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend_hint = lb.b:ackend();
return (pass); ##测试时可打开此选项,不进行缓存
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend_hint = web2;
} else {
return (synth(405));
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
6、再次在 真机–客户端 上测试:curl www.ranran.org 会发现访问web1时轮询web2,访问web2时不轮询
搭建一varnish系统为具有多个资源的web后端服务器服务
背景 : 之前的web服务器中都只有一个资源, 实际在企业当中,比如百度的服务器:包括地图资源、新闻资源等等。 现在我也想实现一台主机上放多个资源,也就是给web服务器建立虚拟主机,然后结合varnish加速器。一个域名只能对应一个ip,但一个ip可以对应多个域名!
- 注意:配置某一后端服务器虚拟主机的配置和配置多个后端服务器的区别:
配置某一后端服务器虚拟主机 :将varnish服务器映射到同一后端服务器的不同IP,访问的其实还是同一台后端服务器(物理服务器)!
配置不同的后端服务器:将varnish服务器的的IP映射不同的域名,进而varnish根据访问的域名不同来访问不同的后端服务器!
1、在 server3(ip为172.25.70.3)web服务器上搭建apache虚拟主机
2、在 真机 上面进行测试
curl www.ranran.org(有两个资源)
- 因为真机的解析文件里面写的是server1的ip对应web1服务器的域名,故会去找web1服务器要东西,此时的web1服务器(server2)的资源一个是www.westos.org,一个是www(这个是轮询找的web2(server3)上面的资源)
curl bbs.westos.org
- 直接找到web2上面的bbs.westos.org, 可以清楚的看到,web2上有两个资源,一个是www,一个是bbs,www 可以和web1轮询,web2的bbs只用于web2。