首页 > ATS 5.3.0缓存架构

ATS 5.3.0缓存架构

下面是参考文献[1]的翻译





简介

ATS既可以用作HTTP代理,也可以用作HTTP缓存,ATS能够缓存任何字节流,虽然它当前只支持HTTP协议传输的字节流,当这样的流缓存时,会带一个HTTP协议头部,会命名为缓存中的一个对象object。每个对象通过一个名为cache key的全局唯一值识别。

该文档的目的是描述ATS缓存的基本结构和实现细节。缓存的配置只讨论到需要理解内部机制的程度。这篇文档对ATS源码和插件(codebase or plugins)开发者很有帮助。该文档假定读者对管理员文档已经比较熟悉,特别是对其中的HTTP Proxy Caching[2]和Configuring the Cache[3]以及相关的配置和值比较熟悉。

很遗憾内部术语并不特别一致,所以该文档将会频繁使用不同方式的术语,以达到某种一致性。





缓存结构Cache Layout

下面的小节描述了持久缓存数据persistent cache data的组织细节。ATS将它的持久存储视作一个毫不加区分的字节的集合,假设再没有其它结构描述它。特别地,它并不会用到操作系统的文件系统。

假如使用一个file,仅是表明要用到它所含的字节集合。





Cache storage

ATS缓存的原生storage在storage.config中配置,文件中的每行描述了一个cache span,它被视作一个统一的持久存储。



该storage进一步被组织成一个cache volumes的集合,在volume.config文件中配置,它被用作其它管理级别配置的单位。

cache volumes可以定义为total storage的百分比,或者storage的绝对量。为了稳妥,默认每个cache voluem分散到所有的cache span。

cache volume和cache span的交集是cache stripe。每个cache span分割为cache stripes,每个cache volumes可以定义为total是这些stripes的集合。

假如这个cache spans例子中的cache volumes定义如下



那么实际的结构layout形如



cache stripes是该实现的缓存基础单元,一个cached object完整存放在单个stripe中,因而也在单个cache span中。缓存对象绝不会分割后存放到多个span红色volumes中。

Objects被指定到一个stripe,因而被指定到一个cache volume,自动基于URI的hash去检索来自源站的object。可以在hosting.config中做配置来限制对象的广度。

该配置文件支持将指定的hosts和域名存放到特定的cache volumes。从4.0.1版本后,也可以控制哪些cache spans,因而哪些cache stripes包含在指定的cache volumes中。





cache spans,cache volumes和cache stripes(组成前两者)的结构(layout and structure)完全来自storage.config和cache.config的配置,当traffic_server启动时

会从头重新计算。因此,那些配置文件的任何变化都能(差不多总是)导致现存缓存的完整性失效。



Stripe Structure

ATS将与cache stripe相关的storage视作一个不加区分的字节带(span of bytes).在内部,每个stripe视作毫不相关。本节描述的数据结构仅针对stripe内部。

在源码中术语volume用作cache stripe,主要在Vol中实现,读者称作volume的东西(本文档称作cache volume),这里表示为CacheVol。





注意

stripe划分必须在处理object之前,因为object所在的目录在stripe内部,当stripe划分改变时,其中所含的任何缓存对象cached objects必定会丢失,因为它们的目录数据不会在新stripe中找到。





缓存目录Cache Directory

stripe中的内容通过目录directory追踪,目录中的每个元素就是directory entry,表示为Dir。每个元素引用缓存中的一段连续存储区,它们有各种称呼,比如fragments,segments,docs,documents,和其它说法。总体来说,目录就是以cache ID为key的一个hash。参见directory probing去了解如何使用cache ID来定位一个directory entry。cache key是content的URL,cache ID由cache key计算得到。





directory用作内存中的驻留结构memory resident structure,这意味着directory entry要尽可能小,当前为10个字节。这迫使存放的数据做某些妥协。另一方面,这意味着,绝大多数cache miss不要求磁盘I/O,这样将会有相当大的性能优势。





目录总是完全划分好的,一旦stripe初始化好,对应的directory大小就是固定的,绝不会再改变,并与stripe大小(近似线性)相关。这就是ATS内存footprint与磁盘缓存大小紧密相关的原因。因为目录大小不变,对内存要求也不变,所以ATS随着缓存中存放内容的增多并不会再消耗更多的内存。假如当缓存为空时,运行ATS足够,那么当缓存存满后,运行ATS也是足够的。





每个directory entry中存放了在stripe中的offset和size,size是fragment中实际数据大小的近似值(至少大于),精确的size data存放在磁盘中fragment header中。

注意

HTTP headers中的数据不经过磁盘I/O并不能检查。这包括对象的original URL, cache key没有精确存放,因而不能可靠地检索到。

……



缓存初始化Initialization

缓存初始化会开启一个Store实例,通过读storage配置文件,默认为storage.config。对该配置文件中的每个合法元素,会创建一个Span实例,基本上有四种类型的实例:File,Directory,Disk,Raw device。

在生成所有的Span实例后,它们按device ID分组到内部链表中并挂接到Store::disk数组上。引用同一个目录,磁盘或裸盘的那些Spans被组合进同一个span中。引用同一个文档但是偏移重叠的Spans也被组合起来,这些工作都在ATS启动时调用ink_cache_init()完成。

span logic也被HostDB使用到,不止一个莫名其妙的feature在那个模块中出现。

在配置初始化后,cache processor调用CacheProcessor::start(),它做了许多事情:

