OceanBase的存储架构与传统LSM-Tree架构的异同|OceanBase数据转储合并技术解读(二)

前篇博文将OceanBase的存储架构巧妙地与自然界中的“水生态”进行了类比,今日我们转变视角,聚焦在与拥有相同LSM-Tree架构的其他产品的比较,深入探讨OceanBase相较于它们所展现出的独特性能。

 众所周知,OceanBase数据库的存储引擎是以LSM-Tree架构为基础的。相较之下,传统的LSM-Tree结构在层次化存储方面往往表现得更为明显,而OceanBase的LSM-Tree实现则在此基础上有其独特之处

我们以业界经典的LSM-Tree实现案例为例--单机存储引擎LevelDB:其数据流向和OceanBase数据库是类似的,数据会从可写的Activate Memtable->只读的Immutable Memtable->L0 ->L1 ->...->Ln 。磁盘数据被从上到下分成了多个层次,越下层的数据越旧。同时,在写入内存前,数据会先追加写入写前日志(WAL)中。

 LevelDB中只读的内存数据通过Flush过程被下刷到磁盘,并按照键的顺序以SSTable文件的形式存储。L0层的SSTable文件间存在数据范围的重叠,每个SSTable文件可以被认为是一个sorted run(一个有序的集合,集合内每个元素唯一)。而L0层以下的每一层SSTable文件是有序不重叠的,也就是说,每一层的多个SSTable文件共同构成了一个sorted run。每层的SSTable文件会通过compact过程向下一层移动,每一次compact过程会涉及到相邻两层多个数据范围重叠的SSTable文件。这些SSTable文件的数据会重新进行排序与合并,形成一个新的SSTable文件。随着从上到下层数的增加,每层的可容纳SSTable文件总数据量会成倍数增长。

 对于这样的分层结构,我们很容易注意到其中存在的几个问题:

  • 读放大
    • LSM-Tree的读操作需要从新到旧层层查找,这个过程可能需要多次I/O,放大了读盘次数。
  • 空间放大
    • 磁盘数据都是只读的,大量冗余和无效数据会占用额外的存储,放大了磁盘空间。
  • 写放大
    • 磁盘数据的有序整理不可避免的带来了额外的写入。

所谓的compact过程通过将层级之间的数据进行合并、清理无效的数据、减少上下层级有范围重叠的SSTable文件数量,改善了读放大与空间放大的问题,但由于增加了额外的磁盘写操作,引入了额外的写放大问题。

 为了权衡这三者,不同的实现者通常会采用不同的compact策略:

  • size-tiered compaction
    • 每层有多个大小相近的sorted runs,当某一层的数据总量达到限制后将整层合并,刷写到下一层成为一个更大的sorted run,直到最大的一层维护一个sorted run。这种方式对全局有序的要求最小,可以最大程度的减少写放大。但由于数据冗余度可能较大,读放大和空间放大问题较为严重。
  • leveled compaction
    • 每层一个sorted run,层级之间维持相同的数据倍数比,层级越高数据量越多。每层的数据量达到限制后与下一层进行合并。通常每个sorted run被划分为多个SSTable文件,以提供了更精细化的合并任务的拆分与控制。这种compact方式将相邻层级的多个SSTable降为一个,减小了读放大和空间放大。但由于compact时最差情况可能涉及下一层级的所有SSTable文件,写放大相对更大。
  • tiered+leveled compaction
    • 结合了size-tiered和leveled的compact方式,某些层包含多个sorted runs,某些层只有一个sorted run。

