CDN加速的实现(一)varnish--部署单个后端服务器,查看缓存命中情况,清除缓存

1.概念讲解

(一)CDN相关介绍
1.CDN:CDN的全称是(Content Delivery Network),即内容分发网络。基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时的根据网络流量和各节点的连接,负载状况以及到用户的举例和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上其目的是使用户可以就近取得所需内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度.CDN代表了一种基于网络而构建的高质量、高效率、具有鲜明网络秩序的网络应用服务模式。
2.CDN的服务模式:简单地说,内容分发网络(CDN)是一个经策略性部署的整体系统,包括分布式存储、负载均衡、网络请求的重定向和内容管理 4个要件,而内容管理和全局的网络流量管理(Traffic Management)是CDN的核心所在。通过用户就近性和服务器负载的判断,CDN确保内容以一种极为高效的方式为用户的请求提供服务
总的来说,内容服务基于缓存服务器,也称作代理缓存(Surrogate) ,它位于网络的边缘,距用户仅有"一跳"(Single Hop)之遥。同时,代理缓存是内容提供商源服务器(通常位于CDN服务提供商的数据中心)的一个透明镜像。这样的架构使得CDN服务提供商能够代表他们客户,即内容供应商,向最终用户提供尽可能好的体验,而这些用户是不能容忍请求响应时间有任何延迟的。
3.CDN通俗解释:CDN的通俗理解就是网站加速,可以解决跨运营商,跨地区,服务器负载能力过低,带宽过少等带来的网站打开速度慢等问题。
比如:

  • 1.一个企业的网站服务器在北京,运营商是电信,在广东的联通用户访问企业网站时,因为跨地区,跨运营商的原因,网站打开速度就会比北京当地的电信客户访问速度慢很多,很容易造成这个企业的客户流失
  • 2.一个网站的服务器性能比较差,承载能力有限,有时面临突发流量,招架不住,直接导致服务器崩溃,网站打不开,尤其是电商网站在节日期间,因为这种情况网站打不开,销售额白白流失的占比都高涨至60%
  • 3.再比如一些中小企业租用的虚拟主机,因为跟好几个网站共用一台服务器,每个网站所分带宽有限,带宽过小经常导致流量稍微一多,网站打开速度就很慢,甚至打不开

4.使用CDN的好处?

  1. 不用担心自己网站访客,在任何时间,任何地点,任何网络运营商,都能快速打开网站。
  2. 各种服务器虚拟主机带宽等采购成本,包括后期运维成本都会大大减少。
  3. 给网站直接带来的好处就是:流量,咨询量,客户量,成单量,都会得到大幅度提升。

