LSM树存储模型

----《大规模分布式存储系统:原理解析与架构实战》读书笔记

之前研究了Bitcask存储模型,今天来看看LSM存储模型,两者虽然同属于基于键值的日志型存储模型。但是Bitcask使用哈希表建立索引,而LSM使用跳跃表建立索引。这一差别导致了两个存储系统的构造出现明显的分化。为此,我还先去捣腾了一番跳跃表的实现.今天算是进入了正题。

LSM的结构

LSM的基本思想是将修改的数据保存在内存,达到一定数量后在将修改的数据批量写入磁盘,在写入的过程中与之前已经存在的数据做合并。同B树存储模型一样,LSM存储模型也支持增、删、读、改以及顺序扫描操作。LSM模型利用批量写入解决了随机写入的问题,虽然牺牲了部分读的性能,但是大大提高了写的性能。

MemTable

LSM本身由MemTable,Immutable MemTable,SSTable等多个部分组成,其中MemTable在内存,用于记录最近修改的数据,一般用跳跃表来组织。当MemTable达到一定大小后,将其冻结起来变成Immutable
MemTable,然后开辟一个新的MemTable用来记录新的记录。而Immutable MemTable则等待转存到磁盘。

Immutable MemTable

所谓Immutable MemTable,即是只能读不能写的内存表。内存部分已经有了MemTable,为什么还要使用Immutable MemTable?个人认为其原因是为了不阻塞写操作。因为转存的过程中必然要保证内存表的记录不变,否则如果新插入的记录夹在两条已经转存到磁盘的记录中间,处理上会很麻烦,转存期间势必要锁住全表,这样一来就会阻塞写操作。所以不如将原有的MemTable变成只读Immutable MemTable,在开辟一个新的MemTable用于写入,即简单,又不影响写操作。

SSTable

SSTable是本意是指有序的键值对集合( a set of sorted key-value pairs )。是一个简单有用的集合,正如它的名字一样,它存储的就是一系列的键值对。当文件较大的时候,还可以为其建立一个键-值的位置的索引,指明每个键在SSTable文件中的偏移距离。这样可以加速在SSTable中的查询。(当然这一点是可选的,同时让我想去了Bitcask模型中hint文件,通过记录 键-值的位置 ,来加速索引构建)

使用MemTable和SSTable这两个组件,可以构建一个最简单的LSM存储模型。这个模型与Bitcask模型相比,不存在启动时间长的问题,但是这个模型的读性能非常的差,因为一但在MemTable找不到相应的键,则需要在根据SSTable文件生成的时间,从最近到较早在SSTable中寻找,如果都不存在的话,则会遍历完所有的SSTable文件。

如果SSTable文件个数很多或者没有建立SSTable的文件内索引的话,读性能则会大大下降。

除了在对SSTable内部建立索引外,还可以使用Bloom Fileter,提高Key不在SSTable的判定速度。同样,定期合并旧的SSTable文件,在减少存储的空间的同时,也能提高读取的速度。下面这幅图很好的描述了在LSM的大部分结构和操作

LevelDB如何优化读性能

Leveldb是一个轻量级的,快速的以存储为目的的key-value存储引擎。其使用的正是LSM存储模型。我们可以看看LevelDB是如何来优化读性能的。在LevelDB中,存在一种元信息文件MANIFEST,用于记录leveldb的元信息,比如DB使用的Comparator名,以及各SSTable文件的管理信息:如Level层数、文件名、最小key和最大key等等。相比而言,元信息文件而SSTable文件的数目成正比,一般来说不会太多,是可以载入内存的,因此Level可以通过查询元信息,从而判断哪些文件中存在我们需要的Key对应的记录,减少SSTable文件读取次数。此外,LevelDB的合并操作Compaction是分层次进行的,每一层都有多个SSTable文件,每次合并后除了Level0和内存的MemTable,Immutable
MemTable中会有重复的键值外,LevelN(N>=1)的各层内部的SSTable文件不会再有重复的键值。同时,如果在Level N 层读到了数据,那么就不需要再往后读Level N+1,Level N+2等层的数据了.因为Level N层的数据总是比Level N+1等层的数据更“新鲜”。

实现一个简单的LSM存储模型

