LSM树存储模型

2023-11-07

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

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


欢迎光临我的网站----蝴蝶忽然的博客园----人既无名的专栏
如果阅读本文过程中有任何问题,请联系作者,转载请注明出处!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LSM树存储模型 的相关文章

  • 一文彻底搞懂leveldb架构

    leveldb leveldb是一个写性能十分优秀的存储引擎 xff0c 是典型的LSM tree的实现 LSM的核心思想是为了换取最大的写性能而放弃掉部分读性能 那么 xff0c 为什么leveldb写性能高 xff1f 简单来说它就是尽
  • LevelDB源码分析之从Put说起

    之前分享的文章leveldb实现原理分析详细描述了LevelDB的实现原理 xff0c 本文从Put接口来看下leveldb数据写流程的源码实现 LevelDB的读写接口在类DB中定义 xff08 leveldb db h xff09 xf
  • LevelDb 资料整理

    z 2014 08 29 09 46 17 L 124 39 51223 BG57IV3 64 XCL T161676003 K F4029401865 T6 L94 R5 V74 leveldb介绍 http code google co
  • leveldb性能调优

    许多的nosql都使用leveldb或者类似leveldb的系统作为存储引擎 xff0c 例如tair xff0c hbase xff0c canssandra xff0c 因此理解并调优存储引擎可以大大的提高系统的性能 前一篇大致介绍了原
  • LevelDB源码分析之从Put说起

    之前分享的文章leveldb实现原理分析详细描述了LevelDB的实现原理 xff0c 本文从Put接口来看下leveldb数据写流程的源码实现 LevelDB的读写接口在类DB中定义 xff08 leveldb db h xff09 xf
  • leveldb代码结构

    leveld代码结构 源文件 tree I test AUTHORS build detect platform db 具体逻辑 builder cc 定义了BuildTable函数 builder h c cc c封装 暂时不用看 db
  • leveldb官方手册摘录

    本文内容摘自leveldb官方手册 版权归其所有 CHAPTER 1 基本概念 leveldb是一个写性能十分优秀的存储引擎 是典型的LSM树 Log Structured Merge Tree 实现 LSM树的核心思想就是放弃部分读的性能
  • Leveldb源码分析--13

    8 FilterPolicy Bloom之2 8 5 构建FilterBlock 8 5 1 FilterBlockBuilder 了解了filter机制 现在来看看filter block的构建 这就是类FilterBlockBuilde
  • LevelDb之七:根据Key读取记录

    LevelDb之七 根据Key读取记录 2012 09 08 17 54 41 分类 云计算 LevelDb是针对大规模Key Value数据的单机存储库 从应用的角度来看 LevelDb就是一个存储工具 而作为称职的存储工具 常见的调用接
  • leveldb之Compaction操作下之具体实现

    leveldb之Compaction操作下之具体实现 2015 05 17 19 40 438人阅读 评论 0 收藏 举报 分类 leveldb 13 版权声明 本文为博主原创文章 未经博主允许不得转载 目录 由上文可知 合并主要分为三种
  • Oceanbase列传

    Oceanbase列传 分布式与存储技术 跳至内容 首页 关于郁白 文章列表 文章预告 正在追越狱第五季 两阶段提交的工程实践 两阶段提交 2 Phase Commit简称2PC 协议是用于在多个节点之间达成一致的通信协议 它是实现 有状态
  • Windows下 VS2015编译RocksDB

    Windows下 VS2015编译RocksDB VS2015编译RocksDB RocksDB 是一个来自 facebook 的可嵌入式的支持持久化的 key value 存储系统 也可作为 C S 模式下的存储数据库 但主要目的还是嵌入
  • LSM树存储模型

    大规模分布式存储系统 原理解析与架构实战 读书笔记 之前研究了Bitcask存储模型 今天来看看LSM存储模型 两者虽然同属于基于键值的日志型存储模型 但是Bitcask使用哈希表建立索引 而LSM使用跳跃表建立索引 这一差别导致了两个存储
  • LevelDB源码分析之内存管理类arena

    LevelDB源码分析之内存管理类arena Leveldb的大部分内存管理依赖于C 语言的默认实现 也就是不对内存进行管理 只是在memtable的实现中用到了一个简单的内存管理器 arena 因为memtable的内部实现skip li
  • mmap 返回无法分配内存,即使有足够的内存

    我正在使用 leveldb 进行压力测试 In util env poisx cc NewRandomAccessFile void base mmap NULL size PROT READ MAP SHARED fd 0 插入 300
  • 从 Bash 或 Python 获取 google Chrome IndexedDB 中的数据

    我的 Google Chrome 中有 LevelDB IndexedDB 文件 该文件位于此文件夹中 home
  • 无法构建 Objective-C 模块“CoreGraphics”

    当我尝试运行任何单元或 UI 测试时 出现以下错误 运行应用程序本身时不会发生 错误信息如下所示 Applications Xcode app Contents Developer Platforms iPhoneSimulator pla
  • LMDB 是否支持多个键到相同值的映射?

    是否可以将多个键映射到同一个值 如果没有 是否有解决此功能的方法 这是不可能的 我使用的一种解决方法是让第二个键上的值成为指向主键的指针 也就是第二个键的值is主键 特别是 我制作了一个辅助键表 或 lmdb 中的 命名数据库 其中所有va
  • C# 是否有一个好的 leveldb 端口? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望在我的纯 C 项目中使用 leveldb 我在 google 上搜索了 leveldb 的 C 版本 但没有找到 谁能告诉我在哪里可
  • Scala SBT 和 JNI 库

    我正在编写一个简单的应用程序Scala通过以下方式使用 leveldb 数据库leveldbjni图书馆 我的build sbt文件看起来像这样 name Whatever version 1 0 scalaVersion 2 10 2 l