5.CDN的工作原理
在描述CDN的实现原理,让我们先看传统的未加缓存服务的访问过程,以便了解CDN缓存访问方式与未加缓存访问方式的差别:
用户访问未使用CDN缓存网站的过程为:
1)、用户向浏览器提供要访问的域名;
2)、浏览器调用域名解析函数库对域名进行解析,以得到此域名对应的IP地址;
3)、浏览器使用所得到的IP地址,域名的服务主机发出数据访问请求;
4)、浏览器根据域名主机返回的数据显示网页的内容。
通过以上四个步骤,浏览器完成从用户处接收用户要访问的域名到从域名服务主机处获取数据的整个过程。 CDN网络是在用户和服务器之间增加Cache层,如何将用户的请求引导到Cache上获得源服务器的数据,主要是通过接管DNS实现,
下面让我们看看访问使用CDN缓存后的网站的访问过程:
1)、用户向浏览器提供要访问的域名;
2)、浏览器调用域名解析库对域名进行解析,由于CDN对域名解析过程进行了调整,所以解析函数库一般得到的是该域名对应的CNAME记录,为了得到实际IP地址,浏览器需要再次对获得的CNAME域名进行解析以得到实际的IP地址;在此过程中,使用的全局负载均衡DNS解析,如根据地理位置信息解析对应的IP地址,使得用户能就近访问。
3)、此次解析得到CDN缓存服务器的IP地址,浏览器在得到实际的IP地址以后,向缓存服务器发出访问请求;
4)、缓存服务器根据浏览器提供的要访问的域名,通过Cache内部专用DNS解析得到此域名的实际IP地址,再由缓存服务器向此实际IP地址提交访问请求;
5)、缓存服务器从实际IP地址得得到内容以后,一方面在本地进行保存,以备以后使用,二方面把获取的数据返回给客户端,完成数据服务过程;
6)、客户端得到由缓存服务器返回的数据以后显示出来并完成整个浏览的数据请求过程。
通过以上的分析我们可以得到,为了实现既要对普通用户透明(即加入缓存以后用户客户端无需进行任何设置,直接使用被加速网站原有的域名即可访问),又要在为指定的网站提供加速服务的同时降低对ICP的影响,只要修改整个访问过程中的域名解析部分,以实现透明的加速服务,下面是CDN网络实现的具体操作过程。
1)、作为ICP,只需要把域名解释权交给CDN运营商,其他方面不需要进行任何的修改;操作时,ICP修改自己域名的解析记录,一般用cname方式指向CDN网络Cache服务器的地址。
2)、作为CDN运营商,首先需要为ICP的域名提供公开的解析,为了实现sortlist,一般是把ICP的域名解释结果指向一个CNAME记录;
3)、当需要进行sorlist时,CDN运营商可以利用DNS对CNAME指向的域名解析过程进行特殊处理,使DNS服务器在接收到客户端请求时可以根据客户端的IP地址,返回相同域名的不同IP地址;
4)、由于从cname获得的IP地址,并且带有hostname信息,请求到达Cache之后,Cache必须知道源服务器的IP地址,所以在CDN运营商内部维护一个内部DNS服务器,用于解释用户所访问的域名的真实IP地址;
5)、在维护内部DNS服务器时,还需要维护一台授权服务器,控制哪些域名可以进行缓存,而哪些又不进行缓存,以免发生开放代理的情况。
6.CDN的应用举例它采取了分布式网络缓存结构(即国际上流行的web cache技术),通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的cache服务器内,通过DNS负载均衡的技术,判断用户来源就近访问cache服务器取得所需的内容,解决Internet网络拥塞状况,提高用户访问网站的响应速度,如同提供了多个分布在各地的加速器,以达到快速、可冗余的为多个网站加速的目的。
CDN服务最初用于确保快速可靠地分发静态内容,这些内容可以缓存,最适合在网速庞大的网络中存储和分发,该网络在几十多个国家的十几个网络中的覆盖CDN网络服务器。
由于动态内容必须通过互联网来传输,因此要提供快速的网络体验,以满足当今用户的要求,只能通过对互联网流量的独特视角来达到。必须使用先进技术来了解通过互联网的最佳路由,充分利用这些最佳路由,加速通过互联网协议的数据通讯,以改善用户的网络体验。
(二)varnish相关介绍
1.Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好。
2.Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多。在1975年时,储存媒介只有两种:内存与硬盘。但现在计算机系统的内存除了主存外,还包括了CPU内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此Squid Cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部分的工作应该交给操作系统处理,这就是 Varnish cache设计架构。相比squid,varnish更加稳定,且效率更高,资源占用更少
3.squid:对于Web用户来说,Squid是一个高性能的代理缓存服务器,可以加快内部网浏览Internet的速度,提高客户机的访问命中率。Squid不仅支持HTTP协议,还支持FTP、gopher、SSL和WAIS等协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。Squid对硬件的要求是内存一定要大,不应小于128M,硬盘转速越快越好,最好使用服务器专用SCSI硬盘,处理器要求不高,400MH以上即可。
4.Varnish和SquidVarnish是高性能开源的反向代理服务器和HTTP缓存服务器,Varnish的功能与Squid服务器相似,都可以用来做HTTP缓存。Squid是从硬盘读取缓存的数据,而Varnish把数据存放在内存中,直接从读取内存,避免了频繁在内存、磁盘中交换文件,所以Varnish要相对更高效,但也有缺点,内存中的缓存在服务器重启后会丢失
5.Varnish 如何工作:初始化进程,Varnish 的master进程负责启动工作,master进程读取配置文件,根据指定的空间大小(例如管理员分配了2G内存)来创建存储空间,创建并管理child进程,child进程来处理后续任务,它会分配一些线程来执行不同的工作,例如接受http请求为缓存对象分配存储空间,清除过期缓存对象,释放空间 碎片整理
<1>http请求处理过程
有一个专门负责接收http请求的线程,一直监听请求端口,当有请求过来时,负责唤起一个工作线程来处理请求,工作线程会分析http请求的uri,知道了这个请求想要什么,就到缓存中查找是否有这个对象,如果有,就把缓存对象直接返回给用户,如果没有,会把请求转给后端服务器处理,并等待结果,工作线程从后端得到结果内容后,先把内容作为一个缓存对象保存到缓存空间(以备下次请求这个对象时快速响应),然后再把内容返回给用户
<2>分配缓存过程
有一个对象需要缓存时,根据这个对象的大小,到空闲缓存区中查找大小最适合的空闲块,找到后就把这个对象放进去如果这个对象没有填满这个空闲块,就把剩余的空间做为一个新的空闲块如果空闲缓存区中没地方了,就要先删除一部分缓存来腾出地方,删除是根据最近最少使用原则
<3>释放缓存过程
有一个线程来负责缓存的释放工作,他定期检查缓存中所有对象的生存周期,如果某个对象在指定的时间段内没有被访问,就把这个对象删除,释放其占用的缓存空间,释放空间后,检查一下临近的内存空间是否是空闲的,如果是,就整合为一个更大的空闲块,实现空间碎片的整理
6.Varnish的工作原理:处理过程大致分为如下几个步骤:

  • Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或 Pipe,或者进入 Lookup(本地查询)。
  • Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进入 miss 状态。
  • Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
  • Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地的存储。
  • Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。
    (三)缓存
    1.缓存是放在内存中,内存的读取速度大于硬盘
    2.缓存的都是经常访问的(热点数据),且大小不是很大的
    3.为了高性能,不可能无限扩大内存
    4.必须降低数据库的压力,否则服务器可能瘫痪

