了解数据库中常用存储引擎数据结构(4)

news2025/1/12 9:02:57

目录

深入了解LSM树及其发展

一条数据的整体写入过程

读操作(Bloom Filter优化)

合并策略(Merging Policy)

LSM-Tree并发控制机制

一些Compaction优化方案


深入了解LSM树及其发展

LSM Tree 的概念起源于 1996年的论文《The Log Structure Merge Tree》,此后由 Google Bigtable 第一个商业化实现并于 2006 年发表论文《Bigtable:A distributed strorage system for structured data》。

随后,Google 的两位专家基于 BigTable 的经验实现了 LevelDB,一个单机 LSM Tree 存储引擎,并开源。

此后,FaceBook 基于 LevelDB 开发了 RocksDB(非常棒的 KV 数据库,非常值得学习!)!

RocksDB 做了相当多的迭代演进,如:多线程、Column Family(类似于关系型数据库中表的概念)、Compaction策略等。

目前,RocksDB 已经成为 LSM Tree 领域的一个事实标准!

RocksDB 的结构图:

  • 写入的数据首先要记录 WAL(Write-ahead Log),用来做实时落盘,以实现持久性。
  •  随后,数据有序的写入 Active Memtable 中;同时,Active Memtable 也是这里唯一可变的结构! 在一个 Active Memtable 写满后,就把它转换为 Immutable Memtable。
    • 上面两类 Memtable 都在内存中,使用的数据结构基本上是跳跃表(也有vector、hash-skiplist等)
  • 当 Immutable Memtable 达到指定的数量后,就将 Immutable Memtable 落盘到磁盘中的 L0 层-----这步操作被称为 minor merge。
    • 通常,对于 minor merge 的 Memtable 不做整理(无 Compaction 过程),直接刷入磁盘。因此,L0 层可能会存在重复的数据。
  • 当 L0 层的数据满了之后,就会触发 major merge,也就是关键的 Compaction 操作。
    • 将 L0 层的数据和 L1 层的数据进行合并,全部整理为 “固定大小的、不可变的数据块”,称为 SSTable(Sorted String Table),并放在 L1 层。
    • 这样,除了 L0 层之外的磁盘中的每一层都是由一个个 SST 组成的,这些 SST 之间互不重叠!
    • SST 的出现结合后文会讲到的的 Bloom Filter,在很大程度上提升了 LSM Tree 的读性能!
    • 并且,L1 和之后层次间的合并,可以仅合并部分重叠的 SST,使 Compaction 过程更加灵活、效率更高。

SSTable 是由 LevelDB 最初实现的一种数据格式,被称为 Sorted String Table(有序字符串表)。

一个 SST 通常由两个部分组成:

  • 索引文件:可以是 BTree 或者哈希表
  • 数据文件:就是要存储的 KV 数据

可以将 SST 理解为一个小型的聚簇索引结构,只是这个结构整体是不可变的!

一条数据的整体写入过程

一条数据进入到 LSM Tree 后会:

  • 首先写入 active memtable,然后进入 immutable memtable,接下来被刷入 L0 层,然后随着 Compaction 操作一层层向下。
  • 这个过程如果碰到了更下层的同 key 数据,那么就会将对方合并。
  • 如果在 Compaction 过程中遇到了从更高层来的同 key 新的数据,那么就会被合并。

读操作(Bloom Filter优化)

从 LSM Tree 中读取的过程就是从上至下层层扫描,直至找到数据。

在查找的过程中,有一个非常关键的优化,可以加速我们对数据的筛选,那就是:Bloom Filter

Bloom Filter 用来筛选一层中是否包含我们要查找的数据。

注意到,它可能会返回假阳性的结果,也就是返回一个 key 在这一层,但是实际查找下来是不存在的!但是一定不会返回假阴性的结果!

即:如果 Bloom Filter 返回一个 key 不在这一层,那么这个 key 一定是不存在的!

通常,如果只有一个 Hash 函数的话,Hash 值重合的概率比较高,误报率较高。因此,可以设置多个 Hash 函数,这样进来一个 key 的话,只有所有 bytes 映射都命中,才需要真正查询,可以极大程度上降低误报率!

但是如果 Hash 函数过多,Bloom Filter 的代价就会过大,占用的内存也会增多。因此需要好好协调,这里是一个重要的调参方向;

合并策略(Merging Policy)

上面讲述的是目前主流的 LSM Tree 的实现,本小节来简单介绍一下另一些 LSM Tree 的实现和探索。

LevelDB 等一系列 LSM Tree 实现采用的方法都是 Leveling Merge Policy 方法。Leveling 合并策略就是将相连两层的数据做合并,然后一起写入下面一层。

而除此之外,还有另一种合并策略,就是Tiering Merge Policy。Tiering 合并策略的每一层都有多个重叠的组件,合并时也并非将相连两层合并,而是将一层中所有组件进行合并,并放入下一层。

