1. 引言

这是一篇业界发表在NeurlIPS 2020的Wip论文《Google规模的基于磁盘的数据库的学习索引》。自从学习索引祖师爷Tim Kraska@MIT在SIGMOD 2018发表了第一篇learned index的工作之后,有关学习索引的paper呈现 increasing trend。目前,较多的工作focus在in-memory的层面,直到最近才出现一些工作,研究将学习索引从内存拓展到更远的存储(NVM、SSD、RDMA等)。在内存外学习索引的研究工作中,LSM-tree存储结构是一个令人excited的方向。得益于LSM-tree的设计哲学,LSM-tree中的SSTable组件是read-only的,这种读写特性与学习索引相当契合(学习索引最初也是为了优化读性能而生,原始学习索引并不支持写插入、写更新)。LSM-tree是Google三驾马车之一——BigTable的原型,BigTable是Google研发的分布式海量数据存储系统。Google将学习索引和BigTable进行结合,提升了BigTable的读性能。

2. 问题

作者介绍了目前BigTable中使用索引的现状:

  • 使用B-Tree来确定key存储在哪个data block中
  • 不能使用哈希索引,因为BigTable要支持范围查询,哈希索引无法满足这一需求
  • B-Tree在读取数据时存在一定程度的读放大(为了查找一个key,可能需要几次读取index block,最后再读取data block到内存)

问题:

  • BigTable实例的size很大,所以index没法fit into memory
  • 一台机器上有多个BigTable实例,进一步减少了可用的内存空间
  • 在大数据量面前,可用的cache也会告急
  • 并不是所有BigTable实例都会经常被用到(冷热BigTable)

作者认为,learned index天生的存储优势(smaller index space)有助于缓解cache压力,减少index从外存fetch的次数(尤其有利于减少tail latency),从而减少存储资源的占用,提升BigTable的吞吐量。

祖师爷最早提出的内存学习索引并不适用于BigTable。为此,作者们训练了一种将key映射到BigTable中对应的data block的学习索引结构。

3. 背景

LSM-tree   LSM-tree是一种非常经典、流行的键值存储结构,具有极其高效的写入效率,和较高的读取效率。其介绍参见:

https://blog.51cto.com/u_15127582/2749141

BigTable   BigTable是PB级别的分布式存储系统,支持低延迟、高吞吐。BigTable的结构原型为LSM-tree,谷歌大牛Jeff Dean在十年前将LSM-tree/BigTable的实现开源为LevelDB。

SSTable   SSTable是LSM-tree持久化存储的组件。SSTable存储众多键值对,按key进行排序。为了支持对数据集进行有效的操作,SSTable将数据分割成data block,并保留索引,说明哪些键位于哪些数据块中。读取时可以使用SSTable索引,来找到一个key所在的数据块。

SSTable索引被存储在index block中。索引条目包含了每一数据块的位置和大小。利用这些信息,数据块可以被有效地加载到内存中。索引块被keep in memory,这意味着读取,特别是连续读取,可以通过查询索引块来完成,并且只对请求的数据进行磁盘读取。

SSTable索引是在构建SSTables的同时创建的。在构建过程中,一旦一个数据块被填满,该数据块的代表性item(通常会是该数据块的首个item或者最后一个item)就被添加到索引中。之后,该数据块连同其索引被持久化到文件。

随着SSTable大小的增加,索引块的大小也会增加。为了提高索引效率,SSTable使用两级索引,包括一个0级索引和一个1级索引。0级索引跨越多个索引块,并且总是驻留在内存中,指向1级索引块。第1级索引是一个1级索引块的序列,它指向数据块。当1级索引块所指向的数据块被访问时,一级索引块被加载到内存中。

4. Learned Index for Disk-based Databases

设计   SSTable原本的索引,能够确定所给key存储在哪个data block中。而学习索引根据key预测到其存储的location。作者认为,预测到具体的location对BigTable没用,因为即便预测到了location,还是要把这个location所在的data block加载到内存。因此,作者设计的学习索引。将key映射到data block这个粒度。

但即便是预测到data block,作者认为预测错误的代价大,因为要重新读取周围的data block,这将带来更大的开销(存疑:不可以增加元信息来辅助判断么?)

于是,本文学习索引任务表示为:

训练学习索引f(*),接受key作为输入,以key所在的data block number作为输出。作者在此用了一个trick:在SSTable构建的过程中动态确定学习索引预测的误差值e,以确保<k,v>能够落在f(k)预测的data block内。因此,这就确保了后续访问SSTable时,学习索引总是能给出确切的key所在的data block。

训练   上文提到,学习索引最后预测到的是data block number,但是现在的情况是压根不知道哪个key对应哪个data block number。

因此,换一种方式,先将key映射到字节偏移量。引入下面的记号:

因此,f(k)预测出byte offset之后,就可以得到其存储的data block number为:

(存疑:除以平均block size就能得到准确的block number了么?这里应该有更多的说明或论证)

在预测到block number之后,通过取B[block number],可得到数据在磁盘上存储的位置,进一步将data block读取进内存中。这里B是作者预先处理好的磁盘位置数组。

模型   LR模型(线性回归)。

