上一篇是varnish代理缓存服务器只有一台后端web服务器,也就是它只为一台web服务器做代理,实际企业当中这样做会造成浪费,至少是一对多的关系,因此接下来我将为大家讲解具有两台web后端的varnish系统,也就是node1代理服务器要同时为多台服务器缓存数据,node1同时为多个web服务器做代理。
1.再次明确varnish加速器的作用
varnish有两个作用:代理服务器、缓存数据
当是用户的私人数据和动态数据的时候:
varnish只是作为代理服务器去问后端服务器要东西然后给客户端,自己不会缓存(负载均衡、调度)
更新快的数据一般没有缓存
一般的数据varnish代理服务器不但要东西还要给自己缓存一份
2.为varnish加速器搭建多个web后端
开启server3,配置ip,yum源等
将node3也作为一个后端web服务器(也就是在node3上面搭建一个web服务器)
在server3搭建http服务
在node1代理服务器上面进行配置(先设置两个最基本的后端)
写入两个后端的信息
backend web1{
.host = ‘172.25.15.2’
.port = ‘80’;
}
backend web2{
.host = ‘172.25.15.3’
.port = ‘80’;
}
在请求模块当中加入两个后端服务器资源域名
重启服务
此时在真机上测试
curl www.westos.org拿到的是web1的资源、curl bbs.westos.org拿到的是web2的资源
实现了最基本的具有两台后端,但是两台后端之间没有任何关系
3.使用vainish加速器实现两个web后端服务器之间的负载均衡
实际上企业当中的web后端服务器(为客户端提供资源的服务器)的性能有好有坏
性能差一点的就让它少干一点活,性能好的就多分担一点
现在就是node2这个web服务器性能比较差,node3这个服务器性能比较好
客户端通过varnish加速器访问node2的时候去轮询node3
实际上node2和node3上面存放的资源一模一样,只是为了实验效果明显起见,写为www.westos.org和bbs.westos.org
当客户端第一次访问node2的时候varnish去问node2要资源
当客户端第二次访问node2的时候varnish去问node3要资源
这个时候node2和node3上面的资源一模一样,客户端根本察觉不到,也缓解了node2(性能差)的访问压力
客户端通过varnish加速器访问node3的时候只去找node3(性能好)
以上这个思想就是在node2和node3之间实现调度(负载均衡),这个调度就是在varnish这个加速器上面实现的
实现负载均衡的调度算法很多,为了实验效果明显起见,我们使用轮询方式的均衡(就是轮着干)
在node1(varnish加速器)上面进行配置
vim /etc/varnish/default.cvl
在上面写入:
import directors from “/usr/lib64/varnish/vmods/libvmod_directors.so”;(调度模块)
在下面写入:
sub vcl_init {
new lb = directors.round_robin();
lb.add_backend(web1);
lb.add_backend(web2);
}
表示在web1(node2)和web2(node3)之间实现负载均衡
在下面修改:
sub vcl_recv {
if (req.http.host ~ “^(www.)?westos.org”) {
set req.http.host = “www.westos.org”;
set req.backend_hint = lb.backend();访问web1的时候去轮询web2
} elsif (req.http.host ~ “^bbs.westos.org”) {
set req.backend_hint = web2;
} else { return (synth(405));
}
在访问web1的时候会使用负载均衡,在web1和web2之间进行轮询,在访问web2时不进行负载均衡
systemctl restart varnish修改完之后重启服务
然后在真机上测试,发现并没有轮询web2
是因为varnish加速器缓存了web1的资源,所以在文件中加入return(pass)目的是不让varnish加速器缓存web服务器的资源,每次客户端请求,varnish加速器都会向web服务器要资源,如果缓存了就看不到负载均衡的效果
重启服务
再次测试
发现curl web1的时候实现了轮询,,curl web2时不轮询
现在其实web1上面的资源和web2上面的资源一样
当客户通过node1代理去找node2和node3的时候
应该实现调度,负载均衡,在node1上面实现负载均衡
使找node2的资源的时候负载均衡(这里使用轮询方式),性能不好的服务器
使找node3的资源的时候不负载均衡,因为他的性能比较好