2.部署单个后端服务器的varnish过程

实验环境:

主机 用途
server1:172.25.66.1 varnish服务器
server2:172.25.66.2 后端服务器
物理机:172.25.254.21 客户端,测试端

<1>从物理机中传入已经下载好的varnish安装包(事前已经在官网中下载)
在这里插入图片描述
<2>在快照vm1中安装varnish安装包
在这里插入图片描述
<3>查看varnish的配置文件,其中第二个是对系统配置的要求

[root@server1 ~]# cd anzhuang/
[root@server1 anzhuang]# rpm -qc varnish-3.0.5-1.el6.x86_64 

在这里插入图片描述
<4>进入系统配置的要求

[root@server1 anzhuang]# vim /etc/sysconfig//varnish

在这里插入图片描述
文件中的部分内容下:
其中NFILES=131072表示最大打开的文件数是131072个
MEMLOCK=82000表示内存锁定是82M,也即最多能使用的内存空间是82M(以kb为单位)
NPROCS="unlimited"表示单个用户能运行的最大线程数是不限制的

在这里插入图片描述
<5>查看文件数,发现文件的上限是98864个,会发现varnish的配置文件的最大打开的文件数与文件的上限相匹配

[root@server1 anzhuang]# sysctl -a | grep file

在这里插入图片描述
<6>这里有两个方法可以使其配置文件的最大打开的文件数与文件的上限相匹配,其一是把配置文件中的最大打开文件数更改小一点,其二是增加内存,这里我们将增加内存的大小
首先使其关闭

