合并日志树——LSM Tree

2023-11-05

一、背景

大数据情景下,需要巨量的读写数据,即良好的IO效率。传统的B树以及其变种无法满足,因为它的读写在物理上是随机的,这样IO的效率就不高。于是便有了LSM(log_structed_merge_tree) 合并日志树这个设计思想或者说存储结构。他在大数据的存储上广泛引用(HBase,Kudu,Clickhouse的MergeTree等),它的处理情景是将随机读写操作变成顺序读写操作,从而提高IO效率。

二、设计思想

LSM是通过顺序读写来提高IO 效率,所以它的存储数据结构就是要保证有序。

如图所示,LSM的存储是分层的(内存和磁盘),主要有4个角色

1:memTable

        按照Key有序的组织数据,用于保存最新的数据。常用的数据结构有:map,红黑树,跳表。因为是在内存,为了防止断电丢失数据,所以有磁盘的备份,预写式日志WAL(write-ahead-logging)

2: immutable memtable

        当memTable达到阈值后,会溢写到immutable memtable(不可改变内存表),然后再flush到磁盘中

3: SStable ( Sorted String Table ) , 有序字符表

        这里因为数据量大,且可能存在冗余数据(一个key不同的值),所以为了保证读取的是正确的有效的,需要顺序读取所有的数据,从memTable开始。所以查询策略上是有做优化的,常见的有建立key的所以或者布隆过滤器。 明显读取的性能是收到影响的

4: BlockCache

        缓存读取的SSTable数据,用于加快读取的速度。


这里现在 合并结构化日志树的 结构化是体现了,数据都是键值形式,那么日志是体现在哪里?

        传统的数据库B树是直接在原有的数据所在处直接修改值,而LSM为了顺序写,他的数据更新是日志式的,即记录的数据是操作日志,记录的方式是append。

这样的记录方式肯定是会有数据冗余,例如插入一条数据,后续有更改,那么在不同的SStable中会有两条数据,怎么办? 这就体现在  合并上

        LSM会将SStable进行合并,不同的合并策略有不同的优缺点。

合并结构化日志树的数则是体现在数据结构

     在 memTable和 SSTable都是采用了树。  memTable是map,红黑树,跳表。

SSTable则是类似B树。


三、增删改查

1:增和该记录

        在memTable和WAL增加记录,然后等待后续的flush和compact。最后增加和修改磁盘的数据

2:删除记录

       在memTable和WAL增加记录,然后在需要删除的数据上打一个标签(tombstone),最后等待compact操作将数据从磁盘中删除。

3: 查操作

        从memTable 开始查询,如果命中了则返回,没有则继续顺序查询直至查到。可见如果运气不好可能需要查询所有的数据,因此这里有不同的优化策略,给key做索引和布隆过滤器。

四、总结

        LSM树是牺牲了部分的读取性能来换取写入性能。

参考:

最容易理解的LSM树--以示例讲解合并查找过程_lsm树 例子_土豆西瓜大芝麻的博客-CSDN博客

 LSM Tree-Based存储引擎的compaction策略(feat. RocksDB) - 简书

LSM树详解 - 知乎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

合并日志树——LSM Tree 的相关文章