不难看出,LevelDB采用的是tiered+leveled的compact方式,其中L0层包含了多个sorted runs,其余层只有一个sorted run,但从compact的流程来说,L0层的多个sorted runs在合并到下一层的过程里会选择L1层有数据范围重叠的SSTable文件,更接近于leveled compaction的形式。

 在了解完传统LSM-Tree架构的实现与相关知识后,我们通过下图简单回忆一下上篇博客讲到的OceanBase的存储架构。可以看到,OceanBase和LevelDB单机存储引擎的数据流转方向是近乎一致的,这也是同为LSM-Tree架构的显著相同点:数据都是先追加写到日志,再写入内存;内存都分为可写的与只读的两部分,通过冻结可写部分来生成只读部分,通过将只读部分下刷到磁盘形成持久化只读数据。

 而两者的不同点主要集中在为了权衡读放大、写放大和空间放大所做的磁盘只读数据的组织和管理上。

 LevelDB的每个SSTable是一个独立的文件,通过以多个SSTable文件组成一个sorted run的形式来细分每次compact操作;而为了能够有效减小写放大和空间放大,OceanBase希望没有修改过的数据不要进行重写,因此OceanBase将所有数据统一存储在一个文件(data_file)上,以定长块(宏块)的形式来分配和使用data_file的空间,每个SSTable由多个不连续的宏块组成,没有修改过的宏块能够在compact时直接重用。这种组织方式上的差异性进一步让OceanBase和LevelDB有了一些区别:

  • Level的磁盘数据通常具有比较明显的层级划分,每层数据量的上限从上到下逐级增大,L0层由多个SSTable文件组成,每个SSTable文件是一个sorted run,L0层以下的每层都是一个sorted run,由一个或多个SSTable文件组成;如果以层级来划分OceanBase的磁盘数据的话,可以被认为有三层,由于有宏块这一细粒度有序集的存在,OceanBase中的L1层与L2层并不需要细分为多个SSTable,而是直接通过一个SSTable来组成sorted run。

 从compact的角度来说,OceanBase也和LevelDB不一样。为了更好的控制写放大,OceanBase既可以通过tiered类型的compact过程将若干个Mini SSTable合成一个Mini SSTable,也可以通过leveled类型的compact过程将若干个Mini SSTable和一个Minor SSTable合成一个新的Minor SSTable。同时,为了最大程度的减小读放大与空间放大,OceanBase会定期进行full compact过程,将所有SSTable合成一个新的Major SSTable。由于该过程通常被放在业务低峰期,资源的大量占用被认为是可接受的。

 另一方面,从具体的一些实现上来说,LevelDB的MemTable通常采用跳表的结构,而OceanBase的MemTable则采用了BTree+HashTable的混合结构。

 从下一章开始,我们将展开讲讲OceanBase是如何整理SSTable的。当然,感兴趣的同学不妨先预习一下,在OceanBase的Github仓库里查看ob_compaction_util.h文件,我们将逐一揭秘其中“M系列”的compact过程。

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

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

相关文章

element-ui 前端ui框架用法开发指南(2024-05-22)

Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库 1、npm安装 // npm安装:npm install element-ui --save 能更好地和 webpack 打包工具配合使用 2、cdn在线引入 访问最新版本的资源地址 - element-uiThe CDN for element-u…

RedHat9 | DNS剖析-配置主DNS服务器实例

一、实验环境 1、BIND软件包介绍 BIND软件是一款开放源码的DNS服务器软件,由美国加州大学Berkeley分校开发和维护,全称为Berkeley Internet Name Domain。该软件在DNS(域名系统)领域具有重要地位,是目前世界上使用最…

使用OpenCV dnn c++加载YOLOv8生成的onnx文件进行目标检测

在网上下载了60多幅包含西瓜和冬瓜的图像组成melon数据集,使用 LabelMe 工具进行标注,然后使用 labelme2yolov8 脚本将json文件转换成YOLOv8支持的.txt文件,并自动生成YOLOv8支持的目录结构,包括melon.yaml文件,其内容…

Python怎样定位并删除Sql语句中不确定的查询条件

1.问题场景描述: 在sql语句中经常会有查询条件是:查找多个订单签订日期范围的数据,但具体的日期范围是不确定,我们如何来查找定位 例如:查询条件语句的部分如下图: 目标是: 1)定位字符串:t_contract_order.sign_date 2)最终得到结果: 解决问题思路: 1)定位要找的字符串起始位置…

【学习心得】PyTorch的知识要点复习(持续更新)

PyTorch知识要点复习,目的是为了巩固PyTorch基础、快速回顾、深化理解PyTorch框架。这篇文章会持续更新。 一、本文的一些说明 知识点梳理:我将PyTorch的核心概念和高级技巧进行了系统化的整理,从基础的张量操作到复杂的模型构建与训练。这样…

【Linux】进程终止与进程等待

目录 进程终止 errno exit和_exit 进程等待 wait和waitpid 宏:WIFEXITED 非阻塞等待 进程终止 下面要谈的一个话题就是进程终止,就是说一个进程退出了,可能有三种情况 1.进程代码执行完,结果是正确的 2.进程代码执行完&…

