前面我们介绍了缓存技术,但是对于单纯的使用缓存技术是不够的,还需要掌握一下对于提高网站的性能、减轻因为大量访问而给后台应用带来巨大压力的应用技术,也就是缓存技术。
首先说一下什么是缓存吧,缓存一般也就是成为cache,系统的缓存和硬件设备的缓存作用一样,用来暂时存放需要处理的数据,因为我们知道,从缓存读取的速度要远远高于从硬盘读取的速度,所以缓存服务器存储的数据越多,后台应用服务器的压力就越小,性能也就会越高。
而网站缓存的目的就是为了提高网站的性能,加快访问速度,合理的缓存某种类型的数据,可以减轻系统的负载。由于操作内存中的数据会比操作硬盘上的数据要快得多,这也就是目前网站加速所使用的最主要的方式。如果使用代理或者缓存服务器来实现,网站在不需要做任何改动的情况下,就可以有很明显的加速效果。
缓存的基本方式就是将制定的网页元素周期性的缓存起来,缓存的时间可以从几秒到几天不等,在缓存时间内,页面只需要生成一次,然后每当有用户访问这个页面的时候,网站服务器和数据库就不需要重新生成相同的页面了,这就大大地减少了网站服务器和数据库的负担。
假设一个热点页面一小时被访问10000次,如果这个页面每次被访问都会通过读取后台数据库并且再一遍遍地编译生成的页面,那么一个小时内就需要重复生成一万次页面,效率是相当低的。如果这个页面被周期性的缓存十分钟,也就是每十分钟生成一次,那么一个小时内只需要生成六次。这两种方式哪个效率高,哪个效率低,是不是一目了然呢?
目前网站缓存主要有两种方式,第一种就是内存缓存,数据存放在服务器的内存空间中,这种模式的效率最高,但是我们不能盲目的把所有数据都加载到内存中,毕竟服务器的资源也是有限的。另一种就是文件缓存,数据通常是存放在服务器的硬盘空间中的,可以存放多种格式类型的文件,比如txt、css、js、jpg等等,但是需要注意的是,服务器IO的处理能力是有限的,当一次性读取过大的数据时,效率就会大打折扣。这就需要一种合理的文件结构来解决这样的问题。
下面我们介绍一下Squid把,它是一种高性能的缓存服务器,支持FTP、HTTP等协议,而且Squid是用单独的、非模块的、IO驱动进程来处理所有的客户端请求。Squid将数据元素缓存在内存中,同时也缓存DNS查询的结果,Squid不仅支持非模块化的DNS查询,还对失败的请求进行消极缓存,也支持SSL和访问控制规则,由于使用了ICP(轻量级Internet缓存协议),Squid能够实现层叠的代理阵列,从而最大限度地节约宽带。
下面说一下它的工作流程吧,它由一个主要的服务程序Squid,一个DNS查询程序、几个重写请求和执行认证的程序。Squid启动后,可以派生出预先制定数目的DNSServer进程,每一个DNSServer进程都可以单独的DNS查询,这样一来就大大减少了服务器等待DNS查询的时间。
Squid的代理服务器可以分为如下几种:第一种就是普通的代理服务器,标准的代理服务器被用于缓存静态的网页,当被缓存的网页第二次访问的时候,浏览器将直接从本地代理服务器获取请求数据而不用再次向后端web服务器发送请求,这样不仅节省了宽带,还提高了访问速度。要实现这种方式,比如在每一台内部主机的浏览器上明确指明服务器的IP地址和端口号。客户端上网的时候,每次都把请求发送给Squiddialing服务器处理,代理服务器根据请求确定是否连接到远程web服务器获取数据,如果本地区有目标文件,则直接将文件传递给用户即可。如果没有就先取过来一份,并且在本地保存一份,然后将文件发送给客户端浏览器。
第二种就是透明代理服务器,透明代理服务器和标准代理服务器的功能完全相同,只是代理操作对客户端的浏览器也是透明的,也就是说不需要指明代理服务器的IP和端口。透明代理服务器阻断网络通信,并且过滤出访问外部的HTTP流量。如果缓存服务器又客户端的请求信息,则缓存服务器直接将数据发送给用户,如果缓存服务器上没有客户端的请求信息,则向远程服务器发出请求,其余操作和标准的代理服务器完全相同。
第三种就是反向代理服务器了,它和前两种的原理是不同的,它的目的是降低原始web服务器的负载。反向代理服务器承担了对原始web服务器的静态页面请求,防止原始服务器负载过高。反向代理服务器位于本地web服务器和Internet之间,处理所有对web服务器的请求,如果代理服务器上有web请求的页面,则直接将内容发送给用户,如果没有则先向web服务器发出请求,取回数据,经过本地缓存之后再发给用户,这种方式降低了向web服务器的请求次数而降低了web服务器的负载。
明白了上述原理,我们还需要了解几个缓存管理的概念,Cache命中,也就是在Squid每次中期缓存中满足HTTP请求时发生,Cache命中率,也就是所有的HTTP请求中命中的比例,Cache丢失,也就是在Squid不能从缓存里满足HTTP请求时发生,发生这种现象的原因有很多:比如Squid第一次收到关于某特殊资源的请求,就会出现一个Cache丢失,第二种原因就是因为Squid会清除缓存以释放空间给新对象。
Sarg是一款Squid日志分析工具,使用html的格式,列出了每一位用户访问internt的站点信息、时间占用信息、排名、连接次数、访问量等等。
Varnish是另一款高性能的、开源的反向代理服务器和缓存服务器,其开发者也是FreeBSD的核心开发人员之一,它采用了全新的软件体系结构,和现在的硬件体系配合比较紧密。由于我们的计算机的内存除了主存之外,还包括CPU的L1级缓存、L2级缓存,甚至还会包括L3级缓存,硬盘也有缓存,而Squid的架构导致其无法做到最佳存取,但是操作系统可以做到,这部分活交给操作系统去做,这就是Varnish
Cache的设计架构。
其中很典型的一个例子就是挪威最大的在线报纸公司使用了三台Varnish服务器代替了原来的12台Squid服务器,而且性能反而更好了,足以看出Varnish的优秀之处。
那么Varnish相比Squid有什么优点呢?第一点就是稳定性更好,两者在完成相同负载的工作时,Squid服务器发生故障的几率要高于Varnish,也就是Squid需要经常重启才行。第二点就是Varnish的访问速度更快,它采用了visual page cache技术,所有缓存的数据都直接从内存读取。而Squid从硬盘读取缓存的数据,所以,Varnish在访问速度上快一些。第三点就是Varnish支持更高的并发连接,第四点就是Varnish可以通过管理端口来管理缓存,使用正则表达式就可以批量清除部分缓存,而Squid则做不到这一点。
那么Varnish的主要缺点是什么呢?第一点就是在高并发状态下,CPU和IO以及内存资源的开销都高于Squid,而且Varnish的进程一旦被挂起、崩溃或者重启,缓存的数据就会从内存中释放出来,此时给后端造成很大的压力。
总之,我个人感觉Varnish取代Squid只是一个时间问题,期待它做的更好,加油!关于它们的使用,请到时候关注我的教程吧。