首页 > 其他分享 >LSM Tree 简笔

LSM Tree 简笔

时间:2024-04-26 10:45:17浏览次数:20  
标签:memTable level LSM Tree DiskTable 简笔 磁盘 数据

LSM Tree

总览

image-20240310212524128

写流程:

image-20240310212629760

  • 就地写,写入memTable
  • 当active memTable 满后,转变为readOnly memTable, 在合适时机flush入磁盘。
  • 当前level数据满后,进行归并操作,把数据排序,去重后转入下一level。

背景介绍

两种场景,读多写少,写多读少。

原地写

写操作:找到老数据所在位置,更新, IO操作,慢。

读操作:空间利用率高。

追加写

写操作:直接追加。

读操作:日志末尾逆序检索,性能不稳定。

LSM Tree适用于写多读少,以写效率为首要目标,保持读效率在容忍范围内。

追加写存在的问题:

  • 空间浪费

    存在多份数据。

  • 读性能低

如何解决空间浪费:

异步运行一个日志压缩线程。对于同一个数据的内容进行合并,保留最新数据。

新的问题:并发的资源竞争问题。

拆分文件解决资源竞争

把本来一个追加写的大文件拆分成一个个小的Table,这样的话,读取操作只需要在较新的Table中进行,旧的Table可以另外异步compact。

image-20231213213024751

如何提高查找性能

在每个表中使得数据有序,引入二分,使得单个表中的查询变成logN级别。

image-20231213213640693

但是这样需要随机存储。与我们追加写的初衷相违背。

在DiskTable的基础上引入memTable(内存表),额外在内存中维护 memTable结构。

  • memTable在内存中缓存
  • memTable本身有序
  • 在memTable的写操作统一采用就地写
  • memTable是用户写操作的唯一入口
  • memTable达到一定数据量后写入磁盘,成为追加DiskTable

为什么引入memTable不会违背我们追加写的初衷,不会违背我们以写效率为目标的初衷呢?

内存随机存储的速度是磁盘随机存储的几百到几千倍

而我们的DiskTable依旧是追加写的形式。

image-20231213215545117

三个新的问题

memTable的数据易失

WAL(write-ahead-log) 预写日志: 在将数据写入memTable前,先将操作写入位于磁盘的log中,保证了可以通过重放WAL来恢复memTable。

为什么日志同样是往磁盘中写入,却不会影响性能?

WAL日志是追加写,磁盘顺序IO,并不会对性能造成过大影响。

image-20231213220302717

memTable写磁盘堵塞

将memTable分为两部分,Active memTable 和 ReadOnly memTable,当一个Active memTable 数据满时,转变为ReadOnly memTable,新的写入会使用新的Active memTable,ReadOnly memTable会进行磁盘持久化。

image-20231213220759977

memTable内部采用什么数据结构

跳表?红黑树?其实都行。

跳表(Skip List):

  • 优势:
    • 有更细的锁粒度,插入时涉及的节点较少。
    • 跳表是一种有序的数据结构,对范围查询有较好的支持。
    • 插入和删除的平均时间复杂度为O(log n)。
    • 实现相对简单,易于理解和调试。
  • 劣势:
    • 跳表的实现相对于红黑树来说,可能会占用更多的空间。
    • 需要维护多个层级,可能增加一些额外的开销。

红黑树(Red-Black Tree):

  • 优势:
    • 在插入和删除等操作方面,红黑树的常数因子较小,可能在某些情况下更快。
    • 红黑树的空间利用率较高,不需要额外的指针。
  • 劣势:
    • 实现相对复杂,难以理解和维护。
    • 对于范围查询,可能性能不如跳表。

有关DiskTable

  • DiskTable内部不存在重复kv数据对,内存就地写。

  • DiskTable内部kv数据对有序,调表/红黑树插入。

  • 每个memTable的视野有限,Table是一个相对较小的单位,解决单个Table的数据冗余并不能解决全局的数据冗余。

如何解决diskTable视野有限的情况?

Table 分层

  • 将磁盘中的文件分为level 0 ~ level k, 一共k + 1 层。
  • 每层的diskTable数量保持一致。
  • level i + 1 的容量是level i 的 T 倍,T 一般取10。
  • 每一层的数据容量满时,会向下层进行归并操作,排序并且去重。

image-20231214090527502

在LSM Tree 中, 在磁盘的存储中,diskTable用特定的数据结构 SSTable(Sorted String Tables) 存储。

  • 因为每一层的diskTable容量是上一层的数倍,在靠下的层次中,diskTable会很大,当我们对其进行读取的时候会显得很笨重。

