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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值