一、varnish系统的基本定义及概念
1.什么是varnish?
Varnish是一款高性能的 开源web加速器,任务是 反向代理并缓存他后面的web服务器的内容,并且响应用户的请求 。 varnish加速器(代理缓存服务器)是将从服务器要回来的资源放在自己的 内存 里,客户读取的速率很快,代理的效率高。
- Varnish本质上是一个 键/值 存储,它通常使用URL作为键。
- varnish是工作在用户层(应用层–>HTTP协议所在的层)
- varnish代理服务器的 两种工作方式:
(1)仅作为 代理服务器:帮客户端去问服务端要数据,要回来的数据直接给客户端自己不缓存一份,这种情况是客户的隐私信息、热点信息、更新比较快的数据,不缓存,只代理。
(2)既代理又缓存:帮客户端去问服务端要数据,要回来的数据先给自己缓存一份,然后再发给客户端,这种情况是用于更新比较慢的数据,此时varnish既代理又缓存。 - varnish讲解
- varnish安装的问题等
2、varnish与squid的异同点
-
squid加速器(代理缓存服务器) :将从服务器要回来的资源放在自己的 硬盘 里,客户读取的速率很慢,代理的效率低。
-
squid 与 varnish的相同点:
(1)都是一个反向代理服务器
(2)都是开源软件。
-
squid 与 varnish的不同点(Varnish的优点):
(1)Varnish的稳定性很高,两者在完成相同负荷的工作时,Squid服务器发生故障的机率要高于Varnish,因为使用Squid要经常重启。
(2)Varnish访问速度更快,Varnish采用了“Visual Page Cache”技术,所有缓存数据都直接从内存读取,而squid是从硬盘读取 , 因而Varnish在访问速度方面会更快。
(3)Varnish可以支持更多的并发连接,因为Varnish的TCP连接释放要比Squid快 ,因而在高并发连接情况下可以支持更多TCP连接。
(4)Varnish可以通过管理端口,使用正则表达式批量的清除部分缓存,而Squid是做不到的。
-
Varnish 缺点:
(1)varnish在高并发状态下CPU、IO、内存等资源开销都高于Squid。
(2)varnish进程一旦Hang、Crash或者重启,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大压力。
针对缺点二的解决方案 :在访问量很大的情况下推荐使用varnish的内存缓存方式启动,而且后面需要跟多台squid/nginx服务器。主要为了防止前面的varnish服务、服务器被重启的情况下,大量请求穿透varnish,这样squid/nginx可以就担当第二层CACHE,而且也弥补了varnish缓存在内存中重启都会释放的问题;
3.为什么要有varnish加速缓存代理服务器
实例:我们国家使用微信的用户非常多,微信的服务商腾讯总部在深圳,当每个地区的用户使用微信访问腾讯服务器的资源的时候,访问量太大,对于深圳的服务器来说,会造成很大的访问压力,甚至会造成服务器瘫痪,对于每个地区的用户来数,如果都去访问腾讯的总部服务器,会造成网络拥塞,使得客户的访问很缓慢,不利于用户的使用,现在腾讯总部给每个地区都放varnish代理服务器,每个地区的微信使用用户想访问深圳资源的时候,都会间接去问自己地区的varnish代理服务器要资源。如果varnish代理服务器上面没有资源,此时varnish代理服务器就会去向深圳的服务器要资源,将要回来的资源视情况而定给自己缓存一份,然后再给客户端发一份。这种情况下,varnish代理服务器的数量远远少于微信用户的数量,即使所有的varnish代理服务器同时向深圳总部的服务器要资源的时候,也不会给深圳的服务器造成很大的压力,对微信使用的客户端和深圳总部的服务端都有好处,假如代理服务器缓存了一些更新慢的数据,当客户端再次要这个数据的时候,代理服务器会直接返回给客户端,不需要再去问深圳的服务器要资源,那么这就是把varnish服务器叫做加速器的原因,加快了客户端和服务端之间的访问速率。
- 使用varnish作为web代理缓存的原理 : varnish是一个http反向代理的缓存。它从客户端接收请求然后尝试从缓存中获取数据来响应客户端的请求,如果varnish不能从缓存中获得数据来响应客户端,它将转发请求到后端(backend servers),获取响应同时存储,最后交付给客户端。 如果varnish已经缓存了某个响应,它比你传统的后端服务器的响应要快很多,所以你需要尽可能是更多的请求直接从varnish的缓存中获取响应。 varnish决定是缓存内容或者是从后端服务器获取响应。 后端服务器能通过http响应头中的Cache-Control来同步varnish缓存内容。在某些条件下varnish将不缓存内容,最常见的是使用cookie。当一个被标记有cookie的客户端web请求,varnish默认是不缓存。 这些众多的varnish功能特点都是可以通过写vcl来改变的。
4.varnish加速器的工作流程
- Varnish与一般服务器软件类似,分为master(management)进程和child(worker,主要做cache的工作)进程。varnish启动会产生两个进程,root身份产生manger主(管理mangerment)进程,然后fork一个worker子进程(varnish身份)
- master进程作用:读入命令,进行一些初始化,然后fork并 监控child进程 。读入(更新)配置,vcl 文件编译,varnish监控,初始化 varnish 及提供 varnish 管理接口。 Management进程会每隔几秒钟探测一下Child进程以判断其是否正常运行,如果在指定的时长内未得到Child进程的回应,Management将会重启此Child进程。
- child进程作用: 主要接受请求,进行请求任务的处理,分配线程进行cache工作
- 作用机理 :
(1)child进程主线程初始化过程中,将存储的大文件整个加载到内存中,如果该文件超出系统的虚拟内存,则会减少原来配置mmap(mmap:memory mapper 内存映射)大小,然后继续加载,这时候创建并初始化空闲存储结构体,放在存储管理的struct中,等待分配。
(2)接着varnish某个负责接受新http连接的accept线程开始等待用户,如果有新的http连接,但是这个线程只负责接收,然后唤醒等待线程池中的work线程,进行请求处理。
(3)worker线程读入uri后,将会查找(从缓存中查找还是直接从后台fetch取决于VCL设置)已有的object(缓存中lookup此对象),命中(hit)直接返回,没有命中(miss)则会从后端服务器中(backend)取(fetch)出来,放到缓存中。如果缓存已满(expire),会根据LRU算法,释放旧的object。对于释放缓存,有一个超时线程会检测缓存中所有object的生命周期,如果缓存过期(ttl),则删除、释放相应的存储内存。 - 分配缓存的过程 :它根据所读到object的大小,创建相应大小的缓存文件。为了读写方便,程序会把每个object的大小变为最接近其大小的内存页面倍数。然后从现有的空闲存储结构体中查找,找到最合适的大小的空闲存储块,分配给它。如果空闲块没有用完,就把多余的内存另外组成一个空闲存储块,挂到管理结构体上。如果缓存已满,就根据LRU机制,把最旧的object释放掉。释放缓存的过程是这样的:有一个超时线程,检测缓存中所有object的生存期
如果超初设定的TTL(Time To Live)没有被访问,就删除之,并且释放相应的结构体及存储内存。注意释放时会检查该存储内存块前面或后面的空闲内存块。如果前面或后面的空闲内存和该释放内存是连续的,就将它们合并成更大一块内存。整个文件缓存的管理,没有考虑文件与内存的关系,实际上是将所有的object都考虑是在内存中。如果系统内存不足,系统会自动将其换到swap空间,而不需要varnish程序去控制。
5.什么是CDN?
- CDN:缓存网络,Content Delivery Network,即内容分发网络;加速器,反向代理缓存
- CDN加速实现:varnish
- 基本原理:广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。内容管理和全局的网络流量管理(Traffic Management)是CDN的核心所在。通过用户就近性和服务器负载的判断,CDN确保内容以一种极为高效的方式为用户的请求提供服务。总的来说,内容服务基于缓存服务器,也称作代理缓存(Surrogate),它位于网络的边缘,距用户仅有"一跳"(Single Hop)之遥。同时,代理缓存是内容提供商源服务器(通常位于CDN服务提供商的数据中心)的一个透明镜像。这样的架构使得 CDN服务提供商能够代表他们客户,即内容供应商,向最终用户提供尽可能好的体验,而这些用户是不能容忍请求响应时间有任何延迟的。
- 理解角度:从CDN的中文表义去理解:内容、分发、网络!
(1)内容
指储存在CDN节点上的动静态资源的分发和访问的数据内容,比如JS、CSS、图片和静态页面等静态资源!
客户端:用户一般从主站获取动态内容后,再从CDN下载相应的静态数据
(2)分发
就是如何让上面提到的数据内容(资源),快速的部署在这个网络中,从而快速为用户服务。
目的:通过调度让用户访问最近的资源!
(3)网络
1)是部署于者全球(国)的一大堆服务器--->集群
2)这些服务器基于当前互联网的基础架构在其上层再构成一个网络,这个网络专为资源分发而
6、CDN系统的理解
源站:指发布内容的原始站点。
操作:添加、删除、更改网站的文件,都是在源站上进行的;
明确:缓存服务器所抓取的对象也全部来自于源站
折叠:隐藏的含义,客户端并不知道折叠网站的存在,以为访问的资源站点就是源站!
缓存服务器:是直接提供给用户访问的站点资源(直接面对用户),由一台或数台服务器组成;
2)用户请求资源的过程
1)当用户发起url请求时,他的访问请求被智能DNS定位到离他较近的缓存服务器;
2)如果用户所请求的内容刚好在缓存里面,则直接把内容返还给用户;
3)如果访问所需的内容没有被缓存,则缓存服务器向邻近的缓存服务器或直接向源站直接抓取内容,然后再返还给用户。
3)智能DNS
CDN整个技术核心是智能DNS,它主要根据用户的来源,将其访问请求指向离用户比较近的缓存服务器!
举例1:把深圳电信的用户请求指向到深圳电信IDC机房中的缓存服务器。
举例2:通过智能DNS解析,让用户访问同服务商下的服务器,消除国内南北网络互相访问慢的问题,达到加速作用。