相比于 Leveling 合并策略,Tiering 合并策略显而易见的对写入更加友好,但读取的性能会进一步降低:因为每一层也有多个重叠的区域,查找时都是要查找的!

Cassandra 数据库使用的便是 Teiring 合并策略。

LSM-Tree并发控制机制

总体来讲,LSM Tree 因为其天然的 Out-of-place update 特性,在并发控制方面的问题比 BTree 少很多!

对于 LSM Tree 而言,关注的重点主要在于会引起结构变更的操作:

  • Memtable 落盘;
  • Compaction 过程;

在早期只有一个 Memtable 的情况下,Memtable 的落盘会造成一段时间的不可写!

目前,区分 active memtable 和 immutable memtable 的设计就能在很大程度上避免 memtable 落盘造成的问题。

一些Compaction优化方案

Compaction 一种都是 LSM Tree 的瓶颈所在。Compaction 过程中占用大量资源,并调整数据位置,同时会引发缓冲池中数据的大量丢失,影响 LSM Tree 结构的读取性能,严重情况下,还可能会造成写停顿(Write Stall)!

因此,关于 Compaction 的优化一直也是 LSM 领域的关注重点!

使用 Tiering 合并策略是提升综合写性能、减少写放大的一个重要手段。还有另外一些手段来优化 Compaction:

  • 采用流水线技术:将读取、合并、写入三个操作以流水线的形式执行,以增强合并操作的资源利用率,减少耗时。
  • 复用组件:在合并的过程中识别出不变的部分并保留。
  • 主动更新Cache:在 Compaction 结束后主动更新 Cache,或采用机器学习的方式预测回填。
  • 单独硬件执行Compaction:把 Compaction 操作 Offload 到例如 FPGA 等额外的硬件上执行。

视频地址B+树,B-link树,LSM树...一个视频带你了解常用存储引擎数据结构(合集)_哔哩哔哩_bilibili

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

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

相关文章

【网络工程师模拟面试题】(2)OSPF区域划分与LSA细节

一、OSPF中心结点与周围200个路由器节点建立邻居,该如何划分区域,为什么? 这个问题其实没有标准答案,因为据OSPF RFC标准文档(RFC 2328 OSPF Version 2)来看,其中内容并没有规定OSPF单区域的邻居数量限制,…

【鸿蒙学习】HarmonyOS应用开发者基础 - 从网络获取数据

学完时间&#xff1a;2024年8月15日 一、前言叨叨 学习HarmonyOS的第七课&#xff0c;人数居然反超到了3735名了&#xff0c;难道前面的那一课&#xff0c;这么多人挂科了吗。不过这一节的内容稍微简单一些&#xff0c;都是网络相关知识。 <HarmonyOS第一课>从网络获取…

【Angular18】封装自定义组件

