传统关系型数据库大都使用B-Tree或其变体作为存储结构,能够进行高效查找。但保存在磁盘中时它也有一个明显的缺陷,那就是逻辑上相离很近但物理却可能相隔很远,这就可能造成大量的磁盘随机读写。因此对于关系型数据库来说随机读写比顺序读写慢很多,为了提升IO性能,我们需要一种能将随机操作变为顺序操作的机制,于是便有了本篇要讲的LSM树。LSM树能让我们进行顺序写磁盘,从而大幅提升写操作,作为代价的是牺牲了一些读性能。因此在大数据生态下,很多数据库引擎都是使用LSM树存储引擎。


数据结构(一)、二叉树(BT),二叉查找树(BST),平衡二叉树(AVL树)

数据结构(二)、红黑树(RBT)

数据结构(三)、B树,B+树,B*树

目录

背景

存储引擎

原理

尾巴


背景

1996年,一篇名为 The Log Structured Merge Tree(LSM-tree)的论文创造性地提出了日志结构合并树( Log Structured Merge Tree)的概念,该方法既吸收了日志结构方法的优点,又通过将数据文件预排序克服了日志结构方法随机读性能较差的问题。尽管当时 LSM-tree新颖且优势鲜明,但它真正声名鹊起却是在 10年之后的 2006年,那年谷歌的一篇使用了 LSM-tree技术的论文 Bigtable: A Distributed Storage System for Structured Data横空出世,在分布式数据处理领域掀起了一阵旋风,随后两个声名赫赫的大数据开源组件( 2007年的 HBase与 2008年的 Cassandra,目前两者同为 Apache顶级项目)直接在其思想基础上破茧而出,彻底改变了大数据基础组件的格局,同时也极大地推广了 LSM-tree技术。

LSM树 相比 B+树能提高写性能的本质原因是:无论是磁盘还是SSD,都有随机读写慢,顺序读写快的问题。

存储引擎

目前常见的主要的三种存储引擎是:

  • 哈希存储引擎:哈希表的持久化实现,支持增、删、改以及随机读取操作,但不支持顺序扫描,对应的存储系统为key-value存储系统。对于key-value的插入以及查询,哈希表的复杂度都是O(1),明显比树的操作O(n)快,如果不需要有序的遍历数据,哈希表就是正确的选择。
  • B树存储引擎:B树的持久化实现,不仅支持单条记录的增、删、读、改操作,还支持顺序扫描(B+树的叶子节点之间的指针),对应的存储系统就是关系数据库(如:Mysql)。
  • LSM树存储引擎:和B+树存储引擎一样,支持增、删、读、改、顺序扫描操作。而且通过批量存储技术规避磁盘随机写入问题。当然凡事有利就有弊,LSM树和B+树相比,LSM树牺牲了部分读性能,用来大幅提高写性能。

原理

LSM树真正发扬光大是从Google的BigTable论文起:

由图上可以看出,LSM树的读写原理分解下来就是下面几个步骤:

写请求操作

  1. 先将数据写入log文件,当内存储中的memtable数据丢失时可以从log文件中恢复。log文件中的数据不会进行排序;
  2. 将数据写入内存储中的memtable,若命中数据则更新,否则插入新数据。memtable中的数据会按key值排序,通常使用AVL,红黑树的数据结构进行索引;
  3. 当memtable的大小达到一定规模时会将数据连同索引一起写入磁盘,即sstable文件;
  4. memtable的数据持久化sstable中后,log文件中的内容被清空;
  5. 后台compaction线程根据策略对sstable文件进行合并,由于sstable内是有序的,合并的过程很快;

读请求操作

  1. 查找内存储中的memtable,若命中则返回,否则进行下一步;
  2. 在内存储中没有找到数据,就会逆序查找sstable,直到命中数据,由于sstable是有序的,所以查找过程比较高效;

在上面的简要过程中我们可以看出,由于LSM树的增删改操作对于磁盘都是纯粹的append-only操作(追加sstable文件),因此LSM树相比于B树的写入节点会分裂重平衡更加高效。而在读数据时会依次查找sstable文件,直至查到数据,同时由于在写数据的时候生成的sstable文件过多,读性能会递减,虽然后台会有线程对sstable文件进行合并,但还是会影响到LSM树的读性能。

WAL:在一些基于LSM树的实现中,使用WAL(Write-Ahead Logging)预写日志保证数据完整性,就是上面图中的tablet log;类似于ES的translog:Elasticsearch核心原理

布隆过滤器:由于sstable文件数量越多,LSM树的读性能就越低,因此在一些LSM树的实现中使用布隆过滤器(bloom filter)来优化读性能。关于布隆过滤器在之前的文章中有过介绍:布隆过滤器

尾巴

随着数据爆炸和SSD的出现,越来越多的新兴数据库选择LSM树,比如最近很热的HTAP数据库TiDB、Esgyn 和大数据生态的nosql数据库hbase、Cassandra、RocksDB等等,它对数据的写入性能有很大的提升,同时用LSM树做列存储,数据压缩的效果比行存的B+树也要好很多。由于SSD的存在,随机读性能比B+树也不会差太多。

