首页 > ATS缓存中间层介绍

ATS缓存中间层介绍

下面的译文来自ATS官方交流博客中豪哥的一篇英文介绍,碰巧工作中又要用到,为了大家阅读方便,我特此翻译如下,不妥之处请指正:



说明:

慢速磁盘指普通的3.5寸硬盘,快速磁盘指ssd



缓存中间层

当我们考虑ATS的存储时,最原始的设计是支持具有相同容量的多块磁盘,(最适合没有做raid的块设备),由此构建分区,将每个分区指定某个域名(主机名),我们发现假如我们不对现有缓存设计做大的变动,我们就不能利用简单的方式来得到多级缓存架构,因此我们得到下面的中间层解决方案:

我们假定你部署混合存储(方案),快速磁盘在容量或是个数上小于慢速设备的十分之一

我们假设在绝大多数情况下,8块快速磁盘已经相当多了

我们假设你的慢速设备每块盘不会超过32TB

慢速设备存放所有的数据,这样的话,万一有快速磁盘缓存失败时数据不会丢失

相较于存储百分比,快速磁盘在服务器重启期间可能丢失数据10%的数据

快速磁盘应当对所有的慢速磁盘在容量和IOPS上做均衡,磁盘分区基于慢速磁盘创建,对应的扇区分散在各个磁盘上,负载也应该在各个快速磁盘上做均衡



负载均衡设计

cache的中间层以快速磁盘为主(绝大多数情况下是SSD),重启服务器进程会丢失数据, 因此只将中间数据(有备份)存放到中间层缓存中

我们最多支持8块高速磁盘

我们做了一个块级别(block level)的中间层缓存,(不像慢速磁盘)它不含任何索引信息



我们已经完成的工作

借用Dir结构体中的4bit来区分每个快速磁盘(因而快速磁盘个数不能超过32)

限制磁盘上限是32TB

使用volume.config中的配置来对每块快速磁盘分区并绑定之

将中间层数据存到慢速磁盘的dir结构体中

将源服务器的数据写到慢速磁盘

构建一个内部的LRU链表,大小限制为1M的bucket,将busy blocks备份到快速磁盘上

调用快速磁盘上的热点数据,为了使它更高效,我们需要不断比较LRU链表中的blocks

混合缓存设备(快速磁盘)也是呀RRD写数据



优缺点pros and cons

优点:

我们做了一个可靠的解决方案,它对当前的存储架构没有做大的改动

LUR算法有助于我们得到热的block,它是有效的

block层级的中间层缓存对大小对象都有作用

缺点:

服务器进程崩溃时会丢失数据,已在TS-2275中修正

仅只能有限个块设备用作中间层缓存设备

中间层缓存设备在空间上不是追加,而仅是慢速磁盘设备上的热点数据的复制

我们设置存储系统的最大磁盘大小是0.5PB到32TB

默认配置情况下并不开启中间层缓存功能



代码及更改要点

the change of Dir:

@@ -155,15 +157,42 @@ struct FreeDir

   unsigned int reserved:8;

   unsigned int prev:16;         // (2)

   unsigned int next:16;         // (3)

+#if TS_USE_INTERIM_CACHE == 1

+  unsigned int offset_high:12;   // 8GB * 4K = 32TB

+  unsigned int index:3;          // interim index

+  unsigned int ininterim:1;          // in interim or not

+#else

   inku16 offset_high;           // 0: empty

+#endif

 #else

   uint16_t w[5];

   FreeDir() { dir_clear(this); }

we split the stat of read_success into disk, interim and ram:

@@ -2633,6 +2888,11 @@ register_cache_stats(RecRawStatBlock *rsb, const char *prefix)

   REG_INT("read.active", cache_read_active_stat);

   REG_INT("read.success", cache_read_success_stat);

   REG_INT("read.failure", cache_read_failure_stat);

+  REG_INT("interim.read.success", cache_interim_read_success_stat);

+  REG_INT("disk.read.success", cache_disk_read_success_stat);

+  REG_INT("ram.read.success", cache_ram_read_success_stat);

   REG_INT("write.active", cache_write_active_stat);

   REG_INT("write.success", cache_write_success_stat);

   REG_INT("write.failure", cache_write_failure_stat);



如何启用中间层缓存

添加--enable-interim-cache编译选项来配置开启缓存中间层功能

另外在主配置文件records.config中增加两个配置项

proxy.config.cache.interim.storage:

用于缓存中间层的磁盘设备,只支持全路径设备,多个磁盘使用空格分隔开

比如:

LOCAL proxy.config.cache.interim.storage STRING /dev/sdb /dev/sdc1



proxy.config.cache.interim.migrate_threshold:

迁移阈值,默认是2次,就是说,当一个url在LRU链表中出现2次以后,它才会从慢速硬盘存储storage转移到缓存中间interim cache中去。

比如:

LOCAL proxy.config.cache.interim.migrate_threshold 2





