varnish的架构和日志

varnish的架构

	知道varnish的内部结构有两个重要的原因:
首先,架构主要负责性能,其次,它影响你如何将Varnish集成到你自己的架构中。
主程序块是Manager进程,包含在二进制程序varnishd中。
Manager进程的任务是将任务包括缓存委托给子进程。
Manager进程确保每个任务总是有一个进程。
这样设计的主要驱动因素就是安全性。
可以通过以下方式访问Manager的命令行界面(CLI):
1)varnishadm管理界面部分,
2)Varnish Agent vagent2
3)Varnish管理控制台(VAC)(通过vagent2)
Varnish Agent vagent2是一个varnishd服务的开源HTTP REST接口,它提供远程控制和监视服务。
vagent2提供了一种Web UI ,同时你可以编写自己的UI。
vagent2的一些功能是:VCL上传,下载,保存(存储到磁盘),参数查看,存储(还没有持续),显示/清除应急消息,开始/停止/查看varnishd服务,取缔功能,varnishstat 采用JSON格式。
父进程:manager
Manager 进程由root用户所拥有,其主要功能有:
应用配置更改(从VCL文件和参数)
将任务委托给子进程:Cacher和VCL到C编译器(VCC)
监视varnish
提供一个varnish命令行界面(CLI)
初始化子进程:Cacher
Manager进程每几秒钟检查一次cacher是否仍然存在。
如果Manager在由ping_interval给定的时间间隔内没有得到回复,那么Manager将杀死Cacher并重新启动。
如果Cacher意外退出,也会发生自动重启。
你可以通过使用varnishadm ping来进行手动ping。
子进程的自动重启是Varnish的一种复原属性,这个属性可以确保即使Varnish包含一个可以危害子进程的重要bug,子进程通常也会在几秒钟内重新启动,您可以使用auto_restart参数切换此属性。
注意:
即使您没有察觉到长时间的服务停机时间,您也应该检查varnish的子进程是否正在重新启动。
这一点很重要,因为子进程重启会导致额外的加载时间,因为这段时间中varnishd会不断清空缓存。
自动重启的日志记录在/var/log/syslog,为了验证子进程是否被重启,你也可以用varnishstat中的MAIN.uptime计数器来检查它的生命周期。
子进程:cacher
由于Cacher侦听的是公共IP地址和已知端口,因此它暴露在恶意客户端面前。
因此,出于安全考虑,这个子进程由非特权用户拥有,并且没有与其父进程Manager进行反向通信。
Cacher的主要功能是:
听取客户端的要求
管理工作线程
存储缓存
记录流量
更新统计的计数器
Varnish使用工作区来减少每个线程在需要获取或修改内存时的争用。
有多个工作区,但最重要的是会话工作区,它用于处理会话数据。
如在输入到缓存之前将www.example.com更改为example.com,来减少重复。
请注意,即使你拥有5 MB的会话工作区并使用1000个线程,但实际的内存使用量也不是5 GB,虚拟内存的使用量确实是5GB,但是除非你真的使用内存,这不是问题,您的内存控制器和操作系统将跟踪您实际使用的内容。
为了与系统的其他部分进行通信,子进程使用VSL访问文件系统,这意味着如果一个线程需要记录某些内容,所需要做的就是设定一个锁,然后写内容到到内存区域,最后再解锁。
除此之外,每个工作线程都有一个缓存用于记录日志数据以此来减少锁定争用。
日志文件通常大约80MB,并分成两部分:第一部分是计数器,第二部分是请求数据,要查看实际数据,可以采用工具解析VSL。
由于日志数据并不意味着都是以原始形式写入磁盘的,因此Varnish可以做得非常详细,这样你可以使用其中一种日志解析工具来提取您想要的信息 - 即可以永久存储也可以实时监控Varnish。
如果Cacher出现问题,它会记录一个详细的应急信息到syslog。
当测试时,你可以使用varnishadm debug.panic.worker 命令或使用vanish agent web 页面上的induce panic按钮来减少varnishd服务的应急信息。 VCL编译
打印编译为C语言的VCL代码并退出:
varnishd - C - f < vcl_filename >
用于检查您的VCL代码是否正确编译。
Varnish配置语言VCL配置了Varnish的高速缓存策,然后VCL被VCC进程转换为C,它是由一个普通的C编译器gcc编译,然后链接到正在运行的Varnish实例中。
由于VCL的编译是在子进程之外完成的,所以不会无意中加载格式不正确的VCL,从而影响正在运行的Varnish实例。
因此,运行Varnish时更改配置非常方便,新的VCL的政策会立即生效,但是,所使用的旧配置缓存的对象可能会一直存在,直到它们没有了旧的引用或新的配置对其执行操作为止。
一个已编译的VCL文件将一直存在,直到完全重启Varnish,或直到管理界面发出vcl.discard命令,在使用完编译的VCL文件后你只能删除。
您可以通过读取vcl.list参数来查看VCL引用的数量。 VCL重载
varnishd可以重新加载VCL程序,无需重新启动,只是重新加载VCL编译代码。
service varnish reload
systemctl reload varnish
varnish_reload_vcl
varnishadm vcl.load <compiledVCL> <VCLsourcecode>
varnishadm vcl.list
varnishadm vcl.use

