本文参考
《大数据日知录》
LSM Tree 学习笔记

概念

LSM-Tree(Log-structured Merge tree)是一种数据结构,它的本质是将大量的随机写操作转换成批量的序列写。
LSM-Tree可以极大提升磁盘数据写入的速度,所以LSM-Tree非常适合对写操作效率有高要求的应用场景。

为何“随机写”改成“序列写”可以提高磁盘写入速度


磁盘每次读写数据,不管你读写的数据有多小,都是会读写一个扇区的数据。

如果使用随机写的方式,每次都需要至少一次的“写扇区”操作。那么如果随机写 n个数据,就需要执行n次“写扇区”的操作。
改成“序列写”之后,只要这n个数据的大小没有超过一个扇区,那么只需要执行一次的“写扇区”操作。

为什么随机写不能通过一次写多个来提高效率?
也是可以的,但是随机写的数据不是顺序存储的,这就意味着还是需要读写多个扇区,所以即使一次写多个,提升的性能也不能与“序列写”相比。

LevelDB静态结构

LevelDB的LSM-Tree结构以及管理过程,是一种非常典型的LSM-Tree的实现,因此本文直接以LevelDB的结构为例来讲解LSM-Tree。

写过程

  1. 写入log文件。(防止意外情况)
  2. 写入内存中的MemTable
  3. 内存中的MemTable大小到达一定程度后,原先的MemTable就变成了Immutable MemTable,并它只可读,不可写。LevelDB后台调用会将Immutable MemTable中的数据存储到磁盘中。
  4. 内存中创建一个新的MemTable,后续的数据写入新的这个MemTable。

LevelDB写入磁盘过程

由上图可知,硬盘中存储的是多个.sst文件,即SSTable(Sorted String Table),SSTable的结构没有什么特别,直接把它当做一个顺序存储的数据结构就可以。

整个操作其实非常简单,直接将Immutable MemTable中的数据存储到多个SSTable,然后将这些SSTable存储到整个SStable数组的头部(也就是Level 0)就可以了。

假设此时硬盘中已经有了两个SSTable,此时硬盘中的内容为:
level 0->tableA
level 1->tableB

此时要插入一个tableC。
那么插入后的硬盘中的数据结构为:
level 0->tableC
level 1->tableA
level 2->tableB

读过程

由上面的写入过程可以了解到,级别较低的SSTable中的内容是更新的。这时候再来看LevelDB的读过程就比较好理解了。

  1. 先去MemTable中读
  2. 如果没有读到就去Immutable MemTable中读
  3. 如果还是没有读到就到硬盘中去读,读的顺序是level从低到高。

读过程举例

假设此刻硬盘中有两个SSTable,结构如下:
level 0->tableA
level 1->tableB
tableA中存储的值为:{“a”:123,“c”:321}
tableB中存储的值为:{“b”:222,“c”:333}

例子一

这时候要读取“a”的value,假设内存中没有读到这个值,那么硬盘中读取的顺序应该是先读取level 0,再读取level 1。
读取level 0的时候直接可以读取到"a"的value为123,于是就返回123。

例子二

这时候要读取“b”的value,假设内存中没有读到这个值,那么硬盘中读取的顺序应该是先读取level 0,再读取level 1。
先读取level 0,发现tableA中并没有“b”这个key的value,于是到level 1中去寻找,在tableB中发现“b”的value为222,于是就返回222。

不同Level的SSTable合并

levelDB会轮流让level高的文件去合并level低的文件的内容,合并完成之后,level高的文件被替换成合并后的文件,level低的文件则被删除。

比如level 0中有A.sst,level 1中有A.sst,两个文件合并后生成A_new.sst, level 1中的A.sst替换成 A_new.sst,level 0 的A.sst则删除。

由于.sst中的内容本身就是有序的,因此合并的过程就非常简单,使用多路归并排序的方式,每次将两个旧文件中最小的key记录,最终就能得到一个新的有序的SSTable,再存储为.sst文件。