[root@server1 anzhuang]# poweroff

在这里插入图片描述
开启虚拟机管理器并进入硬件修改配置中,将内存的大小变为2048M,并重新开启快照vm1
在这里插入图片描述
再次查看文件的上限,发现其已经变大,varnish的配置文件的最大打开的文件数与文件的上限相匹配(文件的打开数一定要小于文件数)

[kiosk@foundation66 Desktop]$ ssh [email protected]
[root@server1 ~]# sysctl -a | grep file

在这里插入图片描述
<7>进入varnish的配置文件中修改端口为80,即真实接收请求的是反向代理和缓存

[root@server1 ~]# vim /etc/sysconfig/varnish

在这里插入图片描述
更改的内容如下:

VARNISH_LISTEN_PORT=80

在这里插入图片描述
<8>查看系统允许的内存锁定,发现系统只允许64M,所以需要修改参数

[root@server1 ~]# ulimit -l

在这里插入图片描述
<9>进入/etc/security/limits.conf文件,修改varnish用户的限制文件,修改以下配置,使其系统配置与varnish配置相匹配

[root@server1 ~]# cd /etc/security/
[root@server1 security]# ls
[root@server1 security]# vim limits.conf

在这里插入图片描述
文件中新增加的内容如下(其中第一行表示的含义为-用户-有硬件有软件-没有文件-最大打开文件数,第二行表示最大的内存锁定,第三行表示线程数没限制):

varnish         -       nofile          131072
varnish         -       memlock         82000
varnish         -       nproc           unlimited

在这里插入图片描述
注意:
因为varnish这个程序运行在varnish这个用户的私有空间内,内核对普通用户限制的最大文件数为98864,对varnish用户限制的最大文件数为131072,所以我们需要满足这个最大值

<10>进入/etc/varnish/default.vcl中,对varnish进行配置,使其可以作为快照vm2的反向代理

[root@server1 ~]# cd /etc/varnish/
[root@server1 varnish]# ls
[root@server1 varnish]# vim default.vcl 

在这里插入图片描述
更改的内容如下(将ip更改为快照vm2的ip):

backend default {
  .host = "172.25.66.2";
  .port = "80";
}

在这里插入图片描述
<11>开启varnish服务

[root@server1 varnish]# /etc/init.d/varnish start

在这里插入图片描述
<12>查看varnish的端口是否设置成80

[root@server1 varnish]# netstat -tnlp

在这里插入图片描述
<13>在快照vm2中下载httpd,并在共享目录下写入内容并开启服务

[root@server2 ~]# yum install httpd -y
[root@server2 ~]# vim /var/www/html/index.html
[root@server2 ~]# cat /var/www/html/index.html
[root@server2 ~]# /etc/init.d/httpd start

在这里插入图片描述
在这里插入图片描述
<14>测试,在同一网段的任意主机中访问172.25.66.2和172.25.66.1,发现都可以访问成功,说明设置反向代理成功
在这里插入图片描述

分析:
1.server1:反向代理+缓存
2.server2的入口只有server1
3.最多能打开的文件数,varnish会自动调整
4.锁定空间也即最多能使用的内存空间,varnish也会自动调整
5.URL:通过URL解析请求,URL->查询缓存->新鲜度检测->发送响应->记录到日志
6.缓存对象:生命周期(时间),自动更新,会定期清理
7.LRU(最近最少使用)
8.hit命中率,表明读取率很高 hit/(hit+miss),从内存中读取
9.调度器,相当于一个客户端
10.vanish启动时,会自动建立一个vanish用户

补充:
1.通过查看/etc/passwd中的文件,会发现在安装varnish后,便会自动建立一个varnish用户

[root@server1 security]# tail -n 3 /etc/passwd

在这里插入图片描述
2.关于varinsh线程的详细讲解
<1>通过ps命令查看varish的进程,可以发现root用户管理的是matser进程,不接受请求,监控子进程,而varish用户管理的是worker进程