对每个合法的span,创建一个CacheDisk实例,CacheDisk类是一个continuation,能在span上用来执行阻塞操作,该类的主要作用就是传递到AIO线程作为I/O操作完成时的回调函数,然后会传递到AIO薪酬执行storage unit的初始化,在所有这些工作完成后,在cplist_reconfigure()中,得到的storage会分发到volumes中,那时再生成CacheVol实例。



(未完待续……)



单词表

parcel out  分配,把…分成几份

coalesce  使…联合,使…合并

inexplicable  费解的,莫名其妙的

rationale   基本原理

ballpark  大致的,大约的

millage  税率

wholly unjustified  完全不合理

false negative 误报



参考文献

[1].https://docs.trafficserver.apache.org/en/latest/developer-guide/architecture/architecture.en.html

[2].https://docs.trafficserver.apache.org/en/latest/admin/http-proxy-caching.en.html#http-proxy-caching

[3].https://docs.trafficserver.apache.org/en/latest/admin/configuring-cache.en.html#configuring-the-cache

[4].https://github.com/portl4t/trafficserver-doc-zh/blob/master/arch/cache/cache-arch.md



更多相关:

  • 本文研究nginx提供的缓存功能,下面是实操记录。 这篇博文基于前面文章的基础上搭建,至始至终都是root用户操作 http://blog.csdn.net/tao_627/article/details/78953800 缓存清除功能需要借助第三方模块ngx_cache_purge,其链接如下 https://github...

  • 对Squid使用的几点总结 1.cache_dir 在Linux环境下用aufs类型的cache_dir比较稳定,速度也比较快。cache_dir所在文件系统如果用noatime选项来mount,可以避 免访问cache文件时经常要更新access time的操作。 一般cache容量和被加速内容的比值...

  • 策略模式作为行为型设计模式中的一种,主要封装相同功能的不同实现算法,用于在用户程序内部灵活切换。对用户来说能够快速替换对应的算法,能够让算法的实现独立于使用的用户。 基本的UML类图如下: 用户使用Stratey的实例能够快速得在不同的Cache算法之间灵活切换(直接使用对应的Cache实例来设置到Strategy之中即可。),...

  • 环境 ceph版本:12.2.1 部署模式:ec 2+1 osd: 3个 且资源池已经有数据 执行命令:ceph daemon osd.0 flush_store_cache 进行刷缓存。即将dump_mempools内存池管理的bluestore cache中的无用数据进行释放 主要参数: bluestore_cache_tr...

  • (给DotNet加星标,提升.Net技能)转自:HueiFengcnblogs.com/yyfh/p/12361255.html前言本章将介绍客户端缓存将介绍浏览器缓存和服务端缓存,使用浏览器缓存将减少对web服务器的请求次数,同时可以提升性能,避免重复的运算浪费。ASP.NET Core对于HTTP缓存分为两种:客户端(浏览器缓...

  • 事先说明 标题说是“坑”,并没有说是“bug”,也就是多半是玩的姿势不对。 线上问题 我司(lecloud)目前线上大小文件都是使用的ATS 6.2.1版本,昨天运维反馈有文件超过缓存时间并不回源刷新,截图如下: 现象就是:age超过max-age了,过期了不更新! 另外需要说的一点就是,源站是可以正常回源的。 复...

  • 将追加的主题 内存常驻副本(resident alternates)缓存对象刷新(object refresh) 缓存一致性(Cache Consistency) ATS缓存是完全一致性的,除非你不小心踢掉电源,让ATS突然关机。如果要禁用硬盘驱动器自身的缓存,你需要使用下面的命令 hdparm -W0 缓存系统会校验可用...

  • ATS名词术语 副本(alternate) 缓存对象(cache object)的一种变体,最初创建该术语是为了处理HTTP协议中的VARY机制(RFC2616#sec14.44),现在多用于其它的目的。一个对象的所有副本必须以某种方式等价,也就是说,它们是同一个流的等价形式,最常用的一个例子就是,一个流既有普通版本也有压缩版本。...

  • 该博文翻译自参考文献[1] parent.config parent.config文件识别用在缓存分级中的父代理,用这个文件去执行下面的配置: 搭建父分级缓存,兼容多父级缓存和父级缓存故障转移配置指定的URL请求避开父代理缓存 仅当父缓存选项开启后,ATS才能使用parent.config文件。 当你修改parent.conf...

  • 原文出处: 韩昊    1 2 3 4 5 6 7 8 9 10 作 者:韩 昊 知 乎:Heinrich 微 博:@花生油工人 知乎专栏:与时间无关的故事   谨以此文献给大连海事大学的吴楠老师,柳晓鸣老师,王新年老师以及张晶泊老师。   转载的同学请保留上面这句话,谢谢。如果还能保留文章来源就更感激不尽了。 我保证这篇文章...

  • 原文出处: 韩昊   我保证这篇文章和你以前看过的所有文章都不同,这是 2012 年还在果壳的时候写的,但是当时没有来得及写完就出国了……于是拖了两年,嗯,我是拖延症患者…… 这篇文章的核心思想就是: 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维...

  • 很多Linux高手都喜欢使用screen命令,screen命令可以使你轻松地使用一个终端控制其他终端。尽管screen本身是一个非常有用的工具,byobu作为screen的增强版本,比screen更加好用而且美观,并且提供有用的信息和快捷的热键。 想象一下这样一个场景:你通过Secure Shell(ssh)链接到一个服务器,并...

  • NarrowbandPrimary Synchronization Signal时域位置每1个SFN存在一个NPSSSFNSubframeSymbol长度每个SFN5最后11个symbol11个symbols频域位置NB-IOT下行带宽固定180kHz,一个PRB,12个子载波。...

  •  [h1]反斜杠只能够阻止一个字符  [h2]位于键盘的左上角,和~公用一个键。...