Varnish从菜鸟到专家(一)_java
Varnish从菜鸟到专家(一)

序:

本系列应该是朋友们见过的Varnish相关文章中最专业最深入最全面的文章了,毕竟小编熬了这么多夜,其实原计划一篇写完方便大家观赏,谁想微信文章字数限制最多2W字。因此也只能分系列分享给大家,在此也只能辛苦各位朋友分开阅览。当然了,机灵的朋友已经加收藏了,聪明的朋友更是添加关注公众号了,毕竟这个公众号文章的阅读率辣么高。当然了,彩蛋在最后,如果大家觉得还有所收获,请不要吝惜您的双手,大方分享,让更多的朋友受益。


本系列将依次为大家介绍

  • Varnish 简介及工作原理(本次)

  • 常见缓存工具Varnish与Squid的优缺点分析(本次)

  • Varnish 设计思想(本次)

  • Varnish 安装部署及QA技巧(本次)

  • VCL语法规则及进阶

  • Varnish请求数据流有限状态机

  • Varnish管理工具集

  • Varnishadm使用详解

  • Varnish由浅及深八大实战案例

因微信字数限制和各章节内容详略不一,因此分享章节也只能视字数而定了。

1. Varnish基础入门

Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,2005年产品原型诞生,2006年Varnish 1.0版本发布,据官网称其可使原有网站有300-1000倍的速度提升。Varnish设计之初就针对现代全新的软件体系机构,和最新硬件体系紧密配合,与传统的 squid 相比,varnish 具有性能更高、速度更快、管理更加方便等诸多优点,很多大型的网站都开始尝试使用 varnish 来替换 squid,这些都促进 varnish 迅速发展起来。

挪威的最大的在线报纸 Verdens Gang(vg.no) 使用 3 台 Varnish 代替了原来的 12 台 Squid,性能比以前更好,这是 Varnish 最成功的应用案例。

1.1 Varnish 简介及工作原理

Varnish官网地址是 http://varnish-cache.org 或https://www.varnish-cache.org ,LOGO也没有沿用业内“潜规则”使用动物,而是一个小巫师。


Varnish从菜鸟到专家(一)_java_02



Varnish当前最新的主干版本是 5.0 ,最新稳定版是4.0。就功能讲,企业中更多的应用场景是Web缓存功能,架构中通常扮演的角色如下:

Varnish从菜鸟到专家(一)_java_03

但据官网介绍,Varnish的设计不仅仅是定位于反向代理服务器,根据使用方式的不同,Varnish可扮演的角色也丰富多样,其它可实现的功能如下:

  • WEB应用防火墙;

  • DDoS攻击防护;

  • 网站防盗链;

  • 负载均衡;

  • integration point(个人没用过);

  • 单点登录网关;

  • 认证和认证授权;

  • 后端主机快速修复;

  • HTTP路由

Varnish缓存策略的实现是通过VCL(Varnish Configuration Language)实现,VCL的语法简单,继承了C语言的很多特性,使得VCL样式看起来很像C和PELR语言,VCL配置文件也是通过VCL编译为C代码后继而执行,高效与生俱来。Varnish已在各大型和轻量型应用场景中充分证明其能力。Varnish开源产品全称为Varnish Cache,同时提供功能更为强大齐全的商业套件,全称为Varnish Plus。

1.2 Varnish 设计思想

1.2.1 Varnish设计思想

Varnish的设计初衷就定义为高效和灵活,其设计原则更是面向当今流行前沿的64位服务器架构,而非15年前的老架构服务器或32位系统架构。Varnish底层使用专为高性能服务设计的epoolkqueue调度机制,借助内核的强大功能解决复杂场景。设计原则总结如下:

  • 解决企业实际问题;

  • 只运行在现代64位硬件架构体系,不支持兼容老的服务器架构;

  • 与内核协同工作;

  • 通过VCL编译生成C语言程序和内核交互;

  • 通过VMOD模块方式扩展程序;

  • 其通过工作空间为导向的内存共享机制来减少锁争夺

1.2.2 Object对象存储机制

Object对象缓存按如下规则存储:

  • HTTP响应信息缓存本地;

  • Varnish处理的对象在内存中以hash树方式存储;

  • 用户可处理和控制hash信息;

  • 多个对象可拥有相同的hash地址;

1.3 Object对象存活时间

Varnish基于内存缓存,众所周知,内存即使在现在也是非常昂贵的设备且容量有限,因此所有缓存对象均在缓存周期,过期数据或缓存策略内的数据会被清理。每个Object的生命周期分为如图4个阶段:
http://book.varnish-software.com/4.0/_images/objectlifetime.svg

Varnish从菜鸟到专家(一)_java_04

每个对象拥有1个起初时间缀和3个时间属性,分别是1) TTL, 2) grace, and 3) keep. t_origin,其中:

  • 对象缓存周期为 :t_origin->TTL->grace->keep.,之后Object将被从Varnish缓存中删除

  • 对象新鲜期为:t_origin->TTL

  • 对象陈旧期为:TTL->grace

  • If-Modified-Since属性周期为:t_origin->TTL->grace->keep

