varnish基础概念详解
比起squid更加轻量级,大致有以下几个特点:
·可以基于内存缓存,也可以在磁盘上缓存,但是就算存放在磁盘上,也不能实现持久缓存
只要进程崩溃,此前缓存统统失效,无论是在内存还是在磁盘,但是现在已经具备持久缓存功能,但是仍然在实验阶段,经常容易崩溃,而且最大大小不能超过1G
如果期望内存大小超过几十个G,比如图片服务器,纯粹使用内存,性能未必好,这时候可以使用磁盘进行缓存,或SSD X 2 做RAID 避免磁盘损坏,在实现随机访问上 ssd硬盘要比机械硬盘要好的多,如果必须要缓存在磁盘上还是建议使用ssd磁盘
·可以利用虚拟内存方式,IO性能会非常好
·支持设置0-60秒 精确缓存时间
·支持VCL
其配置是通过vcl编程语言来完成的
其配置需要先转换成C代码,所以使用vcl所写的配置,要先转换成C语言代码,因此要依赖于GCC 临时的编译vcl配置的,编译完之后才能运行起来
·独特的日志存储及管理机制
日志既然保存在内存中,日志可以供多个应用程序所访问,所以一般查看命中率,当前请求有多少get post 方法等等,都需使用专用的工具才可以查看,比如varnishshtopvarnishlog 等命令工具用来查看日志信息
·支持使用varnish状态引擎
通过巧妙的状态引擎的设计完成不同的引擎对用户的请求和缓存代理机制进行处理,用配置文件为状态引擎提供状态法则,完成缓存处理、完成代理处理等等
·堆文件(缓存文件管理机制)非常独特,使用的二叉树来实现缓存对象管理,因此可以达到积极删除缓存管理
缓存服务器Varnish概念篇
CentOS 5.8下Varnish-2.1.5的安装配置
RedHat脚本改用CentOS源更新安装Nginx、PHP 5.3、Varnish
Linux下Varnish缓存的配置优化
varnish工作机制
varnish启动后会生成主控进程Management,可以理解为nginx的master进程
它并不负责真正代理并构建响应的而是由各子进程child/cache来完成的
主进程主要负责:
提供了以下接口:
CLI interface
Telnet Interface
Web Interface
因此我们通常都是用CLI接口
通过此接口可以与进程进行实时的交互
而主控进程通常负责以下操作:
·通过命令行接口与命令行的控制指令进行交互
·管理各个子进程,确保每个子进程都能正常工作,如果某个子进程挂掉,则自动让其启动起来
·完成整个varnish的初始化,能够完成基于vcl的编译器去编译VCL的配置文件,并且检测vcl配置文件是否存在语法错误的,如果有语法错误则拒绝编译,因此对于配置文件的分析和启用是由主进程所去实现的,这样能够避免子进程加载错误配置从而导致缓存崩溃
编译好之后生成共享模块,可以供需要这些模块的子进程所使用
子进程主要负责内容有:
·子进程需要生成日志的,因为用户的请求以及自身构建的响应都是由子进程负责的,所以需要生成日志,日志是需要存放在指定日志文件中,日志文件实际是一段共享内存区域
这些内存共享区域需要一些专门观测的工具来观测服务器的工作状态的
·使用命令行接口与CLI命令行进行交互
·用来实现将可以缓存的数据缓存下来,并且构建数据hash表
·生成日志和状态
·接收用户的请求并构建响应
·与各后端cache进行响应
·woker threads 真正意义上接收用户请求并构建响应的内部的工作线程
·缓存失效功能管理
因此varnish也是master/slave的架构
对varnish而言,在命令行接口里,可以极大的控制子进程的特性的,比如线程池最大可以启动多少个工作线程等
所以工作线程数x每个线程池的数 = 能够接收多少用户请求数
所以这些都是可以设定的,这些设定完成可以命令行接口进行交互设定
vcl的配置主要跟子进程内部的状态引擎有关系,也就是说子进程的工作方式如下:
当一个用户的请求到达之后,要解码整个用户的请求(查看请求的方式是get还是post等)
如果是GET方法,这里肯定有缓存,因此是否需要先查缓存,都是需要对其控制的
如果缓存命中或未命中,如果命中则在缓存中取,如果未命中则直接去上游服务器取数据,取得数据是否缓存,那都取决于缓存机制
如果上游服务器告知可以缓存则缓存在本地,如果告知不可缓存则不缓存,比如跟cookie或日志相关的数据肯定不能缓存
所以这些机制都需要做监测的
例: