Varnish从菜鸟到专家 一

9 年 ago jony 1
2017-03-07 李松涛 云技术实践

1.1 Varnish 简介及工作原理

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

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

但据官网介绍,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.2 Object对象存储机制

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

  • HTTP响应信息缓存本地;
  • Varnish处理的对象在内存中以hash树方式存储;
  • 用户可处理和控制hash信息;
  • 多个对象可拥有相同的hash地址;

1.3 Object对象存活时间

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

每个对象拥有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

  • 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 Configuration Language(VCL)
    4. 查看最新的参数文档
  • varnishlog
    Varnish日志展示工具,因信息量较大往往需要事先过滤varnishlog支持精确日志匹配。
  • varnishstat
    varnishstat可访问全局计算器,可提供全面的统计信息,如全部请求数,缓存对象的数量等。常和varnishlog结合分析Varnish的安装。
  • 其它工具
    varnishncsavarnishtopvarnishhist对Varnish的性能及状态分析均有帮助。

2.2 Varnish 安装部署及QA技巧

2.2.1 安装

  • 系统环境介绍
Roles ip Detail
varnish(4.0.3) 192.168.99.111 80,6082
WebServer(nginx) 192.168.99.113 80(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提供二次开发所依赖的库文件

  • 安装验证

  • 目录架构详解(主要)

[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

效果如图

  • 查看所有可用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行,做类似如图修改:

#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脚本调用的参数信息

本文转载自公众号运维部落

http://mp.weixin.qq.com/s/S77ehOnvZ0VyaFXHZ5q6Ag

https://fomore.net/os/?p=2022

https://fomore.net/os/?p=2020