随机推荐

  • 解析 Linux 内核可装载模块的版本检查机制

    解析 Linux 内核可装载模块的版本检查机制 王 华东 系统工程师 自由职业者 简介 为保持 Linux 内核的稳定与可持续发展 内核在发展过程中引进了可装载模块这一特性 内核可装载模块就是可在内核运行时加载到内核的一组代码 通常 我们会
  • js获取到的时间减1秒或加1秒

    如题 使用时间戳来计算 function setDate time isAdd var date getCurTime time 也可以直接透传如 2021 5 8 var d new Date date var t s d getTime
  • 闲鱼把各种玩法做成了一个平台:哆啦A梦

    玩法平台背景 在闲鱼内我们把供给用户的闲鱼红包 支付宝红包 包邮券 宝卡等统称为用户权益 是闲鱼用户运营的重要策略 在拉新 留存 促活 裂变等方面都展现了其重要价值 在阿里内部管理权益的平台是拉菲 拉菲对外提供概率抽奖和领奖两种能力 各个业
  • 为什么gbk编码常用抽取正则表达式无法抽取“嘚瑟“的“嘚”字

    根据 GBK汉字内码扩展规范编码表 http ff 163 com newflyff gbk list 可以查到 嘚 字的编码为874e 而我们常用的gbk汉字抽取正则表达式为 x80 xff x80 xff 以python正则为例 抽取汉
  • Python基础--入门基础和数据类型测试题(二)

    Made By Zly All Right Reversed 上一篇 篇四 Python 入门基础和数据类型测试题 二 1 以下不属于Python语言保留字的是 A do B pass C while D def 2 表达式3 4 2 8
  • 第一讲 检索系统与数据库编程

    第一讲 检索系统与数据库编程 准备工作 1 检索系统 1 1 检索系统初识 1 1 1 什么是检索系统 1 1 2 从认知心理学看待检索系统 1 2 检索系统的四大法宝 1 2 1 检索的工具 结构化查询语言 SQL 1 2 2 检索的环境
  • Electron-builder打包和自动更新

    前言 文本主要讲述如何为 electron 打包出来软件配置安装引导和结合 github 的 release 配置自动更新 electron builder 是将 Electron 工程打包成相应平台的软件的工具 我的工程是使用 elect
  • C语言小知识点

    1 LPCSTR被定义成是一个指向以 0 结尾的常量字符指针 LPWSTR是wchar t字符串 例子 LPWSTR lpwstr NULL LPWSTR lp T asdfasgaf 2 之所以能够实现条件编译是因为预编译指令是在编译之前
  • HTTP请求头和响应头详解【转】

    最近老猿在开始学习爬虫相关的知识 由于老猿以前只做非web的后台应用 发现相关知识太过匮乏 导致学习很困难 为此不得不从一些基础知识恶补开始 对于这些知识 老猿会将网上找到的比较认可的内容直接转发 下面文章关于http头部信息讲解的非常详细
  • springboot笔记总结

    springboot 1 Javaconfig Configuration 放在类的上面 这个类相当于 xml 配置文件 可以在其中声明 bean Bean 放在方法的上面 方法的返回值是对象类型 这个对象注入到 spring ioc 容器
  • 字典排序算法(通俗易懂)

    我们先看一个例子 示例 1 2 3的全排列如下 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 我们这里是通过字典序法找出来的 那么什么是字典序法呢 从上面的全排列也可以看出来了 从左往右依次增大 对这就是字典序法
  • Java中 ? extends T 和 ? super T 的理解

    通配符类型
  • (转)如何有效地管理好技术团队?

    转自 https cn 100offer com blog posts 307 技术管理是一个综合性岗位 要求你具有技术能力 管理能力 也要懂一些心理学 情商也要高一些 说实话 你想做好这个岗位 真的不容易 尤其是在中国 我相信今天的分享过
  • 策略+工厂+反射记录一次switch代码简化过程

    遇到的问题 一张记录表 记录了10个业务的字段 一个入参type说明了要修改哪个字段 最初是通过switch type case 来做的 但是涉及这样子的判断多了 每次都要不断的switch 并且case里面不同方法有不同的处理 一个公共的
  • 河南省历年高考人数(2004-2021)

    河南省历年高考人数 2004 2021 年份 人数 万人 2004 59 55 2005 72 2006 78 2007 87 88 2008 98 8 2009 95 9 2010 95 24 2011 85 5 2012 80 5 20
  • 系统还原服务器,服务器系统还原

    服务器系统还原 内容精选 换一换 1 说明2 制作系统还原盘3 测试恢复还原1 说明http clonezilla nchc org tw clonezilla live download clonezilla live 2 6 7 28
  • 单调队列的学习 - 滑动窗口求最大/小值 (Leetcode 239, Sliding Window Maximum)

    这几天在学习单调队列和单调栈 感觉下面几篇博客讲的比较好 http www cnblogs com saywhy p 6726016 html http dping26 blog 163 com blog static 1795662172
  • 基于UDP实现双工通信(JAVA)(多线程)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 总结 前言 写个基础的JAVA网络程序 实现双工通信 一 两个类 1 一个累 代码如下 示例 import java io IOException impor
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 合并日志树——LSM Tree

    一 背景 大数据情景下 需要巨量的读写数据 即良好的IO效率 传统的B树以及其变种无法满足 因为它的读写在物理上是随机的 这样IO的效率就不高 于是便有了LSM log structed merge tree 合并日志树这个设计思想或者说存