LSMT存储引擎浅析

简介: LSMT存储引擎浅析

LSMT与存储引擎介绍

LSMT是什么

通过Append-only Write +择机Compact来维护结构的索引树。

图片.png


存储引擎是什么

大致分为:

  • 计算层
  • 存储层(存储引擎层)

计算层主要负责SQL解析/查询优化/计划执行。

数据库著名的ACID特性,在MySQL中全部强依赖于存储引擎。

ACID是什么/存储引擎哪些组件保障了这些特性?

  • Atomicity
  • Consistency(C orrectness)
  • Isolation
  • Durability

除了保障ACID以外,存储引擎还要负责:

  • 屏蔽I0细节提供更好的抽象
  • 提供统计信息与Predicate Push Down能力

LSMT存储引擎的优势与实现

LSMT与B+Tree的异同

  • 在B+Tree中,数据插入是原地更新的
  • B+Tree在发生不平衡或者节点容量到达阈值后,必须立即进行分裂来平衡
  • LSMT与B+Tree可以用统一模型描述
  • 从高层次的数据结构角度来看二者没有本质的不同,可以互相转化
  • 工程实践上还是用LSMT来表示一个Append-only和Lazy Compact的索引树,B+Tree 来表示一个Inplace-Update和Instant Compact的索引树。
  • Append-only和Lazy Compact这两个特性更符合现代计算机设备的特性。

为什么要采用LSMT模型

HDD时代:顺序与随机操作性能不对称

SSD时代:顺序写与随机写性能不对称

这二者的共性是顺序写是一个对设备很友好的操作,LSMT符合这一点,而B+ Tree依赖原地更新,导致随机写。


LSMT存储引擎的实现,以RocksDB为例

write

  • RocksDB写入流程主要有两个优化,批量WAL写入(继承自LevelDB)与并发MemTable更新
  • RocksDB在真正执行修改之前会先将变更写入WAL, WAL写成功则写入成功。
  • 多个写入者会选出一个Leader,由这个Leader来一次性写入WAL,避免小I0。
  • 不要求WAL强制落盘(Sync) 时,批量提交亦有好处,Leader可以同时唤醒其余Writer,降低了系统线程调度开销。
  • 没有批量提交的话,只能链式唤醒。
  • 链式唤醒加大前台延迟。

Snapshot & SuperVision

  • RocksDB的数据由3部分组成,MemTable/ ImmemTable / SST.持有这三部分数据并且提供快照功能的组件叫做SuperVersion。
  • MemTable和SST的释放依赖于引用计数。对于读取来说,只要拿着SuperVersion, 从MemTable一级一级向下,就能查到记录。拿着SuperVersion不释放,等于是拿到了快照。
  • 如果所有读者都给SuperVersion的计数加1,读完后再减1,那么这个原子引用计数器就会成为热点。CPU在多核之间同步缓存是有开销的,核越多开销越大。
  • 为了让读操作更好的scale, RocksDB做了一个优化是Thread Local SuperVersion Cache

Get & BloomFilter

  • RocksDB的读取在大框架.上和B+ Tree类似,就是层层向下。
  • 相对于B+Tree, LSMT点查需要访问的数据块更多。为了加速点查,一般LSMT引擎都会在SST中嵌入BloomFilter。

Level

  • Compact在LSMT中是将Key区间有重叠或无效数据较多的SST进行合并,以此来加速读取或者回收空间。Compact 策略可以分为两大类,Level和Tier。下图是Level 策略。
  • Level策略直接来自于LevelDB,也是RocksDB的默认策略。每一个层不允许有SST的Key区间重合。

B+ Tree和B Tree的最大区别是将所有数据都放在了叶子结点,从而优化了批量插入和批量查询的效率,而优化的核心逻辑就是无论是什么存储介质,顺序存储的效率一定优于随机存储。

LSMT的原理本质上就是在SSTable基础上增加了一个MemTable。

MemTable顾名思义,就是存放在内存中的数据结构,可以快速实现增删改查,比如红黑树,Skiplist都行。其次,我们还需要一个log文件,和数据库的binlog相当,记录数据发生的变化,用于服务器宕机时找回数据。

LSMT读取的时候,效率比B+树要低,但对于大数据的写入支持得更好。在大数据场景中,许多对于数据的吞吐量有着很高的要求,比如消息系统,分布式存储等。B+树就无法展现他的优势。


LSMT模型理论分析

  • RocksDB是单机存储引擎,那么现在都说云原生,HBase 比RocksDB就更「云」一些,SST直接存储于HDFS上。
  • 二者在理论存储模型上都是LSMT。

LSMT模型算法复杂度分析

image.png

  • T: size ratio, 每层LSMT比上一层大多少,LO 大小为1,则L1大小为T, L2为T^2,以此类推
  • L: level num, LSMT层数B:每个最小的10单位能装载多少条记录
  • M:每个BloomFilter 有多少bits
  • N:每个BloomFilter 生成时用了多少条Key
  • S:区间查询的记录数量