1.4 常见缓存工具Varnish与Squid的优缺点分析

介绍Varnish必然需提及缓存的开山鼻祖SquidSquid是很古老的反向代理软件,拥有传统代理、身份验证、流量管理等高级功能,但是配置太复杂。优势在于完整的庞大的cache技术资料。Squid在大规模负载均衡场景下很稳定。而相对老牌的Squid而言,Varnish是新兴的一个软件,属于后起之秀,其设计简单,工作于内存,即数据缓存在内存中,因此重启后Varnish会发生数据的问题。

  • Varnish & Squid简要对比如下:

软件存储模式性能配置复杂度purge效率共享存储
squid硬盘较高简单可以并联,但是配置复杂
varnish硬盘/内存比较简单不能
  • Varnish & Squid详细对比如下:

  • Varnish对比Squid的优点

    • varnish稳定性很高,两者在完成相同负荷的工作时,squid服务器发生故障的几率要高于varnish,因为squid要经常重启;

    • varnish访问速度更快,其采用了”Visual Page Cache”技术,所有缓存数据都直接从内存中读取,而squid是从硬盘读取,因而varnish在访问速度方面会更快;

    • varnish可支持更多并发连接,因为varnish的TCP连接释放要比squid快,因而在高并发连接情况下可以支持更多TCP连接;

    • varnish可以通过管理端口,使用正则表达式批量的清除部分缓存,而squid是做不到的;

    • squid属于单进程使用单核CPU,但Varnish是通过fork形式打开多进程来做处理,所以是合理的使用所有核来处理相应的请求;

  • Varnish对比Squid的缺点

    • varnish进程一旦Hang、Crash或者重启,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大的压力;

    • 在varnish使用中,如果单个url的请求通过HA/F5,每次请求不同的varnish服务器时,被请求的varnish服务器都会被穿透到后端,而同样的请求会在多台服务器上缓存 ,也会造成varnish的缓存资源浪费,也会造成性能下降;

2. Varnish配置进阶

了解完Varnish的功能作用,优劣势及在企业技术架构中扮演的角色后,我们接着了解Varnish工具套件。熟练掌握这些工具的功能作用及使用对于Varnish的应用很有帮助。

2.1 Varnish核心工具集介绍

  • varnishd
    varnishd是varnish的核心进程,以Daemon方式运行,接受HTTP请求,转发前端请求至后端backend,缓存返回的缓存对象并且回应请求的客户端。

  • varnishtest


  1. 验证Varnish的安装

  2. 功能强大,可自定义client请求模型或从后端真实用品拉取内容。

  3. 支持与Varnish交互性

varnishadm
Varnish实例命令行管理工具:


  1. start/stop Varnishd

  2. 更新配置文件参数

  3. 重载Varnish ConfigurationLanguage(VCL)

  4. 查看最新的参数文档

varnishlog
Varnish日志展示工具,因信息量较大往往需要事先过滤varnishlog支持精确日志匹配。

varnishstat
varnishstat可访问全局计算器,可提供全面的统计信息,如全部请求数,缓存对象的数量等。常和varnishlog结合分析Varnish的安装。

其它工具
varnishncsavarnishtopvarnishhist对Varnish的性能及状态分析均有帮助。

2.2 Varnish 安装部署及QA技巧

2.2.1 安装

  • 系统环境介绍

RolesipDetail
varnish(4.0.3)192.168.99.11180,6082
WebServer(nginx)192.168.99.11380(Varnish.html)
  • CentOS6.8 安装 Varnish 4.0

yum install epel-release
rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el6.rpm
yum install varnish gcc varnish-libs-devel-4.0.3 -y
  • CentOS7 安装 Varnish 4.0

yum install epel-release
rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el7.rpm
yum install varnish gcc varnish-libs-devel-4.0.3 -y

gcc提供Varnish编译VCL语言所需的依赖插件
varnish提供主程序包
varnish-libs提供程序相关依赖包
varnish-libs-devel-4.0.3提供二次开发所依赖的库文件

  • 安装验证

Varnish从菜鸟到专家(一)_java_05

  • 目录架构详解(主要)

[root@stanley-6 ~]# rpm -ql varnish
/etc/logrotate.d/varnish   #日志切割配置
/etc/rc.d/init.d/{varnish,varnishlog,varnishncsa}   #启动脚本
/etc/sysconfig/varnish #Varnish配置文件
/etc/varnish/default.vcl #VCL配置模板
/usr/bin/{varnishadm,varnishhist,varnishlog,varnishncsa,varnishstat,varnishtest,varnishtop #管理工具
/usr/sbin/{varnish_reload_vcl,varnishd} #管理工具
/usr/share/doc/  #文档目录
/usr/share/man/ #man文档
/var/lib/varnish #lib库文件
/var/log/varnish #日志文件
  • 修改varnish默认监听端口
    vim /etc/sysconfig/varnish

VARNISH_LISTEN_PORT=80  #因做web cache,该项通常默认会修改为80
  • 修改VCL backend区块(事先准备好web服务)
    vim /etc/varnish/default.vcl

backend default {
   .host = "192.168.99.113";  #Backend的web服务,需自己事先配置好http服务,这里不再赘述
   .port = "80";
}
  • 启动

~]# service varnish restart
  • 查看效果
    在192.168.99.111执行如下curl命令