SSTable做的优化:

  • 数据通常按照某种方式进行分块,使得查询时可以只加载所需范围的块,而不是整个 SSTable。这降低了查询时所需的 I/O 操作,提高了查询效率。
  • 每个SST会维护一组索引信息,记录了每个块的k_min 和 k_max

bloom filter

image-20231214093411199

标签:memTable,level,LSM,Tree,DiskTable,简笔,磁盘,数据
From: https://www.cnblogs.com/haria137/p/18159482

相关文章

  • vue3使用echarts的tree,自己写事件进行分页
    vue3使用echarts的tree,自己写事件进行分页  先到npmjs官网查看当前使用最多的版本https://www.npmjs.com/package/echarts 看了下5.5.0用的最多[email protected] 以下的demo(“@/flare”是后面的flare.json数据)<template><divid="chart-container"></div......
  • CF1709E XOR Tree
    linkSolution:PART1:转化首先套路地预处理出每个节点到根节点(\(1\)号节点)路径上的点权异或和\(w[u]\)。可以发现题意容易转化为:给定一棵\(n\)个节点的树,问你最少可以把它分成多少个联通块,使得每个连通块中的节点两两路径上的异或和不为0。易知对于一个节点,若它要被割......
  • CF771C Bear and Tree Jumps
    题目大意:给定一棵有\(n\)个节点的树,要你统计\(\sum_{1\lex\ley\len}{dist(x,y)/k}\)(\(dist(x,y)\)表示\(x\)到\(y\)的距离)\(n\le2\times10^5,k\le5\)解法:一道换根\(dp\)套路题。首先看到树上统计问题,考虑树形\(dp\),那么我们设\(g(u)\)为以\(......
  • CF911F Tree Destruction
    题目链接:https://www.luogu.com.cn/problem/CF911Fsolution:先求得树的直径,再求得在树的直径上的节点和不在树的直径上的节点。我们考虑优先删除不在直径上的节点,这样不会破坏树的直径,在删完了这些点之后再慢慢删直径上的点。#include<bits/stdc++.h>usingnamespacestd;#def......
  • AGC014D Black and White Trees
    传送门[AGC014D]BlackandWhiteTree给出一颗\(N\)个节点组成的树,每个节点都可以被染成白色或者黑色;有高桥(先手)和青木(后手)两个人————高桥可以把任意一个点染成白色,青木则可以把任意一个点染成黑色,每个点只可染色一次。重复上述操作直到所有点都被染色后,只执行一次执行......
  • 都2024年了,你还不知道git worktree么?
    三年前python大佬吉多·范罗苏姆(为Python程序设计语言的最初设计者及主要架构师)才知道gitworktree,我现在才知道,我觉得没啥丢人的。应用场景如果你正在feature的分支中开发新功能,线上版本紧急错误又需要你基于master做修复。可能有如下几种办法解决:解法1将本......
  • (复习)树上启发式合并(dsu on tree)入门U41492树上数颜色
    主要思想是树的重轻儿子之分使得时间复杂度为o(nlogn),神奇欲深入了解的这里:https://oi-wiki.org/graph/dsu-on-tree/点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedefstructedge//边结构体{intto,next;}EDGE;//边相关数组EDGEe[100001<<1];......
  • UniTreeMenu只展开一个Item,点击主菜单时,不打开最后一个item
    设置:procedureTMainForm.UniTreeMenu1Click(Sender:TObject);varNode:TUniTreeNode;Ts:TUniTabSheet;FrC:TUniFrameClass;Fr:TUniFrame;FClassName,ShowInfo:string;beginNode:=UniTreeMenu1.Selected;ifNode.Tag>1000thenbeginTs:=Node.Data;......
  • Codeforces 1824C LuoTianyi and XOR-Tree
    考虑到肯定如果能在这个节点让子树的值尽量相同肯定更好,这样子不会与上面的操作相冲突。于是有个\(\text{DP}\)的思路。记\(f_{u,i}\)为\(u\)子树内叶子节点的值都变为\(i\)的最小代价。这个有一个很好的性质,就是\(\maxf_{u,i}-\minf_{u,i}=1\)。这是因为考......
  • P6018 [Ynoi2010] Fusion tree 题解
    题目链接:Fusiontree大部分人貌似用的边权01Trie,实际这题用点权01Trie类似文艺平衡树去写更方便。考虑两种常见的区间维护:线段树。使用的是父节点信息是归并了左右区间的信息,适用于不需要考虑父节点的贡献的信息。文艺平衡树。每个点就是一个信息,归并左右子树,外加当......