Level

  1. Write
  • 每条记录抵达最底层需要经过L次Compact,每次Compact Ln的一个小SST和Ln+1的一个大SST.
  • 设小SST的大小为1,那么大SST的大小则为T,合并开销是1+T,换言之将1单位的Ln的SST推到Ln+1要耗费1+T的I0,单次Compact写放大为T。每条记录的写入成本为1/B次最小单位10。
  1. O(Write_ Level) = LT1/B =T*L/B

Tier

  1. Write
  • 每条记录抵达最底层前同样要经过L次Compact,每次Compact Ln中T个相同尺寸的SST放到Ln+ 1。
  • 设SST大小为1,那么T个SSTCompact的合并开销是T,换言之将T单位的Ln的SST推到Ln+1要耗费T的10,单次Compact的写放大为T/T=1。每条记录的写入成本为1/B次最小单位10。
  1. O(Write_ Tier) = L 1 1/B = L/B

总结:Tier 策略降低了写放大,增加了读放大和空间放大,Level 策略增加了写放大,降低了读和空间放大。


目录
相关文章
|
Rust 数据可视化 安全
Rust性能分析工具概览:perf、flamegraph 与其他
Rust作为一种高性能、内存安全的编程语言,在构建大型系统和微服务时备受青睐。然而,优化Rust程序的性能需要有效的工具。本文将对Rust中常用的性能分析工具进行介绍,包括perf、flamegraph等,并探讨它们如何帮助开发者定位和解决性能瓶颈。
1448 1
|
存储 XML 弹性计算
Zotero+阿里云盘文献同步
通过将阿里云盘映射为WebDav,作为Zotero的文献同步网盘,实现了多设备上的Zotero文献同步
Zotero+阿里云盘文献同步
|
NoSQL Java
简析Cassandra的BATCH操作
cassandra中批量写入的操作称为batch,通过batch操作可以将多个写入请求合并为一个请求。这样有如下作用: 把多次更新操作合并为一次请求,减少客户端和服务端的网络交互。 batch中同一个partition key的操作具有隔离性。
7126 0
|
小程序 前端开发 数据安全/隐私保护
微信小程序全栈开发中的身份认证与授权机制是一个重要而复杂的问题。
微信小程序作为业务拓展的新渠道,其全栈开发中的身份认证与授权机制至关重要。本文概览了身份认证方法,包括手机号码验证、微信及第三方登录;并介绍了授权机制,如角色权限控制、ACL和OAuth 2.0。通过微信登录获取用户信息,利用第三方登录集成其他平台,以及实施角色权限控制和ACL,开发者能有效保障小程序的安全性和提供良好用户体验。此外,还强调了在实现过程中需注重安全性、用户体验和合规性。
742 0
|
弹性计算 安全 Linux
阿里云国际版使用ping命令测试ECS云服务器不通的排查方法
阿里云国际版使用ping命令测试ECS云服务器不通的排查方法
|
NoSQL Java 测试技术
Golang内存分析工具gctrace和pprof实战
文章详细介绍了Golang的两个内存分析工具gctrace和pprof的使用方法,通过实例分析展示了如何通过gctrace跟踪GC的不同阶段耗时与内存量对比,以及如何使用pprof进行内存分析和调优。
467 0
Golang内存分析工具gctrace和pprof实战
|
API 开发工具 UED
在 UWP 中使用 Windows App SDK
【10月更文挑战第17天】在UWP中使用Windows App SDK可增强应用功能和性能。首先了解SDK特性,接着安装Visual Studio 2022及以上版本,并从微软官网下载安装SDK。配置项目时,确保目标版本支持SDK,添加SDK引用后即可使用新API提升应用体验。开发过程中应充分利用调试工具进行测试,确保应用的兼容性和稳定性。
290 0
|
SQL 分布式计算 资源调度
Hive 优化总结
Hive优化主要涉及HDFS和MapReduce的使用。问题包括数据倾斜、操作过多和不当使用。识别倾斜可通过检查分区文件大小或执行聚合抽样。解决方案包括整体优化模型设计,如星型、雪花模型,合理分区和分桶,以及压缩。内存管理需调整mapred和yarn参数。倾斜数据处理通过选择均衡连接键、使用map join和combiner。控制Mapper和Reducer数量以避免小文件和资源浪费。减少数据规模可调整存储格式和压缩,动态或静态分区管理,以及优化CBO和执行引擎设置。其他策略包括JVM重用、本地化运算和LLAP缓存。
541 4
Hive 优化总结
|
安全 机器人 API
AppFlow实现大模型对话自由
AppFlow是阿里云团队推出的应用与数据集成平台,它无需编程即可配置对话流程,支持接入包括通义千问、文心一言等在内的多个主流大模型。用户可以通过AppFlow与钉钉、飞书、企业微信等IM软件中的大模型进行对话。配置过程包括创建连接流,选择触发事件(如钉钉机器人接收到文本消息),配置执行动作(如使用通义千问模型提问),以及设置回调地址等步骤。此外,还提供了在钉钉创建机器人的指南,通过Outgoing功能或钉钉开放平台实现与大模型的交互。如有问题,用户可以加入官方支持钉钉群进行咨询和交流。
55413 9
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的医院在线挂号预约系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的医院在线挂号预约系统的详细设计和实现(源码+lw+部署文档+讲解等)
264 0