热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ATS5.3.0缓存架构

下面是参考文献[1]的翻译简介ATS既可以用作HTTP代理,也可以用作HTTP缓存,ATS能够缓存任何字节流,虽然它当前只支持HTTP协议传输的字节流,当这样的流缓存时,
下面是参考文献[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



推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Firefox火狐浏览器关闭到http://detectportal.firefox.com的流量问题解决办法
    本文介绍了使用Firefox火狐浏览器时出现关闭到http://detectportal.firefox.com的流量问题,并提供了解决办法。问题的本质是因为火狐默认开启了Captive portal技术,当连接需要认证的WiFi时,火狐会跳出认证界面。通过修改about:config中的network.captive-portal-service.en的值为false,可以解决该问题。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
author-avatar
手机用户2602926163
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有