首页 > 其他分享 >LSM树学习笔记(2)

LSM树学习笔记(2)

时间:2023-07-24 21:23:25浏览次数:33  
标签:文件 LSM 写入 笔记 学习 过滤器 排序 数据 我们

SSTables

LSM(log-structured merge-tree)树使用排序字符串表(SSTable:Sorted Strings Table)格式持久化到磁盘。顾名思义,SSTable是一种用于存储键值对的格式,其中的键是按排序排列的。SSTable由多个被称为段的有序文件组成。这些段一旦写入磁盘就不可更改。一个简单的例子如下:

可以看到,每个段中的键值对都是按键排序的。将在下一节讨论什么是段以及如何生成段。

 

写入数据

LSM树只能执行顺序写入。你可能想知道,当数据值可以以任何顺序写入时,我们如何以排序格式顺序写入数据。这可以通过使用内存树结构来解决。这种结构通常被称为内存表(memtable),但其底层数据结构通常是某种形式的排序树,如红黑树。当写入数据时,数据会被添加到这棵红黑树上。

我们写入的内容会存储在这棵红黑树上,直到这棵树达到预定义的大小。一旦红黑树有了足够的条目,它就会按排序顺序作为磁盘段刷新到磁盘上。这样,即使插入可能以任何顺序进行,我们也能以单次顺序写入的方式写入段文件。

 

读数据

那么,我们如何在SSTable中找到一个值呢?最简单的方法是扫描段,查找所需的键。我们将从最新的数据段开始,一直到最老的数据段,直到找到我们要找的键。这意味着我们能更快地检索到最近写入的键。一个简单的优化方法是保留一个内存稀疏索引。

我们可以使用该索引快速找到我们想要的键前后的值的偏移量。现在,我们只需根据这些边界扫描每个段文件的一小部分即可。例如,假设这样一种情况,我们想查找上面段中的键:doller。我们可以在稀疏索引上执行二叉搜索,找到dollar位于dog和downgrade之间。现在,我们只需从偏移量17208到19504之间进行扫描,即可找到该值(或确定该值不存在)。

这是一个很好的改进,但如果查找不存在的记录呢?我们最终还是会在所有数据段文件中循环,却无法在每个数据段中找到键。这就需要一个Bloom过滤器来帮助我们解决这个问题。bloom过滤器是一种节省空间的数据结构,可以告诉我们数据中是否不存在某个值。我们可以在写入条目时将其添加到bloom过滤器中,并在读取开始时对其进行检查,以便有效地响应对不存在的数据请求。

 

压缩
随着时间的推移,系统在持续运行时会积累更多的段文件。这些段文件需要清理和维护,以防止段文件数量失控。这是"压缩"的进程的职责。压缩是一个后台进程,它不断地将旧的段合并成新的段。

从上面的示例中可以看出,第1和第2段都有一个键"dog"。较新的数据段包含最新写入的值,因此数据段2中的值会被转入数据段4中。一旦压缩过程写入了新的段,旧的段文件就会被删除。

 

删除数据
如果段文件被认为是不可变的,那么如何从SSTable中删除数据呢?实际上,删除与写入数据的路径完全相同。只要收到删除请求,就会为该键写入一个称为"tombstone"的唯一标记。

上面的示例显示,键dog在过去的某个时刻的值是52,但现在它有了一个"tombstone"标记。这表明,如果我们收到对key dog的请求,我们应该返回一个表示该键不存在的响应。这意味着删除请求最初实际上会占用磁盘空间,许多开发人员可能会对此感到惊讶。最终,"tombstone"会被压缩掉,使值不再存在于磁盘上。

 

结论
我们现在了解了基本的LSM树存储引擎是如何工作的:
1.写存储在内存树(也称为 memtable)中。如有必要,还会更新任何支持的数据结构(bloom 过滤器和稀疏索引)。
2.当这棵树变得过大时,就会将键按排序顺序刷新到磁盘上。
3.当读取数据时,会检查Bloom过滤器。如果Bloom过滤器显示该值不存在,就会告诉客户端找不到该键。如果Bloom过滤器显示该值存在,就开始从最新到最旧迭代段文件。
4.对于每个分段文件,都会检查稀疏索引,并扫描预计能找到键的偏移量,直到找到键为止。一旦在段文件中找到该值,将立即返回。