varnish日志

	varnish日志中记录有请求,缓存和对varnish共享内存日志(VSL)的响应信息。
内存日志覆盖有两个效果,一方面没有历史数据,但另一方面却有大量的信息以非常快的速度获得。
当然,仍然可以将日志存储在文件中。
varnish会生成大量的数据,因此它不会将日志默认写入磁盘,而只会记录到内存中。
如果需要记录日志到磁盘上,可以通过在/etc/default/varnishlog和/etc/default/varnishncsa中分别设置VARNISHNCSA_ENABLED=1来实现。

日志工具

	显示详细日志:
varnishlog
用于访问特定的数据,它提供了特定客户的信息和要求。
varnishncsa
以NCSA通用日志格式显示varnish访问日志。
varnishtest
允许显示测试中的日志记录和计数器。
统计工具:
varnishstat
用于访问全局计数器,不读取varnish日志中的条目。
varnishtop
读取Varnish日志并呈现最常出现的日志条目的不断更新的列表。
varnishhist
读取Varnish日志,并显示一个连续更新的直方图,显示最后N个请求的处理分布情况。

日志布局

	varnish日志事务处理如图所示,varnishlog是最常用的工具之一,并采用了按TCP会话,前端或后端工作者分组的事务机制重新排序事务。
varnishlog的各种参数是为帮助你找到你想要的东西。使用varnishlog可以有效地过滤varnish工作中产生的大量日志数据。

事务处理

	varnishlog -g <session|request|vxid|raw> -d
Varnish Transaction IDs (VXIDs,varnish 事务id)被应用于大量不同种类的工作项目中。
事务类型:
session:tcp 会话
request:前端或后端工作者处理的事务
varnish默认按照VXID来分组,1是后端请求BeReq,2是客户端请求Request,3是会话Session。
事务组
事务组是分层的
层级和关系
Level 1: Client request (cache miss)
Level 2: Backend request
Level 2: ESI subrequest (cache miss)
Level 3: Backend request
Level 3: Backend request (VCL restart)
Level 3: ESI subrequest (cache miss)
Level 4: Backend request
Level 2: ESI subrequest (cache hit)