测试结果

我们的系统有160G SSD + 3 * 500G SAS, 16G RAM, 4 cores,下面是tsar和iostat -x的执行结果

tsar ======================================================================================

Time           --------------------ts------------------ -------------ts_cache-----------

Time              qps    cons     Bps      rt     rpc      hit  ramhit    band  ssdhit

24/06/13-10:30 901.83   18.89   22.6M   17.36   47.74    87.30   68.08   88.90   22.49

24/06/13-10:35 934.12   18.88   22.0M   14.34   49.47    87.60   68.53   90.70   22.21

24/06/13-10:40 938.14   18.92   21.7M   15.36   49.58    87.70   68.02   89.50   22.45



iostat -x ==================================================================================

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           5.47    0.00   15.62   25.09    0.00   53.82

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util

sda               0.00     7.33   25.67    3.33  1600.00  1438.00   104.76     0.45   15.46  12.17  35.30

sdb               0.00     0.00   28.67   11.33  1461.00  8723.00   254.60     0.74   18.47  11.21  44.83

sdc               0.00     0.00   25.67    2.00  2178.00  1373.33   128.36     0.40   14.05  11.04  30.53

sdd               0.00     0.00  196.00    4.00 14790.00  2823.00    88.06     0.13    0.66   0.41   8.30   猜测这块硬盘是ssd



参考文献

[1].https://blog.zymlinux.net/index.php/archives/555

[2].https://cwiki.apache.org/confluence/display/TS/SSDSupport

更多相关:

  • 今天给主机加了一个希捷3TB硬盘,格式化是个头疼的问题,经过网上调研后,发现目前该问题已经被成功解决,现在使用希捷提供的DiscWizard可以成功解决。 下面记录一下我使用DiscWizard格式化2TB以上硬盘的基本过程。 1.首先从希捷官网下载并安装DiscWizard软件。 2.将3TB硬盘安装到主机上,并开启操作系统。...

  • df命令可以查看当前系统磁盘空间的使用情况 命令:df -h du -sh * 查看目录文件暂用磁盘大小 如果磁盘空间不够,需清理磁盘 磁盘速度测试,如果磁盘性能不好,性能测试数据会不准确(读写速度) 命令:dd if=/dev/zero of=/export/ddtest bs=8k count=1000000 oflag=dir...

  • 1. 磁盘的数据结构包括哪些内容?   答:分区,卷,磁盘分区,主分区,扩展分区,逻辑分区,逻辑驱动器,引导分区。 2. 什么是基本磁盘和动态磁盘?    (1) 基本磁盘和旧版本Windows操作系统中使用了相同的磁盘结构。    (2)动态磁盘功能最初发布于Windows2000,用于增强磁盘支持,在磁盘配置变动后需要重启动的次数...

  • 我们在重装好系统Win7系统后有时会碰到需要新建磁盘分区的情况,这时我们再重装系统进行磁盘分区就有些过于麻烦了,其实我们可以利用Win7系统自身的磁盘管理功能来新建一个磁盘分区。下面好系统重装助手就来介绍一下好系统Win7系统电脑磁盘新建分区的方法。 好系统Win7系统电脑磁盘新建分区的方法 1、右键点击我的电脑,选择管理,在计算机管...

  • 英语的重要性,毋庸置疑!尤其对广大职场人士,掌握英语意味着就多了一项竞争的技能。那,对于我们成人来说,时间是最宝贵的。如何短时间内在英语方面有所突破,这是我们最关心的事情。英语学习,到底有没有捷径可以走,是否可以速成?周老师在这里明确告诉大家,英语学习,没有绝对的捷径走,但是可以少走弯路。十多年的教学经验告诉我们,成功的学习方法可以借...

  • 展开全部 其实IDLE提供了一个显32313133353236313431303231363533e78988e69d8331333365663438示所有行和所有字符的功能。 我们打开IDLE shell或者IDLE编辑器,可以看到左下角有个Ln和Col,事实上,Ln是当前光标所在行,Col是当前光标所在列。 我们如果想得到文件代码...

  • 前言[1]从 Main 方法说起[2]走进 Tomcat 内部[3]总结[4]《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spri...

  • 【本文摘要】【注】本文所述内容为学习Yjango《学习观》相关视频之后的总结,观点归Yjango所有,本文仅作为学习之用。阅读本节,会让你对英语这类运动类知识的学习豁然开朗,你会知道英语学习方面,我们的症结所在。学习英语这类运动类知识,需要把握四个原则第一,不要用主动意识。第二,关注于端对端第三,输入输出符合实际情况第四,通过多个例子...

  • 点云PCL免费知识星球,点云论文速读。文章:RGB-D SLAM with Structural Regularities作者:Yanyan Li , Raza Yunus , Nikolas Brasch , Nassir Navab and Federico Tombari编译:点云PCL代码:https://github.co...

  • (给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...