Log-Structured Merge Tree (LSM Tree)
一种树,适合于写多读少的场景。主要是利用了延迟更新、批量写、顺序写磁盘(磁盘sequence access比random access快)。
背景
回顾数据存储的两个“极端”发展方向
加快读:加索引(B+树、二分查找树等)
目的是为了尽快查到目标数据,从而提高查询速度;但由于写入数据时同时要维护索引,故写效率较低。
加快写:纯日志型,不加索引,数据以append方式追加写入
append利用了“磁盘顺序写比任意写性能高”的特性,使得写入速度非常高(接近磁盘理论写入速度);因缺乏索引支持故需要扫描所有记录,故查询性能低。典型的是Kafka数据存储。
if we are interested in write throughput, what is the best method to use? A good starting point is to simply append data to a file. This approach, often termed logging, journaling or a heap file, is fully sequential so provides very fast write performance equivalent to theoretical disk speeds (typically 200-300MB/s per drive).
Benefiting from both simplicity and performance log/journal based approaches have rightfully become popular in many big data tools. Yet they have an obvious downside. Reading arbitrary data from a log will be far more time consuming than writing to it, involving a reverse chronological scan, until the required key is found.
This means logs are only really applicable to simple workloads, where data is either accessed in its entirety, as in the write-ahead log of most databases, or by a known offset, as in simple messaging products like Kafka.
LSM Tree
LSM Tree以第二种为基础再结合了第一种,其目标在于在尽可能保证高写入性能的同时提高查询性能。
LSM trees sit in the middle-ground between a journal/log file and a traditional single-fixed-index such as a B+ tree or Hash index.
In essence they do everything they can to make disk access sequential.
其也是采用顺序append,但进一步做了文件层次组织、延迟更新、保证key有序等处理,使得文件本身相当于一种索引,从而相比于纯日志型在查询速度方面有所提高。
原理
1、数据读写时均需指定key。
2、add数据时先写入内存Buffer(称为Memtable)。
这里面的数据按key排序(可通过跳表或各种树实现);
数据写入Memtable前会以WAL(write-ahead-log)方式先写log到disk,以使Memtable中数据在机器故障后可根据log恢复。更好的方式是Memtable满后变成Immutable Memtable并生成一个新的Buffer接收写入,每个接收写入的Memtable对应一个WAL文件。
3、当Memtable里数据达到一定量(个数、大小等)后数据被批量地、以append方式顺序写入disk成为一个文件,可见此时文件内部是按key有序的了(成为SSTable)。
4、所有写入Memtable或disk的数据均不会被修改:新的add、delete、update操作在内部实现上都是产生新的entry,而不会去修改同key的entry,因此存在冗余:同一个key有多个版本的数据、不同文件间有相同key的entry。
5、解决冗余:系统内部会周期性对disk上若干文件进行合并,合并时会remove any duplicated updates or deletions(是以谓之“延迟更新”)。由于各文件内部是有序的故合并非常快。
Level Based Compaction:Level DB中逻辑上以level对文件分类(如上图),下层level的文件由上层level的文件合并而成;level0中不同文件中可能有相同key,但level1及以下level不再会有冗余。
6、read操作:先从Memtable中查,若未查到则对各disk文件按文件创建时间由新到旧对各文件遍历查。
由于文件内部是有序的,故相比于纯日志型存储,LSM Tree查询更快(如可用二分查找);
由于需要遍历各文件故查询速度相比于B+树差,且文件越多查的性能越慢;
为提高查询效率,措施:增加合并操作以减少文件数量、生成大的排序的文件;对每个文件使用布隆过滤器以可快速确定此文件是否有指定key的entry;Level Based Compaction使得可以记录每个level中key的范围(mainfest文件)从而查询时每个level只要查一个文件。
总结
特点:
写入的数据优先写内存,且在内存按key排序了;
disk写是批量、顺序写;
写入的数据不可变,不会被修改。add、delete、update在内部都是add操作,存在冗余,由定期的合并操作来消除冗余;
因数据在内存排过序,故在写入disk后每个文件内部也按key有序;
文件内部按key有序,故合并操作很快(线性复杂的);有利于查询(二分查找等)
高写入性能的原因:写入disk是批量、顺序写
与加B+树等树型索引结构的存储方式比:写性能大幅度提高,读性能差些。
与纯日志型比:多了合并操作(虽是额外开销但因文件是各自内部有序的故合并很快)、查询性能提高
典型应用:Level DB,写性能远大于读性能;缺点之一是还不支持分布式。此外,HBase、Cassandra、SQLLite、Mongodb等亦是基于之。
参考资料
http://www.benstopford.com/2015/02/14/log-structured-merge-trees/(主)
https://www.cnblogs.com/vajoy/p/5471308.html
Log-Structured Merge Tree (LSM Tree)的更多相关文章
- Log Structured Merge Trees (LSM)
1 概念 LSM = Log Structured Merge Trees 来源于google的bigtable论文. 2 解决问题 传统的数据库如MySql采用B+树存放数据,B ...
- Log Structured Merge Trees(LSM) 算法
十年前,谷歌发表了 “BigTable” 的论文,论文中很多很酷的方面之一就是它所使用的文件组织方式,这个方法更一般的名字叫 Log Structured-Merge Tree. LSM是当前被用在许 ...
- Log Structured Merge Trees(LSM) 原理
http://www.open-open.com/lib/view/open1424916275249.html
- The storage wars: Shadow Paging, Log Structured Merge and Write Ahead Logging
The storage wars: Shadow Paging, Log Structured Merge and Write Ahead Logging previous: Seek, and yo ...
- LSM(Log Structured Merge Trees ) 笔记
目录 一.大幅度制约存储介质吞吐量的原因 二.传统数据库的实现机制 三.LSM Tree的历史由来 四.提高写吞吐量的思路 4.1 一种方式是数据来后,直接顺序落盘 4.2 另一种方式,是保证落盘的数 ...
- LSM Tree存储组织结构介绍
LSM Tree(Log Structured Merge Trees)数据组织方式被应用于多种数据库,如LevelDB.HBase.Cassandra等,下面我们从为什么使用LSM tree.LSM ...
- LSM Tree 学习笔记——本质是将随机的写放在内存里形成有序的小memtable,然后定期合并成大的table flush到磁盘
The Sorted String Table (SSTable) is one of the most popular outputs for storing, processing, and ex ...
- 数据映射-LSM Tree和SSTable
Coming from http://blog.sina.com.cn/s/blog_693f08470101njc7.html 今天来聊聊lsm tree,它的全称是log structured m ...
- SSTable and Log Structured Storage: LevelDB
If Protocol Buffers is the lingua franca of individual data record at Google, then the Sorted String ...
随机推荐
- spring-framework-core-ioc Container 笔记版本
Spring框架对于java开发人员来说是无比重要的.接触java也有3年了,接触Spring两年了.在工作中天天使用它,平时也会通过视频和书籍尝试更加的了解Spring.对于初学者来说,Spring ...
- flink solt,并行度
转自:https://www.jianshu.com/p/3598f23031e6 简介 Flink运行时主要角色有两个:JobManager和TaskManager,无论是standalone集群, ...
- 【UOJ#76】【UR #6】懒癌(动态规划)
[UOJ#76][UR #6]懒癌(动态规划) 题面 UOJ 题解 神....神仙题. 先考虑如果是完全图怎么做... 因为是完全图,所以是对称的,所以我们只考虑一个有懒癌的人的心路历程. 如果只有一 ...
- java架构之路-(nginx使用详解)nginx的反向代理和优化配置
书接上回说,nginx我们学会了简单的配置.那么我今天来聊一下,我们ngxin的一些优化配置(我不是很懂,不敢谈高级配置).我先来看一下nginx的好处和正向代理. nginx的好处 1.可以高并发连 ...
- Zabbix-proxy和Zabbix-agent源码安装
一 .Zabbix Proxy 概述 Zabbix proxy 是一个可以从一个或多个受监控设备采集监控数据并将信息发送到 Zabbix server 的进程,主要是代表 Zabbix server ...
- 在IIS配置时没有启用目录浏览功能 :HTTP 错误 403.14
在IIS配置时没有启用目录浏览功能,浏览网站时,会出现“HTTP 错误 403.14–Forbidden,Web服务器被配置为不列出此目录内容”的提示,怎么解决这个问题呢? 01 02 03 04 0 ...
- C# 下载泛型数据
public class ExportTByNPOI { [STAThread] public static void ExportTDataByNPOI<T>(List<T> ...
- Devexpress treelist两张表父子节点设置、筛选、分页、排序、页面跳转demo
效果图 网上查了很多例子自己结合和修改了一下.最下方的分页跳转是dev的datapager控件.控件的属性事件自己研究一下. 代码如下 public partial class MMDefinitio ...
- Java多线程——ThreadLocal类的原理和使用
Java多线程——ThreadLocal类的原理和使用 摘要:本文主要学习了ThreadLocal类的原理和使用. 概述 是什么 ThreadLocal可以用来维护一个变量,提供了一个ThreadLo ...
- 腾讯WeTest兼容服务再次升级,支持小程序兼容
WeTest 导读 小程序作为微信内能被便捷地获取和传播的工具,吸引着越来越多的开发者加入其中.无论是小游戏.零售.出行服务还是生活餐饮等,各行各业的小程序出现在用户的手机上,在给用户带来便利的同时, ...