标签:文件,LSM,写入,笔记,学习,过滤器,排序,数据,我们
From: https://www.cnblogs.com/abclife/p/17575951.html

相关文章

  • inno setup打包软件学习
    目录一 打包结果二示例打包脚本三错误解决3.1另一个程序正在使用此文件,进程无法访问3.2桌面图标无法修改四参考资料一 打包结果二示例打包脚本使用打包软件下载地址:innosetup-6.2.2.exeUS7,1552023-02-15UnicodeInnoSetup self-installingpackage.#defineMyAppName......
  • 价值年薪70W的JAVA进阶学习路线!终于让我从阿里P8手里抠出来了
    作为一个男人我感觉必须得做点什么来证明一下自己,现在我又回来了,准备把自己的节操准备补一下。另外给各位未来的Java程序员说一句,别的我不清楚,学习编程请从一而终咱们学习编程就挺难的,有这些先驱者来带领咱们学习,咱们应该感激,而且最重要的事跟着你选定的一家一直学下去因为每家学校......
  • Avalonia开发笔记
    官网:https://avaloniaui.net/源码:https://github.com/AvaloniaUI/Avalonia目前最新版本:11.0.0(2023/7/24)最新的11.0.0版本相对于之前的版本,改动比较大。因为刚刚升级,可能还有一些问题。目前基于Avalonia的控件都已经升级,不过也有一些控件是还没有升级的,类似OxyPlot.Ava......
  • TVM编译深度学习模型
    QuickStartTutorialforCompilingDeepLearningModels本文将展示如何使用Relaypython前端构建神经网络,并使用TVM为NvidiaGPU创建实时运行库,需要有cuda版本的TVM和llvm。TVM支持的硬件后端图中展示了TVM目前支持的硬件后端将选择cuda和llvm后端,首先导入Relay和TVMimpo......
  • 关于菜鸡学习RHEL8的一些小笔记--->linux上的ssh远程
    远程:*在日常使用中,windows系统可以使用远程桌面来管理远程的windows操作系统*而在Linux上,可以使用openssh套件来进行管理(默认安装)在openssh上是使用安全加密的套接字通信方式openssh:openssh是一个典型的C/S架构,同时拥有openssh-clent客户端以及openssh-server服务端,如下所示:通过ssh......
  • Docker学习路线10:容器安全
    容器安全是实施和管理像Docker这样的容器技术的关键方面。它包括一组实践、工具和技术,旨在保护容器化应用程序及其运行的基础架构。在本节中,我们将讨论一些关键的容器安全考虑因素、最佳实践和建议。容器隔离隔离对于确保容器化环境的强大性和安全性至关重要。容器应该相互隔离,......
  • c++学习经验总结
    1.关于结构体中定义函数在C++中,结构体中定义函数没问题在C中,则不行。会报expectedspecifier-qualifier-listbefore...2.在C++中,结构体与类的区别:在C++中,结构体是一种特殊形态的类。结构体和类的唯一区别就是:结构体和类具有不同的默认访问控制属性。3.C与C++中结构体......
  • vue 笔记暂存
    目录1:什么是Vue.js2:MVC和MVVM。3:为什么要学习前段框架4:框架和库的区别5:怎么使用Vue。6:常见的Vue指令7: 五大事件修饰符8:在vue中使用class样式9:使用内联样式 10:v-for指令11:v-if和v-show指令 小技巧:注意:总结:1:什么是Vue.js1.1:Vue.js 是目前最火的一个前端框架......
  • Python学习笔记:递归、闭包以及装饰器
    一、首先,什么是递归?首先,简单来说递归就是在运行的过程中不断调用自身,从而完成“递”和“归”两个过程。在Python当中递归函数也是这个道理,通过直接或者间接调用函数本身就叫递归函数。注:在Python中编写递归函数一定要有结束条件否则会导致内存溢出。1、Python案例:​ 首先......
  • (数据科学学习手札153)基于martin的高性能矢量切片地图服务构建
    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes1简介大家好我是费老师,在日常研发地图类应用的场景中,为了在地图上快速加载大量的矢量要素,且方便快捷的在前端处理矢量的样式,且矢量数据可以携带对应的若干属性字段,目前主流的做法......