企业CDN缓存系统varnish 实现多个web后端服务器间的负载均衡

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。
发布了107 篇原创文章 · 获赞 0 · 访问量 1445

猜你喜欢

转载自blog.csdn.net/weixin_45029822/article/details/104430959