1. 准备组件 2. 创建打包文件夹及部分配置文件 创建 文件夹app-legalentities-root拷贝组件源文件到新的文件夹app-legalentities中创建文件 .npmrc registry发布地址always-authtrue创建文件 ng-package.json {"$schema": "./node_modules/ng-packagr/ng-pac…

FChen的408学习日记--三次握手和四次握手

一、三次握手 在建立连接的过程中&#xff0c;首先SYN1&#xff0c;随机发送sqex。服务器接受后要反过来对客户端发送连接请求&#xff0c;SYN1&#xff0c;随机发送sqey&#xff0c;ackx1。然后客户端还要发送连接确认报文&#xff0c;原因如下 例题&#xff1a; 二、四次…

WeiXin Bill Record

WeiXin Bill Record 微信账单记录查询流程 【我】 【钱包】 【账单】 选中一笔【查询对象】的交易记录 【查看往来转账】 【导出凭证】 选择查询开始时间&#xff0c;结束时间&#xff1b;【申请】 【验证】 【同意】协议 进入人脸识别 【申请】 【查看详情】 【确定】

SaaS中如何应用AIGC:智能赋能,引领未来

引言 在数字化浪潮的推动下&#xff0c;SaaS&#xff08;软件即服务&#xff09;已成为企业数字化转型的重要工具。而 AIGC 作为人工智能领域的前沿技术&#xff0c;正逐步渗透到SaaS的各个环节&#xff0c;为企业带来前所未有的智能化体验。 一、智能客服与自动化服务 在Saa…

Docker-命令

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Docker架构二、Docker进程相关命令&#xff08;一&#xff09;启动 docker 服务&#xff08;二&#xff09;重启 docker 服务&#xff08;三&#xff09;停…

C语言——二分法求有序数组中指定元素的位置

二分法只是用于有序的数组&#xff0c;如果是无序输入&#xff0c;还需要进行排序。此外&#xff0c;mid 中间值不是整数&#xff0c;要取整。 #include <stdio.h> #include <stdlib.h> int Bin_search(int* p, int len, int target) { int left 0; int …

数实融合打破场景边界,苏宁大店直播火了!

今年以来&#xff0c;促消费扩内需举措持续发力&#xff0c;创新消费场景作为重点发力方向&#xff0c;在多个场合被提及。近期&#xff0c;国务院《关于促进服务消费高质量发展的意见》进一步提出&#xff0c;加速推动消费场景应用升级和数字赋能&#xff0c;构建智慧商圈、智…

苹果iOS 17.6.1正式推送,有哪些机型值得更新呢?

在科技界&#xff0c;每一次操作系统更新都备受瞩目&#xff0c;尤其是对于苹果这样在全球范围内拥有庞大用户群的品牌而言。 最近&#xff0c;苹果发布了iOS 17.6.1更新&#xff0c;这一小版本更新不仅修复了一系列关键错误&#xff0c;还针对之前版本中存在的问题进行了针对…

纺织设备如何实现信息化转型?

纺织设备的信息化转型&#xff0c;是当代制造业智能化升级的关键一环&#xff0c;它不仅深刻影响着纺织行业的生产效率与产品质量&#xff0c;还促进了整个产业链的创新与优化。这一进程不仅仅是简单地将信息技术融入传统纺织机械中&#xff0c;而是通过深度融合物联网、大数据…

【AI】AI编程工具概述

1. AI编程工具概述 1.1 定义与功能 AI编程工具是利用人工智能技术辅助编程工作的软件集合&#xff0c;它们通过集成到现有的开发环境中&#xff0c;提供代码自动生成、补全、错误检测、优化建议等功能&#xff0c;旨在提高开发效率和代码质量。 代码生成&#xff1a;AI工具可…

[书生大模型实战营][L0][Task1] Linux 远程连接 InternStudio

[书生大模型实战营][Task1] Linux 远程连接 InterStudio 1. 申请 InterStudio 账号 https://studio.intern-ai.org.cn/console/dashboard 2. ssh 生成公匙与密匙 使用 ssh-gen 生成公匙与密匙 # 1. ssh-gen ssh-gen# 2. 查看生成的文件 ls ~/.ssh# 3. 打开生成的公匙&#…

如何在 Linux 系统上创建软硬链接 ?

在本指南中&#xff0c;我将介绍什么是链接以及如何更好地使用它们以及所需的概念。 通过执行 man ln 命令&#xff0c;可以看到这是在文件之间建立链接&#xff0c;而没有提及是软链接或硬链接。 shashilinuxtechi ~}$ man ln类似地&#xff0c;命令 man link 描述为调用链接…

vue-I18n开箱方式

最近公司没什么活&#xff0c;没事捣鼓捣鼓技术 话不多说 上干货 npm i vue-i18nlatest //下载最新版插件创建文件用来存放需要的公共语言 文件夹内容 const zh {message: {Language: "简体中文",name: "中文名称",}, }; export default zh;const ja …

基于微软TTS,优雅的实现文本转语音

项目介绍 该项目源自以前了解的edge-tts&#xff0c;edge-tts 是一个python库&#xff0c;用于将文本转换为语音&#xff0c;它依赖于 Microsoft Azure 的 Text-to-Speech 服务&#xff0c;可以轻松实现本地文字转语音&#xff0c;在所有的文字转语音的服务中&#xff0c;说它…

Unity透视镜透视效果——Shader

一、效果示意图 二、透视的过程 要看的效果&#xff1a;【相机】借助【球体】&#xff0c;透过【圆柱】看到【红色的方块】 三、实现原理-Shader 借助shader&#xff0c;两个挂有特殊shader的物体&#xff0c;当他们在视线里重叠的时候&#xff0c;重叠的部分变成透明。 …

Android NDK开发入门

目录 1. 创建 C 代码2. 定义 JNI 接口3. 在 Java 中声明本地方法4. 创建 CMakeLists.txt 文件5. 配置 build.gradle6. 编译和运行7.项目结构8.总结 在 Android 开发中&#xff0c;编写 JNI (Java Native Interface) 接口使得应用层能够调用 C 代码&#xff0c;涉及到几个步骤&a…

光流运动估计教程

文章目录 概要什么是光流?稀疏光流与密集光流实现稀疏光流1. 设置环境2.配置OpenCV读取视频并设置参数3. Grayscaling 3. 灰度化4. Shi-Tomasi 角点检测器 – 选择要跟踪的像素5. Lucas-Kanade:稀疏光流6. 可视化实现密集光流1. 设置环境2. 配置 OpenCV 读取视频3. 灰度4. Fa…

从力扣中等+困难题+表白HTML测试 -- 文心快码(Baidu Comate)

0 写在前面 官网地址&#xff1a;Baidu Comate Step1 打开文心快码&#xff08;Baidu Comate&#xff09;官网&#xff0c;点击「免费使用」/「下载安装」 Step2 可以根据官网步骤快速唤起VS Code&#xff1b; 也可以直接在VS Code、Visual Studio扩展管理搜索“文心快码”/…