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的开销对比如下图(图来自论文)所示:

  1. 写入更新

    • 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)。
  2. 点查询

    最坏情况为零结果点查询。

    • 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过滤器,可以将点查询的开销优化为上图中的开销。

  3. 空间放大

    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的对比:

  1. 提升了更新写入的性能
  2. 点查询、大范围查询和空间放大的复杂度相同
  3. 小范围查询的性能相似

tiering、leveling、lazy leveling三者开销对比如下图(图来自论文)所示:

  1. 点查询的分析涉及bloom过滤器的设置,就是个数学问题,详见论文附录。
  2. 写入更新:1到L-1的level的写入更新开销分析同tiering,第L个level的写入更新开销分析同leveling。
  3. 空间放大:分析同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。

开销如下图(图来自论文)所示:

  1. 点查询的分析涉及bloom过滤器的设置,就是个数学问题,详见论文附录。
  2. 写入更新:分析同tiering。
  3. 空间放大:最坏情况是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 阅读笔记的更多相关文章

  1. LSM Tree存储组织结构介绍

    LSM Tree(Log Structured Merge Trees)数据组织方式被应用于多种数据库,如LevelDB.HBase.Cassandra等,下面我们从为什么使用LSM tree.LSM ...

  2. LSM Tree解析

    引言 众所周知传统磁盘I/O是比较耗性能的,优化系统性能往往需要和磁盘I/O打交道,而磁盘I/O产生的时延主要由下面3个因素决定: 寻道时间(将磁盘臂移动到适当的柱面上所需要的时间,寻道时移动到相邻柱 ...

  3. LSM Tree 学习笔记——本质是将随机的写放在内存里形成有序的小memtable,然后定期合并成大的table flush到磁盘

    The Sorted String Table (SSTable) is one of the most popular outputs for storing, processing, and ex ...

  4. LSM Tree 学习笔记——MemTable通常用 SkipList 来实现

    最近发现很多数据库都使用了 LSM Tree 的存储模型,包括 LevelDB,HBase,Google BigTable,Cassandra,InfluxDB 等.之前还没有留意这么设计的原因,最近 ...

  5. Log-Structured Merge Tree (LSM Tree)

    一种树,适合于写多读少的场景.主要是利用了延迟更新.批量写.顺序写磁盘(磁盘sequence access比random access快). 背景 回顾数据存储的两个“极端”发展方向 加快读:加索引( ...

  6. 数据映射-LSM Tree和SSTable

    Coming from http://blog.sina.com.cn/s/blog_693f08470101njc7.html 今天来聊聊lsm tree,它的全称是log structured m ...

  7. 【万字长文】使用 LSM Tree 思想实现一个 KV 数据库

    目录 设计思路 何为 LSM-Treee 参考资料 整体结构 内存表 WAL SSTable 的结构 SSTable 元素和索引的结构 SSTable Tree 内存中的 SSTable 数据查找过程 ...

  8. 目标提取深度神经网络分析权衡 trade offs

    RCNN: 直接使用object proposal 方法得到image crops 送入神经网络中,但是crops 的大小不一样,因此使用 ROI Pooling,这个网络层可以把不同大小的输入映射到 ...

  9. 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 ...

随机推荐

  1. rust visual studio editoe & debugger

    step Visual studio Try VisualRust-0.1.2 (1).msi, error. find no vs2017 extension. try RustLanguageEx ...

  2. django 防止xss攻击标记为安全的二种方法

    str='<a href="/page?page=1">1</a>' 一,在前端模板语言中实现,只须用到帮助函数safe.如: {{ str|safe }} ...

  3. 洛谷P1038 神经网络(bfs,模拟,拓扑)

    题目背景 人工神经网络(Artificial Neural NetworkArtificialNeuralNetwork)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸 ...

  4. javaAgent介绍

    JavaAgent(转载) http://www.cnblogs.com/diyunpeng/archive/2011/05/26/2057932.html 一文带你了解Java Agent http ...

  5. 通过c++11的condition_variable实现的有最大缓存限制的队列

    之前曾写过一个通过C++11的condition_variable实现的有最大缓存限制的队列,底层使用std::queue来实现,如果想要提升性能的话,可以考虑改用固定的长度环形数组.环形数组实现如下 ...

  6. Linux常用命令 笔记

     Linux常用命令  笔记 一.文件处理命令 1. ls命令:显示目录文件                          -a 显示所有文件,包括隐藏文件.(all)               ...

  7. linux git 保存账号密码

    vi .git/config [credential] helper = store git pull 输入用户名.密码自动保存

  8. windows 与 mac socket通信

    #include <Winsock2.h> #include <stdio.h> void main() { // 以下的几句都是固定的 WORD wVersionReques ...

  9. Python多线程thread、threading(一)

    Python多线程(一) Python多线程,类似于同时执行多个不同程序,多线程运行的有点: 1.使用线程可以把占据长时间的程序中的任务放到后台去处理 2.用户界面可以更加吸引人,这样比如用户点击了一 ...

  10. mysql查看及设置最大连接数

    #查看: show variables like '%max_connections%'; #设置: set GLOBAL max_connections = 1000;