【活动】开源与闭源大模型:探索未来趋势的双轨道路

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 开源与闭源大模型:探索未来趋势的双轨道路引言一、开源大模型&#…

翻译《The Old New Thing》- The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag

The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071128-00/?p24353 Raymond Chen 2007年11月28日 FORMAT_MESSAGE_IGNORE_INSERTS 标志的重要性 简要 文章讨论了使用FormatMes…

评估企业的业务是否存在高风险的六个步骤

风险的幽灵使得组织别无选择,只能改善各种网络风险的总体管理。以下是一个基于信息安全论坛的IRAM2方法论的分步过程,网络安全和风险从业者可以利用它来评估和管理信息风险。 第1步:范围界定练习 范围界定练习的目标是提供一个以业务为中心…

基于springboot+vue的招聘信息管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

K8s的常用命令以及yaml文件的创建

目录 一、声明式管理方法:YAML文件 1、yaml文件简介 2、yaml和json的主要区别: 3、YAML的语法格式 4、yaml文件组成部分 ①控制器定义 5、查看api资源版本标签 6、编写nginx-deployment.yaml资源配置清单 6.1创建资源对象 6.2查看创建的pod资源…

Unity-Sprite Atlas+UGUI系统的运行原理

每日一句:别听世俗耳语,看自己的风景就好 目录 SA的原理: SA的优点: SA的缺点: DrawCall是什么? 批处理是什么? 我们先了解一下UGUI系统的运行原理吧! 提到图集优化&#xff0…

cocosCreator动态生成二维码

cocosCreator 版本:3.7.2 开发语言:typeScript 我们在游戏开发中,经常会生成一个专属于玩家个人的二维码,比如说推广、充值等功能。 接到这个任务,在网上找了下,还是有很多教程的。但是这些教程大部分都是用…

Ollydbg动态分析MessageBoxA输出hellow world

一、目的 找到main函数找到调用的MessageBoxA函数 测试源码 #include <iostream> #include <windows.h>int main() {MessageBoxA(NULL, "Hellow World", "Title", MB_OK);return 1; }二、快捷键 指令快捷键说明RestartCtrlF2重新开始调试S…

buu[HCTF 2018]WarmUp(代码审计)

buu[HCTF 2018]WarmUp&#xff08;代码审计&#xff09; 题目 访问source.php <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php…

电脑键盘如何练习盲打?

电脑键盘如何练习盲打&#xff1f;盲打很简单&#xff0c;跟着我做&#xff0c;今天教会你。 请看【图1】&#xff1a; 【图1】中&#xff0c;红色方框就是8个基准键位&#xff0c;打字时我们左右手的8个手指就是放在这8个基准键位上&#xff0c;F键和J键上各有一个小突起&…

Spring6基础笔记

Spring6 Log4j2 1、概述 1.1、Spring是什么&#xff1f; Spring 是一款主流的 Java EE 轻量级开源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并创立&#xff0c;其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发…

mysql图形化界面及将mysql注册成后台程序

安装图形化界面版本 右键新建数据库 字符集使用utf8防止以后数据库中存在中文字符导致乱码 将mysql注册成后台程序 cmd进入命令行界面 切换路径到cd /mysql/bin 将mysql注册成后台程序 mysqld.exe --install mysql1 (失败&#xff0c;说明没有权限) 以管理员身份打开成功…

SYSTEM文件夹介绍(sys文件夹、deley文件夹、USART 文件夹、SysTick、printf函数、fputc函数、半主机模式)

参考 http://t.csdnimg.cn/P9H6x 一、sys文件夹介绍 在上述介绍的 sys 文件夹中&#xff0c;涉及了一些与系统控制、中断管理、低功耗模式、栈顶地址设置、系统时钟初始化以及缓存配置等相关的函数。以下是对每个功能的简要分析&#xff1a; 1.中断类函数&#xff1a; sys_n…

CCF20230901——坐标变换(其一)

CCF20230901——坐标变换&#xff08;其一&#xff09; #include<bits/stdc.h> using namespace std; int main() {int n,m,x[101],y[101],x1[101],y1[101];cin>>n>>m;for(int i0;i<n;i)cin>>x1[i]>>y1[i];for(int j0;j<m;j)cin>>x[…