由LevelDB理解 LSM-Tree相关推荐

  1. tidb mysql hbase_HBase/TiDB都在用的数据结构:LSM Tree,不得了解一下?

    LSM Tree(Log-structured merge-tree)广泛应用在HBase,TiDB等诸多数据库和存储引擎上,我们先来看一下它的一些应用: 参考资料[4]这么牛X的名单,你不想了解下L ...

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

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

  3. odoo tree视图过滤数据_数据存储结构 LSM Tree PK B TREE (从底层了解数据库设计)...

    随着使用数据库的深度和理解能力的提升,有一个问题硬件的提升,与数据量的变化是否对数据库底层的架构有冲击. 我们公认的BTREE B+TREE  是否还能面对现在的硬件的变化.  BTREE 到底是为那 ...

  4. LSM tree(日志结构合并树)_笔记

    WAL:Write Ahead Log 写前日志,顺序日志文件 1 LSM tree的定义 LSM tree: Log-Structured-Merge-Tree,日志结构合并树. Log-Struc ...

  5. 对于LSM Tree写放大问题的一些浅薄学习

    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可. 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权. 文章目录 引言 性能评估 优化方案 ...

  6. 【大数据哔哔集20210112】Sorry,Hbase的LSM Tree真的可以为所欲为!

    点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多惊喜 我们先抛出一个问题: LSM树是HBase里使用的非常有创意的一种数据结构.在有代表性的关系型数据 ...

  7. LSM Tree介绍及其应用

    1. LSM Tree介绍 1.1 概念 ​B+树读效率高而写效率差:log型文件操作写效率高而读效率差:因此要在排序和log型文件操作之间做个折中,于是就引入了log-structed merge ...

  8. 从LSM Tree COLA Tree谈到StackOverflow OSQA

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 从LSM ...

  9. lsm tree java_LSM-tree 基本原理及应用

    LSM-tree 在 NoSQL 系统里非常常见,基本已经成为必选方案了.今天介绍一下 LSM-tree 的主要思想,再举一个 LevelDB 的例子. 正文 3056 字,预计阅读时间 8 分钟. ...

最新文章

  1. module ‘brotli‘ has no attribute ‘error
  2. springboot开启jms服务监控jvm运行情况
  3. python调用ipython_在IPython中执行Python程序文件的示例
  4. 打工人一次性考过高项的备考指南(52.50.50)
  5. 五款帮助创业者迅速熟悉互联网创业的在线学习工具
  6. 休息一下,或者:如何使用Java 12制作出色的拼图游戏
  7. 计算机教授丁三石,一次难忘的计算机课!!
  8. MySQL json-table-functions
  9. 持续集成部署Jenkins工作笔记0004---Subversion环境要求
  10. python函数递归 斐波那契数列
  11. ubuntu上virsh+kvm安装虚拟机
  12. angularjs ngrepeat filter
  13. 运行.AppImage文件。
  14. Nacos 配置中心原理分Nacos 配置中心原理分析析
  15. 老罗Android开发视频教程 (android常用布局介绍)5集集合
  16. java jdomxml 换行_使用JDOM读写XML的方法
  17. android 之输入法
  18. 《Hands-On Machine Learning with Scikit-Learn TensorFlow》读书笔记(二):端到端的机器学习
  19. gcc-c++安装—使用系统自带的源yum install gcc-c++和本地源进行相应的安装
  20. passwd -l 锁与linux用户属性修改与sbin/nologin区别

热门文章

  1. mysql:将数据库复制到另一个数据库
  2. a href 跳页面 打开新标签
  3. 吵架英语一百句DIY
  4. 麒麟子Cocos Creator实用技巧四:打包原生App截图白屏解决方案
  5. 手把手教做新疆大盘鸡[图]
  6. Android APP 抓包
  7. 我的世界服务器地图种子文件夹,我的世界最好的5个地图种子 可以满足你建造的所有需求...
  8. 基于javaweb的物业缴费管理系统(java+ssm+html+js+jsp+mysql)
  9. 不解压gz文件搜索文件内容
  10. ios 手势交互控制---分解ZFPlayer