curl http://192.168.99.111/varnish.html

效果如图

Varnish从菜鸟到专家(一)_java_06

  • 查看所有可用VCL配置(Varnish允许同时存在多个VCL配置)

varnishadm vcl.list
  • VCL配置更新
    方式1:

service varnish reload

方式2:

varnishadm vcl.load vcl01 /etc/varnish/default.vcl
varnishadm vcl.use vcl01

方式3:

varnish_reload_vcl

2.2.2 QA技巧

  • 如init脚本启动失败,手工启动尝试(官网该原生命令格式有错

/usr/sbin/varnishd  -P /var/run/varnish.pid -f /etc/varnish/default.vcl -a :80  -T 127.0.0.1:6082 -t 120 -S /etc/varnish/secret -s malloc,256MB -F

官网提供的该方式实不能有效检测总是所致,建议方式如下:

修改启动脚本,将Varnish启动日志打印至标准输出,找到/etc/init.d/varnish启动脚本,找到77行,做类似如图修改:

Varnish从菜鸟到专家(一)_java_07

#daemon --pidfile $pidfile  $exec -P $pidfile "$DAEMON_OPTS" > /dev/null 2>&1
daemon --pidfile $pidfile  $exec -P $pidfile "$DAEMON_OPTS"

常见错误是误开启SeLinux导致权限不足,报错如下:


Starting Varnish Cache: Failed to change owner on ./vcl.XGkTSgBO.c: Operation not permitted
Running VCC-compiler failed, exited with 2
VCL compilation failed

遇到该情况关闭SeLinux,删除已生成的varnish pid文件,重新启动varnish即可

setenforce 0

2.3 Varnish配置文件参数详解

Varnish的配置文件很简单,因为Varnish借助内核调度请求,因此配置文件中诸如MEMLOCKNPROCS等配置均和ulimit设置相关,具体函数请参考如下:

  • /etc/sysconfig/varnish配置文件参数详解

参数功能说明
NFILES=131072打开的最大文件数 (uliit -n)
MEMLOCK=82000锁定共享内存大小 (ulimit -l)
NPROCS=”unlimited”最大线程数,无限制 (ulimit -u)
RELOAD_VCL=1自动重新装载缓存策略,1表示脚本启动自动重新装载缓存策略配置文件
VARNISH_VCL_CONF=/etc/varnish/default.vcl默认的缓存策略配置文件
VARNISH_LISTEN_PORT=6081默认监听端口,一般改为80端口
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1管理员management进程管理地址
VARNISH_ADMIN_LISTEN_PORT=6082管理员management进程管理端口
VARNISH_SECRET_FILE=/etc/varnish/secret启动装载的密钥文件位置,域共享密钥
VARNISH_MIN_THREADS=50最少线程,启动时最骚启动的空闲进程
VARNISH_MAX_THREADS=1000最大启动进程,最多不能超过1000个并发
VARNISH_THREAD_TIMEOUT=120线程超时时长
VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin缓存文件存放文件(二进制文件)
VARNISH_STORAGE_SIZE=1G缓存大小,也可使用%比方式
VARNISH_STORAGE=”file,…”缓存类型和大小
VARNISH_TTL=120当后端主机不是指定的时候使用超时时长
“DAEMON_OPTS=”“-a …\…Init脚本调用的参数信息


延伸阅读:
Web缓存核心技术点需知


写在最后的彩蛋:

就在刚才,突然发现公众号已经有190篇文章,猛的看到这个数字,自己也是心头一惊,因为公众号自2015年08月27号开通到现在加上我也就2个人在维护,文章也多以自己原创为主,随着2016年即将划上句号,突然看到这么多积累心里也是满满开心和收获,也很高兴因此而结识的3600多位关注的朋友。

其实伊始开通公众号是因为Ansible,当时Ansible很火但国内的文章太少,国外文档对国内的朋友来讲上手门槛太高,所以就和几个朋友一起做了一个Ansible中文权威指南 的网站(http://www.ansible.com.cn ),幸运的是更多的朋友知道后基于兴趣本着开源精神一起加入来完成Ansible的本地化,大家在忙碌的工作之余一起将Ansible英文官网翻译成中文,为了有更快的访问速度体验我们也在中国大陆区搭建了自己的服务器,虽然网站有很多错别字,但也收到很多网友的认可和支持。与此同时,更多的朋友希望有更倾向企业的实战案例的操作手册可供参考,在网友的推动下,再者我们也刚巧是国内Ansible的第一批使用者,因为我们打算写一本这样的书,经过近1年没有周末的生活,一起参与的三位小伙伴终于完成《Ansible权威指南》该书的撰稿将于近日在各大电商上架预售。有需要的朋友们请多关注,也请分享给有需要的朋友。

Varnish从菜鸟到专家(一)_java_08