根据上面讲述的原理,实现了一个简单的LSM模型(https://github.com/Winnerhust/Code-of-Book/blob/master/Large-Scale-Distributed-Storage-System/lsm_tree.py)。这个模型也内存表为一个跳跃表,SSTable就是简单的有序键值对集合,没有SSTable内部使用索引,没有使用Bloom过滤器。其实能就是将我之前的Bitcask模型进行了简单的改造:

  • 将原来的哈希表换成了跳跃表;
  • 原来读取记录完全依赖哈希表,现在如果在跳跃表中没有的话,就去读取文件SSTable文件中的数据,根据文件编号从大到小进行,编号越大,表示数据越新;
  • 去掉了加载数据的功能(LSM不需要);

简单起见,没有完成对范围扫描的支持,不过内存表和SSTable都是有序的,因此这个也不是很难。

参考:
详解SSTable结构和LSMTree索引



欢迎光临我的网站----蝴蝶忽然的博客园----人既无名的专栏

如果阅读本文过程中有任何问题,请联系作者,转载请注明出处!

时间: 2024-09-23 11:30:46

LSM树存储模型的相关文章

Bitcask存储模型

----<大规模分布式存储系统:原理解析与架构实战>读书笔记 最近一直在分析OceanBase的源码,恰巧碰到了OceanBase的核心开发者的新作<大规模分布式存储系统:原理解析与架构实战>.看完样章后决定入手,果然物有所值.对于准备学习分布式的同学,这是一本不错的书籍,相对系统,全面的介绍了分布式的相关技术和项目,基本都是干货.还有一半是在介绍OceanBase的内容,对我来说,正是踏破铁鞋无觅处,接下来会有几篇专门研究存储引擎的读书笔记哟.废话不多说,转入正题. 1.存储的介

Learn Jenkins the hard way (3) - Jenkins的存储模型

前言 在上篇文章中我们主要讲解了Jenkins的页面与路由,在本章中我们要讲解下Jenkins的数据持久化机制.在Jenkins中数据的持久化是通过文件进行存储的,大家平时使用Hibernate进行持久化的时候,我们只需要关心哪些地方是需要存储的,哪些位置是不需要储存的,并且在不需要存储的位置添加transient关键字即可,持久化的框架会自动帮我做好Java Object与数据库存储之间的序列化与反序列化的过程,而在Jenkins中由于数据的存储都是通过文件的方式进行存储的,有必要让大家了解下

(H2与HBase)面向行or面向列的存储模型?

(H2与HBase)面向行or面向列的存储模型?                                 目录   0. 示例      1. H2怎么存储pet表的记录?       1. 1 DATA_LEAF页格式       1. 2 DATA_NODE页格式      2. HBase怎么存储pet表的记录?       2. 1 Data Block格式       2. 2 Data Block如何存下面这些记录?       2. 3 leaf索引块的格式:       

《并行计算的编程模型》一3.3 OpenSHMEM存储模型

3.3 OpenSHMEM存储模型 OpenSHMEM是单程序.多数据(single program multiple data,SPMD)编程模型,特点是强调单边通信以及数据移动与同步解藕,是提供高性能.高可扩展性通信和同步程序的库.OpenSHMEM程序由松散同步的进程组成,这些进程也叫作处理单元(Processing Element,PE).所有PE同时开始并执行相同的程序,通常在各自集合问题的子域上执行操作,并周期性地与其他PE通信. OpenSHMEM内存模型是PGAS,类似于其他PG

基于HDFS的安全云存储模型

基于HDFS的安全云存储模型 林穗 黄健 姜文超 覃国民 针对基于HDFS的云存储平台对元数据绝对全权管理控制问题,提出元数据自主组织模型ASOM,通过分析DataNode与NameNode之间的交互过程,ASOM设计并实现了元数据子服务,通过提取HDFS中DataNode元数据信息直接跟元数据子服务器交互,并且由元数据子服务器处理文件与块.块与DataNode之间的映射关系.通过对HDFS源代码进行分析编译和模块替换,搭建原型系统进行测试,测试结果表明:对NameNode中的元数据进行必要的安

基于SaaS的通用评审系统数据存储模型的优化研究

基于SaaS的通用评审系统数据存储模型的优化研究 王锋 韩学奇 主要针对构建基于SaaS模式的通用评审系统时需要解决的数据存储问题展开.着重对传统的可定制数据存储模型中,存储利用率和数据访问性能较低的缺点,结合数据访问热度指标.数据切分理论和元数据驱动的思想,在传统键值对数据存储模型的基础上,提出了适用于可定制的SaaS系统的基于热度的元数据驱动键值对区分调用的存储解决方案:同时,通过引入缓存机制对改进后的可定制数据存储模型进行了优化.最后对新模型和优化算法进行了实验研究,实验结果证明了该优化方

大文件 b树 存储-大文件操作利用B树实现的具体原理

问题描述 大文件操作利用B树实现的具体原理 我们做一个图书馆管理系统,要求是书的信息存储在一个文件中,这个文件需要满足2G的大小,也就是说一个文件中可以同时放下几百万本书籍的信息,通过网上查资料,很多是说用B树来实现,可是我想不明白的是建立B树的索引时索引的指针指向的记录地址怎么确定,也就是说在一个文件里我要查找一本书的信息,需要分批读进内存来进行查找,如果使用了B树,怎么实现查找呢,它是直接可以根据索引找到该书在文件中的位置吗? 解决方案 在设计应用软件的时候直接设计数据存储的物理结构,这种做

时间序列数据的存储和计算 - 概述

什么是时间序列数据   什么是时间序列(Time Series,以下简称时序)数据?从定义上来说,就是一串按时间维度索引的数据.用描述性的语言来解释什么是时序数据,简单的说,就是这类数据描述了某个被测量的主体在一个时间范围内的每个时间点上的测量值.   对时序数据进行建模的话,会包含三个重要部分,分别是:主体,时间点和测量值.套用这套模型,你会发现你在日常工作生活中,无时无刻不在接触着这类数据. 如果你是一个股民,某只股票的股价就是一类时序数据,其记录着每个时间点该股票的股价. 如果你是一个运维

Nosql大家族介绍

转载请注明:http://blog.csdn.net/kisssun0608/ 原文地址:http://nosql-databases.org/ 非关系数据库世界的终极向导------------------------------------------------------------------------------------------------------------------Nosql定义:下一代数据库大多专注于这几点:非关系型.分布式的.开源并且可以横向扩展. 原意图是成