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

之前研究了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索引


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


假设阅读本文过程中有不论什么问题,请联系作者,转载请注明出处!

LSM树存储模型的更多相关文章

  1. HBase LSM树存储引擎详解

    1.前提 讲LSM树之前,需要提下三种基本的存储引擎,这样才能清楚LSM树的由来: 哈希存储引擎. B树存储引擎. LSM树(Log-Structured Merge Tree)存储引擎. 2. 哈希 ...

  2. Hash存储模型、B-Tree存储模型、LSM存储模型介绍

    每一种数据存储系统,对应有一种存储模型,或者叫存储引擎.我们今天要介绍的是三种比较流行的存储模型,分别是: Hash存储模型 B-Tree存储模型 LSM存储模型 不同存储模型的应用情况 1.Hash ...

  3. 【转帖】LSM树 和 TSM存储引擎 简介

    LSM树 和 TSM存储引擎 简介 2019-03-08 11:45:23 长烟慢慢 阅读数 461  收藏 更多 分类专栏: 时序数据库   版权声明:本文为博主原创文章,遵循CC 4.0 BY-S ...

  4. MongoDB索引存储BTree与LSM树(转载)

    1.为什么 MongoDB 使用B-树,而不是B+树 MongoDB 是一种 nosql,也存储在磁盘上,被设计用在数据模型简单,性能要求高的场合.性能要求高,我们看B-树与B+树的区别: B+树内节 ...

  5. 面对key数量多和区间查询低效问题:Hash索引趴窝,LSM树申请出场

    摘要:Hash索引有两个明显的限制:(1)当key的数量很多时,维护Hash索引会给内存带来很大的压力:(2)区间查询很低效.如何对这两个限制进行优化呢?这就轮到本文介绍的主角,LSM树,出场了. 我 ...

  6. 平衡二叉树、B树、B+树、B*树、LSM树简介

    平衡二叉树是基于分治思想采用二分法的策略提高数据查找速度的二叉树结构.非叶子结点最多只能有两个子结点,且左边子结点点小于当前结点值,右边子结点大于当前结点树,并且为保证查询性能增增删结点时要保证左右两 ...

  7. LSM存储模型

    LSM存储模型 数据库有3种基本的存储引擎: 哈希表,支持增.删.改以及随机读取操作,但不支持顺序扫描,对应的存储系统为key-value存储系统.对于key-value的插入以及查询,哈希表的复杂度 ...

  8. 关于时间序列数据库的思考——(1)运用hash文件(例如:RRD,Whisper) (2)运用LSM树来备份(例如:LevelDB,RocksDB,Cassandra) (3)运用B-树排序和k/v存储(例如:BoltDB,LMDB)

    转自:http://0351slc.com/portal.php?mod=view&aid=12 近期网络上呈现了有关catena.benchmarking boltdb等时刻序列存储办法的介 ...

  9. 17-看图理解数据结构与算法系列(NoSQL存储-LSM树)

    关于LSM树 LSM树,即日志结构合并树(Log-Structured Merge-Tree).其实它并不属于一个具体的数据结构,它更多是一种数据结构的设计思想.大多NoSQL数据库核心思想都是基于L ...

随机推荐

  1. DDDLite的权限管理

    领域驱动设计实战—基于DDDLite的权限管理   在园子里面,搜索一下“权限管理”至少能得到上千条的有效记录.记得刚开始工作的时候,写个通用的权限系统一直是自己的一个梦想.中间因为工作忙(其实就是懒 ...

  2. 发现SQL Server惊天大秘密!!

    原文:发现SQL Server惊天大秘密!! --set statistics xml onCREATE TABLE T_TEST(ID INT IDENTITY PRIMARY KEY,Create ...

  3. 浅析MVC和说媒的过程

    什么是MVC? MVC 全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面 显 ...

  4. 第七章——DMVs和DMFs(3)——用DMV和DMF监控TempDB

    原文:第七章--DMVs和DMFs(3)--用DMV和DMF监控TempDB 前言: 我们都知道TempDB是SQLServer的系统数据库,且SQLServer的日常运作严重依赖这个库.因此,监控T ...

  5. Android L SDK -- 一些有趣的新功能

    一些普通的就不提了,自己查看最新的文档就可以 文档地址 Task locking 功能:让我们在使用一个应用时,能够免受通知(消息)的打搅. 怎样使用:当我们在应用中激活任务锁模式.我们接收到的通知( ...

  6. 刷牙LeetCode思考

    时间已经到了不自觉地,3在五月中旬.今天正式LeetCode自由181刷牙的问题.感觉,以提高他们的算法非常有帮助. 第一个主要的深搜索,广泛搜索,DP他已经掌握7788.也有自己写的代码格公式,使用 ...

  7. Class撑起了OOP世界的天。Class类是OO的基本单元,OO的世界都是通过一个一个的类协作完成的,提高软件的重用性、灵活性和扩展性(转)

    引言 在OO的工作中,我们一定会涉及到类,抽象类和接口.那么类和抽象类以及接口到底扮演的什么角色? 本文主要是从人类社会的角度阐述类与抽象类以及接口的“社会”关系,从而让我们抛弃书上的那些死记硬背的概 ...

  8. android做设计的每一个屏幕尺寸和分辨率(一个)

    一个.与分辨率无关 1.使用dp(dpi) Android密度不依赖像素(dp)指定屏幕尺寸,它同意不同的屏幕尺寸和像素密度类似设备通过缩放来达到同样的效果. (不解决不同屏幕尺寸的问题?) 2.的资 ...

  9. 《Linux Device Drivers》第十四章 Linux 设备型号

    基本介绍 2.6内核设备模型来提供的抽象叙述性描述的一般系统的结构,为了支持各种不同的任务 电源管理和系统关机 用户空间与通信 热插拔设备 设备类型 kobject.kset和子系统 kobject是 ...

  10. 【MySQL笔记】mysql来源安装/配置步骤和支持中国gbk/gb2312编码配置

    不久的学习笔记.分享.我想有很大的帮助谁刚开始学习其他人的 备注:该票据于mysql-5.1.73版本号例如 1. mysql源代码编译/安装步骤 1) 官网下载mysql源代码并解压 2) cd至源 ...