希望本文对你有帮助,请点个赞鼓励一下作者吧~ 谢谢!

数据结构(四)、LSM树(日志结构合并树)相关推荐

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

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

  2. LSM树日志结构合并树

    学习这件事要一点一滴积累,不可心急. 1.LSM树,它是一种数据结构.英文全称,The Log-Structured Merge Tree,翻译为日志结构合并树 2.LSM树并不像B+树.红黑树一样是 ...

  3. LSM树(日志结构合并树)总结-java版

    目录 为什么要有LSM树 数据库存储引擎索引的底层结构 BTree的随机写特点 LSM树的诞生背景 简介 LSM树与B树的差异 LSM树优化 LSM树基本原理 LevelDB中的LSM HBase中的 ...

  4. 【图文详解】一文全面彻底搞懂HBase、LevelDB、RocksDB等NoSQL背后的存储原理:LSM-tree日志结构合并树...

    LSM 树广泛用于数据存储,例如 RocksDB.Apache AsterixDB.Bigtable.HBase.LevelDB.Apache Accumulo.SQLite4.Tarantool.W ...

  5. 【图文详解】一文全面彻底搞懂HBase、LevelDB、RocksDB等NoSQL背后的存储原理:LSM-tree 日志结构合并树...

    LSM 树广泛用于数据存储,例如 RocksDB.Apache AsterixDB.Bigtable.HBase.LevelDB.Apache Accumulo.SQLite4.Tarantool.W ...

  6. LSM树——Log-Structured Merge-Tree数据结构、LSM树设计思想、LSM的数据写入操作、LSM的数据查询操作

    LSM树数据结构 简介 传统关系型数据库,一般都选择使用B+树作为索引结构,而在大数据场景下,HBase.Kudu这些存储引擎选择的是LSM树.LSM树,即日志结构合并树(Log-Structured ...

  7. three.js实现3d球体树状结构布局——添加入场、出场、点击放大等动画

    目录 系列文章 前言 新增功能 添加背景 灯光旋转动画 数据入场.出场动画 点击放大 实现效果 实现源码 相关资源 系列文章 three.js实现3d球体树状结构布局--树状结构的实现 前言 本文建议 ...

  8. mysql索引数据结构图解_MySQL索引底层结构与实现原理

    为什么要使用索引 MySQL官方定义为:索引(Index)是帮助 MySQL 高效获取数据的数据结构,类似于书的目录结构一样. 如果向mysql发出一条sql语句请求,查询的字段没有创建索引的话,可能 ...

  9. LSM树——LSM 将B+树等结构昂贵的随机IO变的更快,而代价就是读操作要处理大量的索引文件(sstable)而不是一个,另外还是一些IO被合并操作消耗。...

    Basic Compaction 为了保持LSM的读操作相对较快,维护并减少sstable文件的个数是很重要的,所以让我们更深入的看一下合并操作.这个过程有一点儿像一般垃圾回收算法. 当一定数量的ss ...

最新文章

  1. UltraEdit 21激活
  2. JVM内存结构、内存模型 、对象模型那些事
  3. 1805b: Coronavirus Spike Protein Binder Design 寻找蛋白质阻止新冠病毒感染人类细胞
  4. Windows Azure Pack 安装部署
  5. wc 统计文件的行数
  6. freetds mysql_apache+mysql+php+gd+freetds
  7. Golang并发模型:轻松入门协程池
  8. 部署Nginx服务器
  9. excel日期相关计算天数
  10. 毕业设计 - 题目: 基于协同过滤的电影推荐系统 - Django 在线电影推荐协同过滤
  11. 怎么使用计算机操作鼠标,鼠标操作怎么用?电脑鼠标操作图文教程
  12. 网页全屏的代码实现要不要了解一下(最全)
  13. 解决七彩虹断剑C.A320M-K PRO V14在Win11下前置面板音频接口无法使用的问题
  14. 高德地图两个多边形区域检测重叠解决方案
  15. 第一单元 用python学习微积分(七)第一单元总结
  16. Oracle系统表空间
  17. Dubbo——手写简单版Dubbo框架
  18. dedecm教程:生成栏目列表页排序多样化pubdate,click等排序格式
  19. 编程将10进制转换2进制(将十进制转换为二进制)
  20. 突发:杭州一员工因离职纠纷把公司炸了..!

热门文章

  1. u盘文件损坏怎么恢复数据?有效方法分享
  2. 对数线性模型(Logistic回归算法)
  3. 麒麟子Cocos Creator 3D研究笔记零:从零开始入门并发布微信小游戏
  4. 项目从SVN修改成git
  5. 首页商品分类展示——淘淘商城(十四)
  6. 域服务器适合什么系统,什么是域?什么是域服务器?
  7. 简单的图书管理系统用例图(UML)
  8. Facebook、微信团队、Twitter、微软开源软件列表一览
  9. 结交有识之士-linux
  10. Android APK加固----混淆 加密