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

news2024/11/15 16:59:08


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

LSM-tree的开源实现:LevelDB

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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/171130.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java基础漏洞(四)

&#xff08;1&#xff09;递归调用的内存 我们定义一个类A&#xff0c;在类A中定义方法test来验证递归。在程序中&#xff0c;当条件符合的时候会不断的递归&#xff0c;只有遇到终止条件时才不再递归&#xff0c;然后便会执行递归语句之下的语句。 如以下程序&#xff1a;当…

高效节能 | 智慧灯杆综合管理解决方案

智慧灯杆的应用越来越广泛&#xff0c;园区、景区、道路照明&#xff0c;三站一场等户外场所大规模铺设路灯&#xff0c;通过智慧物联平台远程控制&#xff0c;可以实现高效节能和智能化运维管理。以解决传统运维管理中&#xff0c;不同路线路灯设备控制不统一&#xff0c;设备…

Yjs解析

本文引用自 摸鱼wiki 1. YATA算法解析 YATA算法是Yjs库的核心冲突解决算法&#xff0c;这里主要讲解下这个算法成立的三个规则&#xff1a; 规则1&#xff1a;禁止发生冲突的插入操作之间的origin连线&#xff08;红线&#xff09;发生交叉。 如上图所示&#xff0c;图中展示…

IDEA创建SpringBoot的Web项目,并使用外部Tomcat

IDEA创建SpringBoot的Web项目&#xff0c;并使用外部Tomcat 目录IDEA创建SpringBoot的Web项目&#xff0c;并使用外部Tomcat一、创建工程二、使用外部Tomcat一、创建工程 1.首先新建一个springboot的war工程&#xff0c;并且将外部的Tomcat整合进我们的idea中&#xff0c;我们…

GW1NSR-LV4CQN48GC6/I5 FPGA呼吸灯

环境 pwm.v $ cat pwm.v module Pwm( input clk, input [31:0] period, input [31:0] duty, output pwmout ); reg [31:0] counter; reg r_pwmout; always (posedge clk) begin if(counter < duty) begin r_pwmout 1; end…

裸机与RTOS到FreeRTOS基础 | FreeRTOS一

目录 一、裸机与RTOS 1.1、裸机 1.2、RTOS 二、FreeRTOS简介 2.1、介绍 2.2、特点 2.3、如何查找相关资料 三、FreeROTS基础 3.1、任务调度 3.2、任务状态 一、裸机与RTOS 1.1、裸机 不带操作系统&#xff0c;又称为前后台系统&#xff0c;前台系统指中断服务函数&a…

docker搭建Openldapphpldapadmin

1&#xff1a;拉取镜像 docker pull osixia/openldap:1.5.0 docker pull osixia/phpldapadmin:0.9.0 2: 编写docker-compose.yaml cd /data/docker/ldap vi docker-compose.yaml docker-compose.yaml内容如下&#xff1a; version: 3.1 services:openldap:image: osixia/o…

python入门常用知识

文章目录前言一、定义二、Tips1.常用方法2. 常用modulestatistics 统计分析常用模块SciPy 算法及统计分析库总结前言 本文用来记录在使用python时一些基础的定义、基础用法或Tips。 一、定义 多变量定义&#xff1a; a, b, c 0, 0, 0数组定义&#xff1a; # 变量定义 a …

CANN 2022 | 开放升级,跃升新台阶

每一位开发者&#xff0c;都是改变世界的力量每一位开发者&#xff0c;都在创造一往无前的AI时代每一位开发者&#xff0c;都在2022砥砺前行&#xff0c;期待在2023再露锋芒逆光而行&#xff0c;只为拂晓回忆2022&#xff0c;哪些年度关键事件让你记忆犹新&#xff1f;是披星戴…

聊聊红黑树,B/B+树和键树

RB树 RB树和AVL树类似&#xff0c;是一种自平衡式的平衡二叉搜索树&#xff0c;AVL不是保证平衡因子不能超过1&#xff0c;红黑的话没有这个要求&#xff0c;他的结点非黑即红&#xff0c;可以达到Logn的查找&#xff0c;插入&#xff0c;删除 RB树的五条性质&#xff1a; 1…

