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

数据库管理-第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是数据库表中的条目数。
在这里插入图片描述

Memtable

这是一个内存结构;
以排序方式存储数据;
作为回写(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.mzph.cn/news/577709.shtml

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

相关文章

NPM的介绍和使用

NPM(Node Package Manager)是一个用于共享和管理JavaScript代码包的工具。它是Node.js的官方包管理工具,可以方便地安装、更新、卸载和发布Node.js模块。以下是NPM的一些主要功能和使用方法的介绍: 1. 安装NPM:NPM是N…

C++模板函数重载规则细说

引言 模板编程&#xff0c;指的是可以我们可以将函数或者类的数据类型抽离出来&#xff0c;做到类型无关性。我们关注的对象&#xff0c;是普通函数、普通类。如下面的这个经典的模板函数&#xff1a; template<typename T> bool compare(T t1,T t2) {return t1 >t2…

matlab设置colorbar标题的两种方式

%% 第一种 figure; A rand(3,4,3); A1 A(:,:,1); A2 A(:,:,2); A3 A(:,:,3); contourf(A1,A2,A3,30); colormap(jet);colorbar; my_handlecolorbar; my_handle.Label.String depth/km; my_handle.Label.FontSize 15;%% 第二种 figure; A rand(3,4,3); A1 A(:,:,1); A2 …

新概念英语第二册(2)

【New words and expressions】生词和短语&#xff08;5&#xff09; until prep. 直到 outside adv. 外面 ring v. &#xff08;铃、电话等&#xff09;响&#xff08;rang, rung&#x…

隔壁小孩馋哭了都要问我要的MySQL数据库攻略

1 Mysql数据库 1.1 数据库概念 数据 描述事物的符号记录 包括数字、文字、图形、图像声音、档案记录等 以“记录”形式按统一的格式进行存储 表 将不同的记录组织在一起 用来存储具体数据 数据库 标的合集&#xff0c;是存储数据的仓库 以定的组织方式存储打的相互有…

linux Systemd为裸机goLand应用保驾护航

这里是weihubeats,觉得文章不错可以关注公众号小奏技术&#xff0c;文章首发。拒绝营销号&#xff0c;拒绝标题党 背景 线上有一个Goland的应用程序&#xff0c;goland语言和java不同&#xff0c;如果有任何异常就直接挂掉退出&#xff0c;异常处理要实现 try catch也比较麻烦…

等级保护安全的管理机构与管理制度

目录 安全管理机构的控制点 岗位设置 人员配备 授权和审批 沟通和合作 审核和检查 安全管理制度的控制点 安全管理制度 指定和发布 评审和修订 安全管理机构的控制点 岗位设置 人员配备 授权和审批 沟通和合作 审核和检查 安全管理制度的控制点 安全管理制度 指定…

云卷云舒:算力网络+云原生(中):探索构建算力网络数据库

一、导言 1、基础要求&#xff1a;算力网络时代&#xff0c;数据类型、范围充分延展和爆发&#xff0c;数据库也要适应起来&#xff0c;分布式数据库是起步要求&#xff1b; 2、近期需求&#xff1a;通过云服务的方式提供算网时代&#xff0c;尤其是智能大模型所需要的向量数…

042、文本与语言模型

之——nlp基础 目录 之——nlp基础 杂谈 正文 1.文本预处理 2.语言模型 3.语言模型实现 杂谈 在语言模型中&#xff0c;需要对文本进行预处理&#xff0c;进行数字化的一系列操作&#xff0c;而后才能进行网络的拟合。 以前的相关&#xff1a;词性判断 正文 1.文本预处…

简易的555函数信号发生器电路图

函数信号发生器是一种信号发生装置&#xff0c;能产生某些特定的周期性时间函数波形&#xff08;正弦波、方波、三角波、锯齿波和脉冲波等&#xff09;信号&#xff0c;频率范围可从几个微赫到几十兆赫。除供通信、仪表和自动控制系统测试用外&#xff0c;还广泛用于其他非电测…

基于深度学习的安全帽检测识别系统(含UI界面、yolov5、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov5 yolov5主要包含以下几种创新&#xff1a;         1. 添加注意力机制&#xff08;SE、CBAM、CA等&#xff09;         2. 修改可变形卷积&#xff08;DySnake-主…

输入url后回车发生了什么(持续更新)

在大多数情况下&#xff0c;浏览器被认为是单线程的。也就是说&#xff0c;他们从头到尾执行一项任务&#xff0c;然后再开始另一项任务。为了实现流畅的交互&#xff0c;开发人员的目标是确保高性能的站点交互&#xff0c;从平滑滚动到触摸响应。渲染时间是关键&#xff0c;确…

Wireshark网络工具来了

Wireshark是网络包分析工具。网络包分析工具的主要作用是尝试捕获网络包&#xff0c;并尝试显示包的尽可能详细的情况。 Wireshark是一个免费开源软件&#xff0c;不需要付费&#xff0c;免费使用&#xff0c;可以直接登陆到Wireshark的官网下载安装。 在windows环境中&#x…

FPFA.一种二倍频电路代码描述以及测量详情

一、前言 1、因为需要倍频电路所以找了个二倍频的电路&#xff0c;通过fpga实际测量发现经过倍频后的电路峰值降低。不过这个也正常&#xff0c;因为该电路只要过触发点就会开始发生波形变化&#xff0c;而电路的触发值不是峰值。​​​​​​​ 2、继续对电路做倍频后信号做二…

LeetCode_Java判断给出的字符串是否是合法的括号序列

public class BracketSequence {public static void main(String[] args) {System.out.println(isValid("([])"));}public static boolean isValid(String s) {if(snull || s.length()0){return true;}//新建栈&#xff0c;用以存储左括号Stack<Character> sta…

嵌入式开发常见的3个C语言技巧

​1.操作寄存器 在嵌入式开发中&#xff0c;常常要操作寄存器&#xff0c;对寄存器进行写入&#xff0c;读出等等操作。每个寄存器都有自己固有的地址&#xff0c;通过C语言访问这些地址就变得尤为重要。 #define GSTATUS1 (*(volatile unsigned int *)0x560000B0)在这里…

国外加固Appdome环境检测与绕过

文章目录 前言第一部分&#xff1a;定位检测逻辑的通用思路1. 通过linux“一切皆文件”思路定位2. 分析现有检测软件猜测可能检测点3. 通过正向开发思路定位4. 通过activity及弹窗定位 第二部分&#xff1a;检测结果展示整体流程1. Jni反射调用doDispath完成广播发送2. NativeB…

第11章 GUI Page439 步骤十二 为图元编号 支持直线

运行效果&#xff1a; 关键代码&#xff1a; 为IItem类新增三个函数&#xff0c;两个纯虚 为直线类&#xff0c;新增一个_index成员&#xff0c;并实现GetIndex和SetIndex两个函数 窗口类新增一个 _item_id成员&#xff0c;并初始化 在将图元压入队列之前&#xff0c;设置图元…

多继承与多重继承

多继承与多重继承 实验介绍 多继承与多重继承虽然只相差一个字,但是却是两个不同的概念。实验首先是要区分多继承与多重继承,其次是要学习多继承与多重继承的使用方式。 知识点 多继承与多重继承概念继承构造函数多继承与多重继承概念 多继承与多重继承可以从字面上理解。…

IDEA2018升级2023,lombok插件不兼容导致get/set方法无法使用

1、问题 最近了解到一款叫CodeGeeX 的智能编程助手&#xff0c;想要试用一下&#xff0c;但是IDEA2018版本太低了&#xff0c;没有CodeGeeX插件&#xff0c;于是打算将IDEA升级到2023.2.5版本&#xff0c;具体升级过程略过&#xff0c;升级完成后&#xff0c;启动项目&#xf…