企业CDN缓存系统Varnish——搭建最基本varnish系统

上一篇介绍了CDN网络构建方式,其服务的实现基于缓存服务器,最常用的(缓存服务器)加速方式为Varnish。所有,本篇我们介绍Varnish并进行系统搭建。

一、什么是Varnish

1.Varnish是一个反向HTTP代理,有时称为HTTP加速器或web加速器。
2. Varnish将文件或文件片段存储在内存中,使它们能够快速被提供。
3.Varnish本质上是一个键/值存储,它通常使用URL作为键。
4.varnish是工作在用户层(应用层–>HTTP协议所在的层)

二、varnish代理服务器的两种工作方式
(1)仅作为 代理服务器:帮客户端去问服务端要数据,要回来的数据直接给客户端自己不缓存一份,这种情况是客户的隐私信息、热点信息、更新比较快的数据,不缓存,只代理。
(2)既代理又缓存:帮客户端去问服务端要数据,要回来的数据先给自己缓存一份,然后再发给客户端,这种情况是用于更新比较慢的数据,此时varnish既代理又缓存。
三、Varnish缓存应用
使用缓存有两个前提条件:

  • 一是数据访问热点不均衡,某些数据会被更频繁的访问,这些数据应该放在缓存中;
  • 二是数据在某个时间段有效,不会很快过期,否则缓存的数据就会因已经失效而产生脏读,影响结果的正确性。

网站应用中,缓存除了可以加快数据访问速度,还可以减轻松后端应用和数据存储的负载压力,这一点对网站数据库架构至关重要,网站数据库库几乎都是按照有缓存的前提进行负载能力设计的。
四、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缓存在内存中重启都会释放的问题;
五、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程序去控制。

六、搭建Varnish缓存加速器
实验环境:
准备一台真机做测试端
使用上个实验封装的7.3版本的母盘快照两台虚拟机serever1和server2
server1 搭建varnish系统
server2 做后台主机
配置初始环境:
server1:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
server2:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在虚拟机server1上搭建varnish系统:

步骤一:安装varnish及依赖项

yum install jemalloc-3.6.0-1.el7.x86_64.rpm varnish-4.0.5-1.el7.x86_64.rpm  varnish-libs-4.0.5-1.el7.x86_64.rpm -y 

在这里插入图片描述
步骤二:查看varnish配置文件及版本

rpm -qc varnish # 查看varnish服务的配置文件
rpm -qa | grep varnish # 查看varnish版本

在这里插入图片描述在这里插入图片描述
步骤三:查看varnish服务启动脚本,里面有一些最基本的参数:varnish的内存大小和缓存的文件数目

由于Linux是多用户和多任务的系统,所以默认对每个用户分配的资源是固定的;而varnish的运行也是以varnish的用户身份来运行,所以也会受到系统的限制。

vim /lib/systemd/system/varnish.service #查看varnish服务启动脚本
ulimit  -a #查看内核限制参数

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
步骤四:修改系统参数,满足varnish服务所需打开文件个数及运行内存空间
永久修改:
由于值针对varnish用户,不希望针对所有的用户,所以在配置文件中对varnish用户进行配置!

vim /etc/security/limits.conf	#修改系统参数
varnish         -       nofile          131072  #varnish用户最大开启文件个数 
varnish         -       memlock         82000 #运行varnish时内存允许其占用82M内存空间
varnish         -       nproc        unlimited  #varnish用户开启进程数不受限制

在这里插入图片描述临时修改:
对于全局而言:
在这里插入图片描述步骤五:配置服务开启端口为80端口,客户可通过httpd服务访问到

vim  /etc/varnish/varnish.params 

在这里插入图片描述
步骤六:配置一个后端服务器

vim /etc/varnish/default.vcl #编辑varnish核心配置文件
	backend default {
  	.host = "172.25.76.2";	##配置后端realserver
  	.port = "80";
	}

在这里插入图片描述步骤七:重启varnish服务,查看生成的默认用户及80端口是否开启

systemctl restart varnish
netstat -antpl
id varnish  

在这里插入图片描述
在这里插入图片描述在server2上搭建后端服务:

yum install httpd -y
cd /var/www/html
vim index.html
systemctl start httpd

在这里插入图片描述
在这里插入图片描述真机测试:
在这里插入图片描述
七、验证varnish缓存命中功能
此实验在上边实验基础上进行
在varnish系统上(server1虚拟机):
步骤一:设置缓存命中提醒

 vim /etc/varnish/default.vcl #编辑varnish核心配置文件
 systemctl restart varnish

在这里插入图片描述
步骤二:清除varnish缓存
在这里插入图片描述在测试端(真机):
在这里插入图片描述八、手动清除缓存

varnishadm ban req.url "~" /  #清除所有
varnishadm ban req.url "~" /index.html  #清除index.html页面缓存

清除所有命令上面已讲
下面讲一下除index.html页面缓存
在varnish系统上(server1虚拟机):
在这里插入图片描述
在测试端(真机):
在这里插入图片描述

发布了170 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/CapejasmineY/article/details/102490422
今日推荐