数据库管理-第127期 LSM Tree(202301225)

news2024/9/23 21:19:06

数据库管理-第127期 LSM Tree(202301225)

说起分布式数据库,绕不开的一个话题就是LSM Tree,全称为log-structured merge-tree,回到吕海波老师授权过的那句话“没搞过Oracle的,但又是数据库圈里的人,特别做数据库开发的,对Oracle的印象就是:集中式、落后、旧时代的产物,超过Oracle很简单,基于Poxos/Raft,随便上个分布式就可以了。如果再实现个LSM Tree,那就超过Oracle太多了。”可见LSM Tree对于分布式数据库是很重要的一个东西,无论是国外的HBase、Cassandra、LevelDB、RocksDB等,还是国内较为出名的OceanBase、TiDB等,都是使用LSM Tree来组织数据。

1 基本

LSM Tree和B+ Tree是数据库创建block(块)的时候提到的两种基础数据结构。B+ Tree一般用于较少查询和插入时间的场景,而LSM Tree则用于写压力非常大而读要求不是那么高的场景。
LSM Tree并非是一个所谓的新技术,从维基百科来看这是一个诞生于1996年的技术,较早发表用于具体技术则是2006年Google发表的论文《Bigtable: A Distributed Storage System for Structured Data》,这篇论文也被誉为分布式数据库开山鼻祖之作,后面很多分布数据库也都是基于这一篇论文的理论建立起来的。

2 机制

LSM Tree的出现是为了大数据量的OLAP场景,其最大的机制也可以说是优势是可以充分利用磁盘顺序写的优势而带来非常强大的数据写入性能,当然在查询这块牺牲了一定性能一般来说是慢于B Tree,当然这个性能也是可以接受的。而随着内存与SSD价格的持续走低以及容量的极大提升,基于LSM Tree的数据库读性能也有了显著提升。
一个简单版本的LSM Tree包含两层类似于树状的数据架构:

  • Memtable(内存表)完全驻留在内存中(定义为T0组件)
  • SSTable(Sorted String Table)存储在磁盘上(定义为T1组件)

在这里插入图片描述
新纪录被插入到Memtable中(T0组件)。如果插入导致T0组件超过一定的大小阈值,则从T0中删除一个连续的条目段,并将其合并到磁盘上的SSTable(T1组件)中。

3 组件

LSM Tree主要使用3个组件来优化读写操作:

Sorted String Table (SSTables):

数据按排序顺序排序的,因此无论何时读取数据,在最坏的情况下,其时间复杂度将为O(Log(N)),其中N是数据库表中的条目数。
在这里插入图片描述
这是一个内存结构;
以排序方式存储数据;
作为回写(Write-Back)缓存;
当到达一定大小时将作为SSTable刷入数据库;
当磁盘中SSTable的数量增加时,如果某些key不存在于记录中时:

  • 要查询这些key,需要读取所有SSTable,这增加了读取时间的复杂度
  • 为了克服这个问题,Bloom filter出现了
  • Bloom filter是一种节省空间的数据结构,它可以告诉我们记录中是否缺少key,准确率为99.9%
  • 要使用此filter,我们可以在写入数据的时候向其添加记录,并在读取请求开始时检查key,以便在请求第一次出现时更有效地服务请求

在这里插入图片描述

Compaction:

直接翻译过来就是压实:
磁盘中以SSTable的形式存储数据时,假设有N个SSTable,每个表的大小为M;
最坏情况下,读取时间复杂度为O(N* Log(M)),因此,随着SSTable数量的增加,读时间复杂度也会增加;
此外,当我们只是刷新数据库中的SSTable时,相同的Key存在于多个SSTable中;
这时候Compactor就能发挥作用,compactor在后台运行,合并SSTable并删除相同的多行,并添加最新数据的新键,并将它们存储在新的合并/压缩的SSTable中。
在这里插入图片描述
在这里插入图片描述
正是这一组件,许多基于LSM Tree的分布式数据库也在标榜自己在存储侧的压缩能力,可以节省存储成本。

4 问题

LSM Tree既然有较强的写入响应能力,存储节省能力,那么LSM Tree就没有缺点么?

  • 还是借用吕海波老师的总结:“LSMTree最主要的问题,它是针对OLAP。底层Skiplist,锁的粒度要么太细,锁太多。要么锁粒度太粗,锁一大段链表。传通架构,锁就在块上,块上加个Pin,比Skiplist的并发性要好。”(说真的这句话看的不是太明白)
  • 读性能偏低,但是在强大硬件和分布式MPP加持下也能带来不错的读性能
  • 写放大,还是那句话,NVMe SSD上那都不是事
  • 延迟合并带来的不一致,特别是分布式架构同分片不同节点合并进度不同,可能导致连续两次在不同节点查询的结果不一致,当然这些都是可以通过一些技术手段解决的
  • 等等等等

总结

这不是我一个擅长的领域,以前没有接触过,也是翻了不少英文文档来写这一篇文章,可能还有些东西是不对的,也是一种尝试吧,也想着去看看国产分布式数据库引以为傲的底层。
老规矩,不知道写了些啥。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1335317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ Qt开发:Charts绘制各类图表详解

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TreeWidget与QCharts的常用方法及灵活运用。 …

buuctf-Misc 题目解答分解97-99

97.[BSidesSF2019]zippy 下载完就是一个流量包 追踪tcp nc -l -p 4445 > flag.zip unzip -P supercomplexpassword flag.zip Archive: flag.zip 压缩包密码 supercomplexpassword 保存为 flag.zip 解压得到flag 98.[GUET-CTF2019]虚假的压缩包 先从虚假的压缩包入手 &am…

LeetCode-环形链表问题

1.环形链表(141) 题目描述: 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统…

