Dostoevsky: Better Space-Time Trade-Offs for LSM-Tree Based Key-Value Stores via Adaptive Removal of Superfluous Merging 阅读笔记
Introduction
主流的基于LSM树的KV存储都在两方面进行权衡,一方面是写入更新的开销,另一方面是查询和存储空间的开销。但它们都不是最优的,问题在于这些存储系统在LSM树的每一个level上都采用相同且开销很大的合并策略。论文中提出了Lazy Leveling和Fluid LSM-tree来解决这个问题,同时提出了Dostoevsky模型。
问题的根源
- 写入更新:写入更新的开销主要来自于之后涉及写入的项的合并操作,虽然更大的level上合并操作的代价越大,但是更大的level上合并操作的发生频率更低,因此写入更新在每一个level上花费的代价均等。
- 点查找:可以最小化所有bloom过滤器的FPR之和,以此来减小点查找的代价,当然这也意味着对更小的level的访问频率可能会呈指数级别的下降,因此大多数点查询最终发生在最大的level上。
- 大范围查找:不同level的容量呈指数级别的放大,因此最大的level包含了大多数的数据,那么就更可能包含给定范围的数据,所以大多数大范围查询最终发生在最大的level上。
- 小范围查找:小范围查找只涉及每个run中的一个block,由于所有level上的run的最大个数是确定的,因此小范围查找在每一个level上花费的代价均等。
- 空间放大:最坏情况下,除了最大level外的所有level中的key在最大level中都有重复,因此空间放大主要来自于最大的level。
DESIGN SPACE AND PROBLEM ANALYSIS
tiering和leveling的开销对比如下图(图来自论文)所示:
写入更新
- tiering:一个项在一个level只涉及一次合并操作,花费O(1)时间,一共有L个level,一次合并操作中一次I/O读取一个block涉及B个项,均摊到每个项的开销为O(L/B)。
- leveling:上一个level的每一个run移动到当前level都会触发一次合并操作,因此一个项在一个level上平均会涉及T/2次合并操作,其他分析同tiering,开销为O(L·T/B)。
点查询
最坏情况为零结果点查询。
- tiering:对于零结果点查询,开销来自于当一个run上的bloom过滤器有误报时产生的一次I/O(读取这个run),每个level中最多可能有T个run,一共有L个level,bloom过滤器的FPR是e^(-M/N),因此开销为O(e^(-M/N)·L·T)。
- leveling分析同tiering,开销为O(e^(-M/N)·L)。
当然Monkey模型在不同的level上设置不同的bloom过滤器,可以将点查询的开销优化为上图中的开销。
空间放大
1到L-1的level包含了LSM树1/T的容量,第L个level包含了LSM树(T-1)/T的容量。
- tiering:最坏情况为第L个level中的每个run都包含相同的key,1到L-1的level中的key在第L个level中的每个run中都有重复,因此空间放大为O(T)。
- leveling:最坏情况为1到L-1的level中的key在第L个level中都有重复的key,因此空间放大为O(1/T)。
优化的空间:减少不必要的合并操作,点查询、范围查询和空间放大的开销主要取决于最大的level,而写入更新在每一个level上的开销均等。因此较小的level上的合并操作显著增大写入更新的开销,而对于减少点查询、范围查询和空间放大的开销却没有特别多的帮助。
Lazy Leveling
主要结构:在最大的level采用leveling的合并策略,在其余level采用tiering的合并策略。
与leveling的对比:
- 提升了更新写入的性能
- 点查询、大范围查询和空间放大的复杂度相同
- 小范围查询的性能相似
tiering、leveling、lazy leveling三者开销对比如下图(图来自论文)所示:
- 点查询的分析涉及bloom过滤器的设置,就是个数学问题,详见论文附录。
- 写入更新:1到L-1的level的写入更新开销分析同tiering,第L个level的写入更新开销分析同leveling。
- 空间放大:分析同leveling。
Fluid LSM-Tree
最大的level最多有Z个run,其余level最多有K个run,每一个level有个active run用于合并来自上一个level的run,且这个active run有容量限制,最大的level限制为T/Z,其余level限制为T/K。当一个level中的所有run的容量总和超过了当前level的限制,这些run合并入下一个level。
开销如下图(图来自论文)所示:
- 点查询的分析涉及bloom过滤器的设置,就是个数学问题,详见论文附录。
- 写入更新:分析同tiering。
- 空间放大:最坏情况是1到L-1的level的key均在第L个level有重复,第L个level中有Z-1个run包含的全部都是重复的key。
Dostoevsky模型
写入更新的开销为W,零结果点查询的开销为R,有结果点查询的开销为V,范围查询的开销为Q,通过统计以上四种操作在工作负载中的比例,赋予这四种开销权重系数w、r、v、q,另外计从存储中读取一个block的时间为Ω。我们可以得到吞吐τ的计算公式为:
τ = Ω^-1 · (w · W + r · R + v · V + q · Q)^-1
在实际运行时可以通过对K、Z、T三个参数的动态调整来使得吞吐达到最优。
389 Love u
Dostoevsky: Better Space-Time Trade-Offs for LSM-Tree Based Key-Value Stores via Adaptive Removal of Superfluous Merging 阅读笔记的更多相关文章
- LSM Tree存储组织结构介绍
LSM Tree(Log Structured Merge Trees)数据组织方式被应用于多种数据库,如LevelDB.HBase.Cassandra等,下面我们从为什么使用LSM tree.LSM ...
- LSM Tree解析
引言 众所周知传统磁盘I/O是比较耗性能的,优化系统性能往往需要和磁盘I/O打交道,而磁盘I/O产生的时延主要由下面3个因素决定: 寻道时间(将磁盘臂移动到适当的柱面上所需要的时间,寻道时移动到相邻柱 ...
- LSM Tree 学习笔记——本质是将随机的写放在内存里形成有序的小memtable,然后定期合并成大的table flush到磁盘
The Sorted String Table (SSTable) is one of the most popular outputs for storing, processing, and ex ...
- LSM Tree 学习笔记——MemTable通常用 SkipList 来实现
最近发现很多数据库都使用了 LSM Tree 的存储模型,包括 LevelDB,HBase,Google BigTable,Cassandra,InfluxDB 等.之前还没有留意这么设计的原因,最近 ...
- Log-Structured Merge Tree (LSM Tree)
一种树,适合于写多读少的场景.主要是利用了延迟更新.批量写.顺序写磁盘(磁盘sequence access比random access快). 背景 回顾数据存储的两个“极端”发展方向 加快读:加索引( ...
- 数据映射-LSM Tree和SSTable
Coming from http://blog.sina.com.cn/s/blog_693f08470101njc7.html 今天来聊聊lsm tree,它的全称是log structured m ...
- 【万字长文】使用 LSM Tree 思想实现一个 KV 数据库
目录 设计思路 何为 LSM-Treee 参考资料 整体结构 内存表 WAL SSTable 的结构 SSTable 元素和索引的结构 SSTable Tree 内存中的 SSTable 数据查找过程 ...
- 目标提取深度神经网络分析权衡 trade offs
RCNN: 直接使用object proposal 方法得到image crops 送入神经网络中,但是crops 的大小不一样,因此使用 ROI Pooling,这个网络层可以把不同大小的输入映射到 ...
- L2M-GAN: Learning to Manipulate Latent Space Semantics for Facial Attribute Editing阅读笔记
L2M-GAN: Learning to Manipulate Latent Space Semantics for Facial Attribute Editing 2021 CVPR L2M-GA ...
随机推荐
- Beginning Math and Physics For Game Programmers (Wendy Stahler 著)
Chapter 1. Points and Lines (已看) Chapter 2. Geometry Snippets (已看) Chapter 3. Trigonometry Snippets ...
- delphi 调用QQ邮箱发送邮件
procedure TForm1.FormCreate(Sender: TObject); begin try IdSMTP1.AuthenticationType := atLogin; IdSMT ...
- Python 模块源
1.官方:https://pypi.org/ 2.LFD UCI :https://www.lfd.uci.edu/~gohlke/pythonlibs/ 4.清华源:https://pypi.tun ...
- java安装与配置
参考:https://blog.csdn.net/gaokao2011/article/details/75211429 Win 1.JDK JDK 可以到官网下载http://www.oracle. ...
- SpringBoot启动源码探究---getRunListener()
该方法目的是获取SpringApplicationRunListener getRunListener()-----调用----> getSpringFactoriesInstances()-- ...
- 批处理for中字符串截取必须先把循环变量代替出来才行!!!
@echo off & setlocal enabledelayedexpansion set ifo=abc,def,ghi,jkl,mnopqrstuvwxyz0123456789 ech ...
- Spring编程式事务管理和声明式事务管理
本来想写一篇随笔记一下呢,结果发现一篇文章写的很好了,已经没有再重复写的必要了. https://www.ibm.com/developerworks/cn/education/opensource/ ...
- mysql 存储过程的实现原理
一.描述 存储过程是一组可以完成特定功能的SQL语句集,经编译后存储在数据库中 statement语句(DDL.DML.导出及管理语句等).异常处理.流程控制二.创建存储过程 系统做语句分析,如果没有 ...
- IDEA汉化
1.- 汉化包 提取码: 4mbq 2.打开IDEA,执行下列操作:在主界面选择File → Settings → Appearance&Behavior → Appearance → 勾选O ...
- js 数组 map方法
https://www.cnblogs.com/xuan52rock/p/4460949.html https://jingyan.baidu.com/article/91f5db1b7453471c ...