随机推荐

  • 区块链:盗版者的噩梦?

    传统版权保护是用文本或数据库来进行处理的 用纸张文本处理有诸多不便之处 如记录搜寻 纸质保存 文件遗失等 而使用普通数据库 虽然查询速度加快 但其中的数据是可以被篡改的 因此很难被视为有效的电子证据 数字资产难以确权 同时再加上如今极度便利
  • LLVM passes: MergeFunctions Pass

    目录 What is MergeFunctions Pass 概述 FnTree和Deferred 基本流程 相同函数搜索 函数哈希值比较 函数哈希值的计算 函数哈希值比较的使用 函数结构比较 FunctionNodeCmp 函数比较方法
  • leetcode分类刷题:队列(Queue)(二、优先队列解决TopK简单问题)

    1 优先队列好像一般都叫堆 以大顶堆为例 顶部第一个元素最大 底部最后一个元素最小 自顶向底是递减的 更准确的说是非递增的 对外只能访问顶部第一个元素 对应索引为0 和底部最后一个元素 对应索引为 1 在Python中 heapq默认维护小
  • 关于#include

    经常看人写 include
  • Failed to resolve packages 打开开源项目 VectorFieldExamples 失败

    unity3d打开开源项目问题 最近研究 keijiro大神的开源项目 VectorFieldExamples clone工程后打开总是提示如下错误 Failed to resolve packages Registry configura
  • 感谢CSDN平台记录了我6年的点点滴滴

    感谢CSDN平台记录了我6年的点点滴滴 我的新博客如下 博客园https www cnblogs com ztguang
  • MySQL REPLACE字符串函数简介

    MySQL为您提供了一个有用的字符串函数REPLACE 它允许您用新的字符串替换表的列中的字符串 REPLACE 函数的语法如下 REPLACE str old string new string SQL REPLACE 函数有三个参数 它
  • centos安装Anaconda并使用其安装pytorch

    下载并安装Anaconda wget no check certificate https mirrors tuna tsinghua edu cn anaconda archive Anaconda3 5 1 0 Linux x86 64
  • 操作系统内存管理及虚拟内存技术

    一 内存管理 操作系统的内存管理主要负责内存的分配与回收 malloc 函数 申请内存 free 函数 释放内存 另外地址转换也就是将逻辑地址转换成相应的物理地址等功能也是操作系统内存管理做的事情 1 常见的内存管理机制 1 1 连续分配管
  • 【Linux学习】06 信号

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 信号的概念 二 Linux中信号 signal函数 1 种类 2 信号的实现机制 3 信号的处理 1 默认递送行为 2 忽略信号 3 捕捉信号并处理 具体
  • ArcGIS教程:模糊隶属

    摘要 根据指定的模糊化算法 将输入栅格转换为 0 到 1 数值范围以指示其对某一集合的隶属度 值 1 表示完全隶属于模糊集 而当值降为 0 时 则表示不是模糊集的成员 用法 此工具无法对分类数据进行度量 要将分类数据用于模糊叠加分析 需要执
  • Asp.net的GridView控件实现单元格可编辑

    最近做一个功能 考虑到用户使用方便 减少弹出页面 采用点 编辑 按钮无需弹出页面直接当前行的单元格内容就能编辑 进入页面显示如下图 点 编辑 按钮后显示如下图 编号为1的 星期 和 是否上班 均可编辑 编辑完成后 点 更新 保存 第一张图中
  • QT按钮被触发两次的问题

    QT自带翻译机制 规则强制指定 修改槽函数形式 QT自带翻译机制 如果用官方的写法on btn pressed 可以不用写connect函数 可以直接触发槽函数 如果此时用connect再次连接的话 就会导致on btn pressed 被
  • 达梦8 DMDSC集群高可用验证手册

    阅读对象 架构管理人员 架构设计人员 项目需求分析 设计开发人员 数据架构师 DBA 开发人员 定义 缩写和分类 DM DM8为达梦公司自研数据库 DMDSC DM Data Shared CLuster 简称DMDSC 共享存储数据库集群
  • 写一个字符串处理方法,去掉小数点

    Java StringUtil中使用正则表达式去除小数点后面多余的0功能 public static String removeTrim String str if str indexOf gt 0 str str replaceAll 0
  • oracle数据库服务器性能,如何调整Oracle数据库服务器的性能?

    Oracle数据库服务器是整个系统的核心 它的性能高低直接影响整个系统的性能 为了调整Oracle数据库服务器的性能 主要从以下几个方面考虑 1 调整操作系统以适合Oracle数据库服务器运行 Oracle数据库服务器很大程度上依赖于运行服
  • STM32 51单片机——搭建keil5的开发环境(ARM)

    知识点 keil proteus搭建概述 环境搭建 实训day1 12月19日 目录 1 keil安装 1 1 安装KEIL5 安装包 步骤1 步骤2 步骤3 步骤4 步骤5 1 2 添加License 步骤1 步骤2 步骤3 1 3 安装
  • chatgpt赋能python:用Python三种方法逆序输出

    用Python三种方法逆序输出 Python是一种非常流行的编程语言 它的优雅和简单易用的特性使其成为开发人员和数据科学家的首选语言 今天 我们将讨论如何用Python三种方法逆序输出 方法一 使用 1 方法 Python列表的一个重要特性
  • ELK系列(三)、安装Logstash插件及打包离线安装包

    Logstash有input output filter codec 四种插件类型 支持的种类也很丰富 功能特别强大 选对正确的插件可以节省很多的资源占用和开发效率 生产环境一般都无法连接到公网 所以本篇就带大家如何在线安装 以及打包离线安
  • LSM树存储模型

    大规模分布式存储系统 原理解析与架构实战 读书笔记 之前研究了Bitcask存储模型 今天来看看LSM存储模型 两者虽然同属于基于键值的日志型存储模型 但是Bitcask使用哈希表建立索引 而LSM使用跳跃表建立索引 这一差别导致了两个存储