LSM-Tree:原理与介绍
LSM-Tree:原理与介绍
LSM Tree(log-structured merge-tree)是一种文件组织结构的数据结构,目前在不少数据库中都有使用到,如SQLite、LevelDB、HBase在Mongodb中也有一个LSM引擎; 在传统的关系型数据库中使用的是B-/B+ tree作为索引的数据结构,B tree的查询性能很高,为O(log n)复杂度,但其写性能并达不到O(log n),而在传统数据库中每次插入、删除数据都要更新索引,每次更新索引都会有一次磁盘IO,频繁写时其性能较低; LSM Tree查询性能达不到理论的O(log n),但效率并不慢,且其避免了频繁写时的磁盘IO,使得非常适用于KV与日志型数据库;图片LSM快的原因 磁盘、内存的顺序读写性能远高于随机读写性能,LSM通过消除更新操作(改、删)在其结构中数据无法改、删改,只能够顺序的新增追加,从而达到避免了随机写的性能问题; 写的情况解决了,但此时还必须解决随机读的性能问题,或者说怎么能够避免随机读;在目前顺序追加的两个场景中通过其特性消除了随机读的问题: 1、在WAL(write-ahead log)中场景中其数据是被整体访问的不存在随机读问题; 2、在Kafka中其没有随机读,因为其有明确的offset,有了offset就可通过seek读取指定数据,明确的物理偏移量; LSM Tree要解决的是不需要读取全部数据、无需物理偏移量的读场景下的高性能读的问题;写数据 外部数据是无序的,但LSM Tree所有写操作为顺序写,直接无差别的追加并不能虽然实现了顺序写但不能保证数据的有序;在LSM Tree中会在内存中使用一个有序结构(memtable)如(AVL树、红黑树等),写数据时都写入其有序树中,始终保持数据的有序性,当写入数据达到阈值时触发有序树的flush刷盘操作,将数据有序的顺序写入到磁盘中,生成segment,有序树开始新的周期。SSTable LSM Tree持久化后的数据称为SSTable(Sorted Strings Table),SSTable为按Key排序后的数据,每个SSTable可能包含多个文件成为segment,其内部数据一样为有序结构,segment为immutable(不可修改);读取数据 先从mentable有序树中查找数据,如未找到数据则从SSTable中读取指定数据,从最新segment开始依序扫描segment,在每个segment中其内部都是有序数据,可使用二分查找算法进行查询,可在O(log n)时间内得到结果; 二分查找有两种情况:一次性把数据全部读到内存、每次二分时读取数据;在segment非常大时两者性能都不够理想,可在内存内部维护一个稀疏索引(sparse index)【稀疏索引是指将有序数据切分为固定大小的块,仅对每块开头一条数据做索引】,引入稀疏索引后,可在索引表中用二分查找定位key 在哪小块数据中,后仅从磁盘中读取一块数据即可获得查询结果,此时加载数据量仅是整个 segment 的一小部分,IO大大降低。 查找的数据存在时不需全盘扫描,但如读取的数据不存在SSTable中时,此时需要扫描所有segment才能得到最终结果,但此时性能会非常差;修改、删除数据 在LSM Tree的SSTabe中数据是不可修改的,也就是不可修改、删除;此处的修改数据并不是传统意义上的找到某条记录并修改它,只是追加一条新的数据记录当读取数据是自然会只读到新数据从而忽略掉老的数据;删除数据同理,其删除逻辑为:追加一条数据其值为墓碑,就替换掉了老数据;当SSTable执行合并数据逻辑时,这些“删除”、“修改”的数据将会被真正的删除掉;性能优化 这时可使用布隆过滤器(bloom filter)进行优化,写入数据之前在布隆过滤器中标记,在读取时可断定某条数据是否存在。布隆过滤器有假阳性的概率,但其认为一条数据没出现过,那该数据一定没出现过。其认为一条数据出现过,那么该数据很有可能出现过;文件合并(Compaction) 系统运行越久SSTable的segment数据会越多,读取时的IO次数越多,性能会降低,此时需要控制segment的数量;LSM Tree会定期执行segment合并操作,将多个segment合并为一个大的segment,清理旧segment,由于segment的有序特性,使用并归排序就能快速的对数据进行合并,时间复杂度接近O(n);memtable持久化 为避免memtable有序树数据还未持久化为SSTable文件时系统就崩溃,可在将数据写入到memtable时同时将数据写入到WAL日志中,当程序崩溃时可通过此文件恢复数据;持久化SSTable时需要对memtable与WAL日志做统一的清空处理;LSM Tree基本流程 1、写数据:将数据缓存到内存有序树结构中(memtable),以此同时更新稀疏索引、布隆过滤器; 2、memtable达到预设的阈值,将该有序树数据flush刷盘到磁盘中,生成有序数据文件segment,此文件为immutable性质,不可修改; 3、读取数据时,如存在布隆过滤器,先用其验证如不存在数据就不存在,否则先从mentable有序树中查找数据如找到数据,依次从新到老顺序查询每个segment,查询segment使用二分查找对应稀疏索引,知道对应数据offset范围,读取磁盘范围内数据,再次二分查找获取数据; 4、LSM Tree定期执行compaction操作,将多个segment文件合并为更大的文件;参考资料:Log Structured Merge Trees - ben stopford喜欢此内容的人还喜欢用了这么久配置中心,还不知道长轮询是什么?捉虫大师不喜欢不看的原因确定内容质量低 不看此公众号2 w+深入详解 Kafka,从源码到架构全部讲透侠梦的开发笔记不喜欢不看的原因确定内容质量低 不看此公众号PostgreSQL 14中TOAST的新压缩算法LZ4,它有多快?
LSM-Tree:原理与介绍相关推荐
- B+/-Tree原理及mysql的索引分析
B+/-Tree原理 B-Tree介绍 B-Tree是一种多路搜索树(并不是二叉的): 1.定义任意非叶子结点最多只有M个儿子:且M>2: 2.根结点的儿子数为[2, ...
- LSM Tree介绍及其应用
1. LSM Tree介绍 1.1 概念 B+树读效率高而写效率差:log型文件操作写效率高而读效率差:因此要在排序和log型文件操作之间做个折中,于是就引入了log-structed merge ...
- tidb mysql hbase_HBase/TiDB都在用的数据结构:LSM Tree,不得了解一下?
LSM Tree(Log-structured merge-tree)广泛应用在HBase,TiDB等诸多数据库和存储引擎上,我们先来看一下它的一些应用: 参考资料[4]这么牛X的名单,你不想了解下L ...
- LSM Tree 学习笔记——MemTable通常用 SkipList 来实现
最近发现很多数据库都使用了 LSM Tree 的存储模型,包括 LevelDB,HBase,Google BigTable,Cassandra,InfluxDB 等.之前还没有留意这么设计的原因,最近 ...
- odoo tree视图过滤数据_数据存储结构 LSM Tree PK B TREE (从底层了解数据库设计)...
随着使用数据库的深度和理解能力的提升,有一个问题硬件的提升,与数据量的变化是否对数据库底层的架构有冲击. 我们公认的BTREE B+TREE 是否还能面对现在的硬件的变化. BTREE 到底是为那 ...
- 行为树 Behavior Tree 原理
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/LIQIANGEASTSUN/arti ...
- shell编程入门 linux解释器原理,Shell编程入门Linux解释器原理详细介绍 使用Shell进行工作的人们对.doc...
Shell编程入门Linux解释器原理详细介绍 使用Shell进行工作的人们对 Shell编程入门:Linux解释器原理详细介绍使用Shell进行工作的人们对Unix/Linux下的Shell编程都很 ...
- kinect v1原理_Kinect原理及介绍.ppt
Kinect原理及介绍 三角化:激光+摄像头,双目,投影仪+摄像头等等 depth from focus技术 coded aperture技术 深度摄像头所采用的TOF(time of fight)技 ...
- MD5算法原理简要介绍并采用C#应用在桌面应用系统的用户登录与注册中
MD5算法原理简要介绍并采用C#应用在桌面应用系统的用户登录与注册中 接上文,本文简要介绍一下MD5加密算法的原理,并采用C#实现MD5算法的加密与解密过程,将这一实现过程应用在我自己开发的桌面办公应 ...
最新文章
- php获取目录文件 排序输出,php实现对文件夹目录中的文件进行排序的方法
- MySQL数据库触发器(trigger)
- ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type
- C++中常用的字符串函数
- caffeImagenet相关
- 19.Extjs主页面显示js
- Qt编写可换肤的中文双拼汉字输入法
- 一天搞定CSS:支持IE的Layout布局--16
- 不用ajax实现动态分页,详解ajax +jtemplate实现动态分页
- Notepad++ 6.0 发布,优化了大文件加载性能
- Spring Boot入门系列(十六)整合pagehelper,一秒实现分页功能!
- 8uftp怎么使用,小编教你8uftp怎么使用
- c语言程序设计实验指导实验十二,C语言程序设计实验指导
- 大势智慧参加腾讯云启「创见沙龙」,共探“全真互联网”新趋势
- 【基本办公软件】万彩办公大师教程丨高级计算器的应用
- ffmpeg批量处理视频和音频合成
- 有没有英语语音测试软件,没有雅思的高分女朋友虐你英语,就善用手机的app录音自测练习...
- DBeaver:开源、跨平台、强大的数据库管理工具
- 两个例子讲清Thread的setDaemon的作用
- HDU 2448 最短路+KM匹配