【markdown】语法 添加`emoji`表情

&#x1f4bb; 【markdown】语法添加emoji表情&#x1f3e0;专栏&#xff1a;其他 &#x1f440;个人主页&#xff1a;繁星学编程&#x1f341; &#x1f9d1;个人简介&#xff1a;一个不断提高自我的平凡人&#x1f680; &#x1f50a;分享方向&#xff1a;目前主攻前端&#…

与资源限制有关的题目

文章目录0、资源限制技巧汇总1、题目一&#xff1a;40亿个数&#xff0c;内存限制为1G&#xff0c;如何找到出现次数最多的数2、题目二&#xff1a;40亿个数&#xff0c;内存限制为10MB&#xff0c;找到所有未出现过的数进阶问题1&#xff1a;40亿个数&#xff0c;内存限制为3K…

【计算机体系结构-02】机器模型

1. 机器模型 (Machine Model) 计算机的基本工作就是进行运算&#xff0c;那么计算就需要有用来处理计算方法的处理单元和提供或保存数值的存储单元。一般将用来处理计算方法的处理单元称为 算术逻辑单元 (ALU--Arithmetic Logic Unit)。在一个计算过程中可能会是这样的一个流程…

springboot整合flowable

自动部署 流程图提前画好&#xff0c;放入 指定文件夹 配置&#xff1a; spring.datasource.usernameroot spring.datasource.passwordroot # nullCatalogMeansCurrenttrue 自动生成表 spring.datasource.urljdbc:mysql:///flowable_process?serverTimezoneUTC&nullCat…

CISP_VULHUB_HACK ME PLEASE

vulhub_HACK ME PLEASE简介扫描开放端口探测web服务搜集seedms的信息登录mysql&#xff0c;尝试获得seeddms的密码利用RCE漏洞提权简介 靶机链接&#xff1a;https://www.vulnhub.com/entry/hack-me-please-1,731/难度&#xff1a;简单描述&#xff1a;一个完全为OSCP设计的简…

数据结构之经典八大排序的实现(万字详谈)

文章目录前言1.插入排序2.希尔排序3.选择排序4.堆排序5.冒泡排序6.快速排序hoare方式版本快排实现非递归方式实现快排挖坑法实现快排前后指针法(双指针法&#xff09;快排的各种优化1.减少后几层的递归调用(小区间优化&#xff09;2.三数取中优化3.三路划分(处理大量重复数据&a…

信息论复习—信息的度量

目录 离散信源信息的度量&#xff1a; 离散信源的信息量&#xff1a; 单符号离散无记忆信源&#xff1a; 离散无记忆信源及熵&#xff1a; 自信息&#xff1a; 信息量的定义&#xff1a; 信息熵的定义&#xff1a; 熵的性质&#xff1a; 离散信源的最大熵定理&#xf…

Elasticsearch高级查询—— 关键字精确查询文档

目录一、初始化文档数据二、字段匹配查询文档2.1、概述2.2、示例一、初始化文档数据 在 Postman 中&#xff0c;向 ES 服务器发 POST 请求 &#xff1a;http://localhost:9200/user/_doc/1&#xff0c;请求体内容为&#xff1a; {"name":"张三","age&…

LINUX学习之了解系统目录结构(一)

前言 Linux 系统目录结构是一个由各种目录和文件组成的树形结构&#xff0c;每个目录都有特定的用途。在这篇文章中&#xff0c;我们将讨论 Linux 系统中最常见的目录&#xff0c;并解释它们的用途 登录系统后输入ls命令查看系统目录 树状目录结构图 系统常用目录 目录名描述…

单目相机标定实现--张正友标定法

文章目录一&#xff1a;相机坐标系&#xff0c;像素平面坐标系&#xff0c;世界坐标系&#xff0c;归一化坐标系介绍1&#xff1a;概述公式二:实现1&#xff1a;整体流程4&#xff1a;求出每张图像的单应性矩阵并用LMA优化5&#xff1a;求解理想无畸变情况下的摄像机的内参数和…