varnish的架构和日志的更多相关文章

  1. 基础架构之日志管理平台搭建及java&net使用

    在现代化的软件开发流程中,日志显得非常的重要,不可能再零散的游离在各个项目中,等查看日志的时候再登录服务器去到特定的目录去查看,这显然很繁琐且效率低下,所有整合一套日志管理平台,也显得非常重要,这篇文 ...

  2. 基础架构之日志管理平台及钉钉&邮件告警通知

    接上一篇,我们继续解释如何把ELK跟钉钉及发送邮件功能结合起来,让我们及时的了解重要日志并快速反馈. Sentinel 安装,项目介绍在https://github.com/sirensolution ...

  3. 微服务架构Day02-SpringBoot日志slf4j

    日志框架 日志门面(接口,日志抽象层 ) 日志实现 JCL(Jakarta Commons Logging).slf4j(Simple Logging Facade for Java).jboss-l ...

  4. 海量日志实时收集系统架构设计与go语言实现

    日志收集系统应该说是到达一定规模的公司的标配了,一个能满足业务需求.运维成本低.稳定的日志收集系统对于运维的同学和日志使用方的同学都是非常nice的.然而这时理想中的日志收集系统,现实往往不是这样的. ...

  5. 15套java架构师、集群、高可用、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩展. ...

  6. 15套java互联网架构师、高并发、集群、负载均衡、高可用、数据库设计、缓存、性能优化、大型分布式 项目实战视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展 ...

  7. java架构师负载均衡、高并发、nginx优化、tomcat集群、异步性能优化、Dubbo分布式、Redis持久化、ActiveMQ中间件、Netty互联网、spring大型分布式项目实战视频教程百度网盘

    15套Java架构师详情 * { font-family: "Microsoft YaHei" !important } h1 { background-color: #006; ...

  8. 2017最新技术java高级架构、千万高并发、分布式集群、架构师入门到精通视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩展. ...

  9. 15套java架构师大型分布式综合项目实战、千万高并发-视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展 ...

随机推荐

  1. bash shell & front-end & auto publish & auto deploy

    bash shell & front-end & auto publish & auto deploy $ zip -r apitool-2018-11-22.zip apit ...

  2. [NOIP2004] 提高组 洛谷P1089 津津的储蓄计划

    题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里 ...

  3. codeforces Gym 100814 A、B、F、I

    A题 先求出来这个数是第几大  阶乘求概率p  然后计算获得胜率的概率 常规解法把所有情况考虑一遍(跳1次,2次,3次……)要用到组合数  数可能太大了会爆的行不通 我们观察发现它有递推性质,从第二大 ...

  4. 洛谷 P1018 乘积最大

    P1018 乘积最大 题目描述 今年是国际数学联盟确定的“ 20002000 ――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰 9090 周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学 ...

  5. ADSL和ITV

    1.ADSL和ITV两者占用的是不同的虚通道,也就是使用不同的VLAN: 2.的确上通过不同的VPI/VCI来区分ADSL和ITV在不同通道,但不会互不影响的,因为使用的还是同一条线路的宽带速度: 3 ...

  6. SQLServer2008 快捷键集合

    CTRL       +       SHIFT       +       B                 生成解决方案           CTRL       +       F7     ...

  7. Unix时间戳(Unix timestamp)转换

    http://tool.chinaz.com/Tools/unixtime.aspx 如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)? Java time JavaScr ...

  8. Django学习系列之模板系统

    一.模板标签 if/else {%  if  %}标签检查一个变量的值是否为真或者等于另外一个值,如果为真,系统会执行{%  if  %}和{%  endif  %}之间的代码块,例如: {% if ...

  9. 静态链表的C++实现

    静态链表是使用数组实现的能够高速插入和删除数据的链表,静态链表和链式单链表比的缺点在于链表的长度仅仅能初始化设置好,而相相应普通的顺序存储的链表,静态链表不能实现高速的读写随意的元素. 当然静态链表给 ...

  10. vue中slot的笔记

    一言以蔽之:本来写在子组件里边的内容默认是不显示的,如果想相对于子组件在哪里进行显示,则使用slot标签代表占位符,代替那部分内容,是行间元素还是块级元素取决于原先的那个标签. 参考的连接是:http ...