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过程。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HQL面试题练习 —— 合并数据

题目来源:京东 目录 1 题目2 建表语句3 题解 1 题目 已知有数据 A 如下,请分别根据 A 生成 B 和 C。 数据A ------------ | id | name | ------------ | 1 | aa | | 2 | aa | | 3 | aa | | 4 | d | | 5 | c | | 6 | aa…

mac操作系统下,docker登录nexus私库,提示不支持https协议的错误

一、背景 我们使用nexus搭建了一个Docker Registry私有仓库,在Mac操作系统,在推送本地镜像到私库前,要求我们登录私库,报错如下: docker login 192.168.5.6:8086 -u username -p passwordWARNING! Using --password …

Python轻松玩转excel操作指导

目录 一、一图概览 二、表格操作 三、内容操作 四、单元格操作 五、Pandas实现表格操作 六、常见场景示例 一、一图概览 ​ ​本文主要对openpyxl库的常用表格操作进行了梳理,熟练的运用后可极大地提升工作效率。 二、表格操作 #创建一个表格sheet.xlsx #…

[论文阅读笔记31]Mamba (Selective Structured State Space Model) 及其应用

最近想学一下Mamba模型,奈何看了很多视频还是感觉一知半解,因此做一篇笔记,顺便介绍一下Mamba结构作为CV backbone和时间序列预测领域的应用。 论文1. Mamba: Linear-Time Sequence Modeling with Selective State Spaces 0. Abstract 现有…

linux查看是否被入侵(一)

1、查看当前系统状态 [rootbastion-IDC ~]#top #一般挖矿等病毒点用CPU比较大 2、查看当前登录用户(w\who) 3、检查系统日志 检查系统错误登陆日志,统计IP重试次数 [rootbastion-IDC ~]# lastb 4、查看近期用户登录情况 [rootkvm01 ~]# last -n 5 #-n 5 表示…

【同构字符串】python

思路: 先记录同一个值出现的次数,再将字典中的值取出,比较2个列表即可 代码: class Solution:def isIsomorphic(self, s: str, t: str) -> bool:dit1dict()dit2dict()for i in range(len(s)):if s[i] not in dit1:dit1[s[i…

入门五(项目介绍及登录和发布需求)

软件缺陷判定标准 项目中缺陷的管理流程 使用Excel对于缺陷进行管理 使用工具管理缺陷 一、项目背景 传智作为一个IT教育机构,拥有自己开发且实际运营的产品; 将开发和运营的技术作为授课的内容,对于学员而言学到的都是一手的真实案例和…

vue data中的return

vue 的data return 是干啥的呢,vue中页面中绑定的变量都要放在data的return中,可以赋值,值可在script中改,修改引用就用this了 如果不使用return包裹的数据会在项目的全局中可见,会造成变量污染; 使用retu…

Mixed-precision计算原理(FP32+FP16)

原文: https://lightning.ai/pages/community/tutorial/accelerating-large-language-models-with-mixed-precision-techniques/ This approach allows for efficient training while maintaining the accuracy and stability of the neural network. In more det…

Android BACK键和HOME键应用差异详解

文章目录 1、应用层分析1.1 BACK键功能实现 1.2 HOME键功能实现 1.3 BACK键与HOME键的区别 2、系统层分析2.1 BACK键的处理2.2 HOME键的处理2.3 代码分析BACK键HOME键BACK键的系统代码分析HOME键的系统代码分析BACK键HOME键 3、优缺点分析3.1 BACK键3.2 HOME键 4、项目中的使用…

3小时-入门短视频创作:短视频创作入门必修(15节视频课)

课程目录 1、先导课.mp4 2、建立视听思维.mp4 3、口语化.mp4 4、具象化.mp4 5、建立选题思维.mp4 6、2个小白好上手的选题技巧.mp4 7、建立开场思维.mp4 8、3个口播视频方能开场套路.mp4 9、建立脚本结构思维.mp4 10、爆款口指的3大结构.mp4 11、建立标题思维.mp4 …

【顶刊新文】nature plants|植物高度作为高山碳固存和生态系统对变暖响应的指标

文章简介 论文名称:Plant height as an indicator for alpine carbon sequestration and ecosystem response to warming(植物高度作为高山碳固存和生态系统对变暖响应的指标) 第一作者及单位:Quan Quan(中国科学院地…

服务器被黑?快速检测和识别系统中的恶意进程

在管理和维护服务器时,检测和识别系统中的恶意进程是非常重要的。本文将详细介绍几种常用方法和工具,帮助您有效地检测和处理恶意进程,确保系统的安全性。 方法一:使用系统监控工具 1.1. 使用 ps 命令 ps 命令可以列出系统中所有正在运行的进程。使用以下命令查看特定用户…

推荐丨快速申请免费域名证书

背景: 域名是一个IP地址上的“面具” 。一个域名的目的是便于记忆和沟通的一组服务器的地址(网站,电子邮件,FTP等)。 通俗的说,域名就相当于一个家庭的门牌号码,别人通过这个号码可以很容易的找到你。 域名不仅便于记…

安装mamba时报错bare_metal_version

原因:缺少cuda118的环境版本,直接安装 nvidia/label/cuda-11.8.0 可解决,代码如下: conda install -c "nvidia/label/cuda-11.8.0" cuda-nvcc

C++笔记:三种适配器(分别修饰函数、迭代器、容器)

Algorithms看不见Containers,对其一无所知。所以,它所需要的一切信息都必须从iterators取得,而iterators(由Containers提供)必须能够回答Algorithm的所有提问,才能搭配该Algorithm的所有操作。 1. C 标准库…

Linux之LLVM、Clang、Clang++区别及用法实例(六十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

SpringCloud系列(26)--OpenFeign超时控制

前言:在上一章节中我们简单的介绍了如何使用OprnFeign去调用微服务,因为消费侧和服务侧是两个不同的微服务,这样可能会出现超时的现象,例如服务侧需要3秒处理任何才能返回结果,但消费侧可能2秒就断开连接了&#xff0c…

Django 里的静态资源调用

静态资源:图片,CSS, JavaScript 一共有两种方法 第一种方法 在项目的文件夹里创建名为 static 文件夹 在该文件夹里,添加静态资源 在 settings.py 里添加路径 import os# Static files (CSS, JavaScript, Images) # https://docs.djan…

基于Arduino IDE的ESP32开发环境搭建

文章目录 一. Arduino IDE安装二. Arduino IDE安装ESP开发包 一. Arduino IDE安装 Arduino官网下载IDE软件 解压下载好的安装包,以管理员身份运行Arduino IDE软件 IDE第一次启动会安装各种驱动,直接点击确定就行 二. Arduino IDE安装ESP开发包 将…