[root@server1 varnish]# ps aux

在这里插入图片描述
也可以通过以下命令查看varish的进程

[root@server1 varnish]# ps ax | grep varnish

在这里插入图片描述
<2>查看root用户下的进程(Threads),发现是1个,用来监控

[root@server1 varnish]# cat /proc/1037/status

在这里插入图片描述
<3>查看varnish用户下的进程(Threads),发现是109个,用来工作

[root@server1 varnish]# cat /proc/1038/status

在这里插入图片描述

注意:
进程是封闭的(apache),线程是开放的(内存是交叉使用的,内存如果突然间不用了,那么别人会用,如果某个线程挂了,所有的就都挂了)

3.查看缓存命中情况

<1>在server1进入varnish配置文件,在其文件中增加模块,以便于查看缓存命中情况

[root@server1 ~]# cd /etc/varnish/
[root@server1 varnish]# ls
[root@server1 varnish]# vim default.vcl 

在这里插入图片描述
配置文件内容如下:

##配置单个后端服务器
backend default {
  .host = "172.25.66.2";
  .port = "80";
}
##查看缓存命中情况
sub vcl_deliver {
if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT from westos cache";
}
else {
 set resp.http.X-Cache = "MISS from westos cache";
 }
 return (deliver);
}

在这里插入图片描述
<2>进入/etc/sysconfig/varnish,可以查看线程的延迟为120s(即查找到缓存后,直到系统自动清除缓存的时间为120s)

[root@server1 varnish]# vim /etc/sysconfig/varnish 

在这里插入图片描述
查看的内容如下:

VARNISH_THREAD_TIMEOUT=120

在这里插入图片描述
<3>在物理机上访问server1(注意,要开启后端服务器server2的httpd),会发现没有缓存时是X-Cache: MISS from westos cache,访问过一次缓存保存后,再次访问时会显示击中X-Cache: HIT from westos cache,说明缓存命中

[root@foundation66 ~]# curl -I 172.25.66.1
[root@foundation66 ~]# curl -I 172.25.66.1
[root@foundation66 ~]# curl -I 172.25.66.1

在这里插入图片描述
注意:
1.如果重新开启varnish服务器以及后端服务器,需注意是否开启服务(httpd和varnish)
2.访问过程中的age代表过了几秒

4.清除缓存

1.清除所有缓存
<1>首先在物理机上访问server1,使其缓存存在(缓存存在的标志是X-Cache为HIT)

[root@foundation66 ~]# curl -I 172.25.66.1

在这里插入图片描述
<2>在server1中清除缓存

[root@server1 varnish]# varnishadm ban.url .*$

在这里插入图片描述
<3>再次在物理机上访问server1,会发现缓存被清除(即显示MISS)

[root@foundation66 ~]# curl -I 172.25.66.1

在这里插入图片描述
2.清除网页index.html中的缓存
<1>首先在物理机上访问server1的网页index.html,使其缓存存在,并访问server1上的所有缓存形成对比

[root@foundation66 ~]# curl -I 172.25.66.1
[root@foundation66 ~]# curl -I 172.25.66.1/index.html

在这里插入图片描述
<2>在server1中清除网页index.html的缓存

[root@server1 varnish]# varnishadm ban.url /index.html

在这里插入图片描述
<3>再次在物理机中访问server1的所有缓存和网页index.html,发现网页index.html中已经没有缓存了,而访问server1还有缓存,说明只清除了网页的缓存

[root@foundation66 ~]# curl -I 172.25.66.1
[root@foundation66 ~]# curl -I 172.25.66.1/index.html

在这里插入图片描述
注意:
清除目录和清除文件的缓存的方法一样,例如如果想要清除目录admin的缓存,输入以下命令即可[root@server1 varnish]# varnishadm ban.url /admin

猜你喜欢

转载自blog.csdn.net/qq_39376481/article/details/89304732