【知识点随笔分享 | 第九篇】常见的限流算法

目录 前言: 1.固定窗口限流: 缺点: 2.滑动窗口限流: 优点: 滴桶限流: 缺点: 令牌桶限流: 优点: 总结: 前言: 当今互联网时代,随着网络…

【算法学习】斐波那契数列模型-动态规划

前言 我在算法学习过程中,针对斐波那契数列模型的动态规划的例题进行了一个整理,并且根据标准且可靠一点的动态规划解题思路进行求解类似的动归问题,来达到学习和今后复习的必要。 所谓的斐波那契数列模型,即当前状态的值等于前两…

JDKtomcat环境配置共享目录防火墙

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《产品经理如何画泳道图&流程图》 ⛺️ 越努力 ,越幸运 目录 1、配置JDK 2、配置tomcat 3、配置文件夹共享功能 4、防火墙配置 5、思维导图 1、配置JDK 建立一个共…

2023新能源汽车,吵得越凶,卖得越多

作者 | 辰纹 来源 | 洞见新研社 2023年的汽车行业很残酷,合资大败退,市场份额被自主品牌大幅渗透,三菱退出中国市场,成为真实写照。 新能源车企,威马领头,天际、自游家NIUTRON、恒驰、爱驰、雷丁等造车新…

电商数据分析-01-电商数据分析指标

电商数据指标 电商数据分析涉及多个指标,这些指标可以帮助企业了解其业务表现、用户行为和市场趋势。以下是一些常见的电商数据分析指标: 销售指标: 总销售额(GMV): 衡量特定时期内所有销售交易的总值。 平…

Diary26-Vue综合案例1-书籍购物车

Vue综合案例1-书籍购物车 案例要求: 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewpor…

微信小程序合集更更更之echarts雷达图!

实现效果 写在最后&#x1f352; 更多相关内容&#xff0c;关注&#x1f365;苏苏的bug&#xff0c;&#x1f361;苏苏的github&#xff0c;&#x1f36a;苏苏的码云~

【Linux系统编程】【Google面试题改编】线程之间的同步与协调 Linux文件操作

编写程序&#xff0c;有四个线程1、2、3、4 线程1的功能就是输1,线程2的功能就是输出2,以此类推……现在有四个文件ABCD初始都为空 现要让四个文件呈如下格式&#xff1a; A: 1 22 333 4444 1 22 333 4444… B: 22 333 4444 1 22 333 4444 1… C: 333 4444 1 22 333 4444 1 2…

10-让Java性能提升的JIT深度剖析

文章目录 JVM的语言无关性解释执行与JITC1、C2与Graal编译器C1编译器C2编译器 分层编译(了解即可)热点代码热点探测方法调用计数器回边计数器 编译优化技术方法内联锁消除标量替换逃逸分析技术逃逸分析的原理逃逸分析 JVM的语言无关性 跨语言&#xff08;语言无关性&#xff0…

TCP 三次握手:四次挥手

TCP 三次握手/四次挥手 TCP 在传输之前会进行三次沟通&#xff0c;一般称为“三次握手”&#xff0c;传完数据断开的时候要进行四次沟通&#xff0c;一般称为“四次挥手”。 数据包说明 源端口号&#xff08; 16 位&#xff09;&#xff1a;它&#xff08;连同源主机 IP 地址…

Python Opencv实践 - 人体姿态检测

本文仍然使用mediapipe做练手项目&#xff0c;封装一个PoseDetector类用作基础姿态检测类。 mediapipe中人体姿态检测的结果和手部跟踪检测的结果是类似的&#xff0c;都是输出一些定位点&#xff0c;各个定位点的id和对应人体的位置如下图所示&#xff1a; 关于mediapipe的pos…

07 Vue3框架简介

文章目录 一、Vue3简介1. 简介2. 相关网站3. 前端技术对比4. JS前端框架5. Vue核心内容6. 使用方式 二、基础概念1. 创建一个应用2. 变量双向绑定&#xff08;v-model&#xff09;3. 条件控制&#xff08;v-if&#xff09;4. 数组遍历&#xff08;v-for&#xff09;5. 绑定事件…

项目经理到底要不要考取PMP证书呢?

IT行业考PMP的人是最多的&#xff0c;转管理是大部分人30人的想法&#xff0c;如果是小白&#xff0c;拿到PMP证书直接转管理还是有些难度的。 不过“经验式管理终将成为过去&#xff0c;专业式管理才是时代趋势”&#xff0c;要想做好一个项目经理&#xff0c;系统的项目管理…

redis基本用法学习(C#调用StackExchange.Redis操作redis)

StackExchange.Redis是基于C#的高性能通用redis操作客户端&#xff0c;也属于常用的redis客户端之一&#xff0c;本文学习其基本用法。   新建Winform项目&#xff0c;在Nuget包管理器中搜索并安装StackExchange.Redis&#xff0c;如下图所示&#xff1a;   StackExchange.…

[kubernetes]Kube-APIServer

API Server API Server是什么 提供集群管理的REST API接口&#xff0c;包括认证授权、数据校验以及集群状态变更等提供其他模块之间的数据交互和通信的枢纽&#xff08;其他模块通过API Server查询或修改数据&#xff0c;只有API Server才直接操作etcd&#xff09; 访问控制…

《PySpark大数据分析实战》-19.NumPy介绍ndarray介绍

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…

creo投影的使用-如何将一个实体的轮廓曲线单独画出来

第一步&#xff1a;先建立一个平面&#xff1a; 比如你需要将实物的曲线正对自己&#xff0c;然后建立此面的偏移平面&#xff0c;然后选中新建立的偏移平面&#xff0c; 然后进入新偏移平面的草绘&#xff0c;然后就可以进行投影了。 第二步&#xff1a;建立参考&#xff1a;…