5. 实验

  • Baseline:two-level index(BigTable’s Default)
  • HW Config:5 tablet servers, each with 4G RAM
  • Trace:256百万行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jm7mXCua-1674032217741)(https://files.mdnice.com/user/10629/f19ab7be-893d-44b7-bc53-58f85473c5ec.png)]

6. 相关工作

  • Bourbon:Bourbon是威斯康星麦迪逊分校Remzi组的工作,发表于2020年的OSDI。Bourbon在WiscKey键值分离的基础上,设计了一种简单而行之有效的学习索引,加速了LSM-tree的查询性能。

    Dai Y, Xu Y, Ganesan A, et al. From {WiscKey} to Bourbon: A Learned Index for {Log-Structured} Merge Trees[C]//14th USENIX Symposium on Operating Systems Design and Implementation (OSDI 20). 2020: 155-171.

来给博客除草了:Learned Indexes for a Google-scale Disk-based Database相关推荐

  1. 博客除草计划(二):GitHub Pages Deploy Action 部署 hexo 博客

    Github Actions 是 Github 推出的自动化构建工具,一般来说,CI / CD (持续集成 / 持续部署)都需要自己的计算资源,但 Github Actions 提供免费的计算资源,这 ...

  2. 博客除草计划(一):使用 Backblaze、Cloudflare 和 rclone 管理博客图片

    有一年多没有更新博客了吧,最近想把博客给拾掇拾掇,打开博客就发现图片加载好慢.我一直使用的是免费资源,比较费精力,托管图片的地方也换了好几个,每种方法有所长,也有所短. 本文搭建图床的方法主要参考这篇 ...

  3. 55篇世界上著名博客的经验之谈

    这篇文章是转载而来的,我觉得挺不错的,想将这55篇文章整理为中英文结合的随笔,发布在自己博客上,学习英语及翻译同时吸收一些不错的观点.下面是其原文. Matt Huggins最近收集了世界著名博客的5 ...

  4. Hexo 个人博客 SEO 优化(3):改造你的博客,提升搜索引擎排名

    Hexo 个人博客 SEO 优化三篇系列文章终于完成了 Hexo 个人博客 SEO 优化(1):搜索引擎原理介绍 Hexo 个人博客 SEO 优化(2):站内优化 Hexo 个人博客 SEO 优化(3 ...

  5. 在git下搭建个人博客

     转载:http://blog.csdn.net/jackystudio/article/details/16117585 原谅我又不务正业了,最近在Github上利用Octopress框架搭建了 ...

  6. 如何启动 WordPress 博客 – 简易指南 – 创建博客(2021)

    您想以正确的方式创建 WordPress 博客吗?我们知道,特别是当您不是技术极客时,创建博客可能是一个复杂的想法.在帮助许多用户创建博客后,我们决定创建最全面的指南,介绍如何在没有任何技术知识的情况 ...

  7. 可以添加Google adsense广告和阿里妈妈的博客汇总

    同搏客网一样也是中国最早的搏客托管之一,深受广大blogger的好评,同时也支持javascript.缺点是在北方地区似乎比较慢,打开网页比较费时间. 站点名称:博客网老公社 简单介绍: 博客网号称是 ...

  8. wordpress启动_如何通过7个简单步骤正确地启动WordPress博客(2020)

    wordpress启动 Do you want to start a WordPress blog the right way? We know that starting a blog can be ...

  9. Android经典的大牛博客推荐

    Android中文Wiki AndroidStudio-NDK开发-移动开发团队 谦虚的天下 – 博客园 gundumw100博客 – android进阶分类文章列表 – ITeye技术网站 CSDN ...

最新文章

  1. 儿子转眼就长大:Hinton、LeCun、Bengio 口述神经网络简史
  2. JDBC的两种sql命令发送器比较【Statement:PreparedStatement】
  3. Spring boot模板引擎
  4. Flask-Login用户登陆
  5. MySQL count函数的具体介绍
  6. Vue.js实现可配置的登录表单
  7. 开发linux版QQ就是支持未来的国产操作系统
  8. IPD流程框架及实施关键点
  9. 准备好了吗?GNN 图神经网络 2021 年的5大应用热点
  10. 毕业设计 基于单片机的万能红外遥控器 - 物联网 嵌入式
  11. 分水岭算法 c语言实现,分水岭算法的应用
  12. 实现对光网络的监控和光路切换 - MEMS 光开关
  13. js多维数组包含有children时,将数组平铺成一维数组
  14. 杨卫华:新浪微博的架构发展历程(转)
  15. v-model 原理及使用
  16. IOS原生生成二维码
  17. FFmpeg给视频添加水印
  18. ur3手眼标定+realsenseL515
  19. 一年级描写下雪的古诗,古诗翻译及重点知识点心田花开汇总
  20. 霸榜世界第一的在线教育App,靠什么增长到3亿用户?

热门文章

  1. vscode妙用 java golang go
  2. Android百科全书目录(第六期)(Android版本适配问题)
  3. Web网页调用本地摄像头、实时获取图片
  4. word输入希腊字母
  5. 计算机毕业设计ssm哈尔滨市合欢婚庆公司管理588fz系统+程序+源码+lw+远程部署
  6. 使用TinyPNG API压缩图片
  7. 王者之争:.NET PK J2EE
  8. C#中语法代码的学习
  9. 中新传媒大厦改造项目中电能管理系统的应用
  10. 假如王思聪是个程序员 (孙一宁 女主角)