数据整理的Compact流程 (二)|OceanBase数据转储合并技术解读(二)

上篇文章《数据整理的Compact流程 (一)|OceanBase数据转储合并技术解读(二)》中,有讲解到,在OceanBase数据库中,当MemTable写满时,将其下刷到Mini SSTable的过程包含两个步骤:第一步,是将原本可写的MemTable冻结转换为只读的Frozen MemTable;第二步,是将这个已冻结的只读Frozen MemTable持久化存储到磁盘上,形成Mini SSTable。今天,我们将详细探讨这一后续步骤,也就是“转储”的具体执行流程。

整个转储过程可以分为三个阶段:准备阶段、执行阶段以及收尾阶段。

准备阶段

准备阶段主要包括选择这次转储需要处理的Frozen MemTable、拆分此次转储任务的并行度等。

首先是选取Frozen MemTable。我们知道,写到MemTable上的每条数据都会先持久化到写前日志以防止宕机丢失,而由于写前日志追加写的性质,每条数据会拥有一个递增的日志序号,我们这里称其为log_scn。基于此,我们可以通过log_scn的范围来标识一个MemTable或者SSTable。

以下图为例,一共有4个Frozen MemTable,分别包含了log_scn在(0, 100],(100,500],(500,1500]和(1500,2000]的数据。其中(0,500]的两个Frozen MemTable已经合成了一个Mini SSTable,但因为某些原因暂时没有回收。由于(0,500]的两个Frozen MemTable已经持久化到SSTable,我们认为其对应的日志可以回收,因此会存在一个checkpoint_scn的日志序号,用来表示log_scn小于该值的数据都已经持久化到SStable了。

那么此时如果新的转储任务到了准备阶段,将通过checkpoint_scn把Frozen MemTable分为两部分,其中大于checkpoint_scn的Frozen MemTable被选取为此次转储所需要处理的MemTable。

当选取了Frozen MemTable后,我们会通过第一个Frozen MemTable来划分并行度以及并行区间。具体来说,首先以Frozen MemTable的数据量估计值与一个参数值的比值来得到并行度。我们希望每个子任务处理一个MemTable中约128MB的数据,因此这个参数值默认是128MB(对于想要自定义的用户来说,可以通过修改表属性TABLET_SIZE来更改)。然后我们根据并行度,将Frozen MemTable内的rowkey大致均分成几个区间。以下图为例,当并行度为4时,理想情况下Frozen MemTable会被分成4份,每份包含1/4 rowkey范围的数据。

执行阶段

执行阶段主要包括迭代行、整合行以及输出行等步骤。

这里我们以一个简化的示例来展开介绍。我们假设数据行是(rowkey, c1, c2, c3)的四列结构,当前转储需要处理以下两个Frozen MemTable,其中从上到下是按照从旧到新的顺序摆放。在MemTable中,每个rowkey都包含一个或多个节点,每个节点代表了对该rowkey对应数据行的一次操作(insert/delete/update)。

首先我们会为每个MemTable生成一个迭代器,每个迭代器将按照rowkey顺序依次迭代,每次将从n个迭代器中得到n行。在下面的例子中,两个迭代器会分别从两个Frozen MemTable中迭代出两行,其中iter1迭代时从最早的行insert开始,将rowkey_A的两行数据整合(fuse)成了一个新的完整行;而iter2则迭代出了一个部分行(只包含rowkey_A以及更新列c3的值)。

当得到n个迭代器吐出的n行后,我们会对结果进行rowkey的比较,从中得出rowkey最小的行。在上面的例子里,我们会得到具有相同rowkey_A的两行。接着我们会将比较后得到的多个具有相同rowkey的行进行整合(fuse),形成一个或多个数据行。下面的例子中,两个最小rowkey的行被整合成了一行,时间上更新的update c3操作被整合到了输出行中。

当我们得到一个最终的输出行后,首先会将其追加写入微块的缓冲区,当缓冲区达到微块大小后,将进行压缩,压缩后的微块数据将追加写入宏块缓冲区,直到宏块缓冲区写满后触发写盘的操作。这里为了简化,我们没有介绍宏块/微块的一些索引结构。

注:迭代行的过程我们省略了事务提交与否、多版本行的与事务相关的复杂概念,感兴趣的同学可以阅读一篇与此相关的博文来进一步了解。

收尾阶段

收尾阶段主要包括生成Mini SSTable、更新table_store以及回收MemTable。

以下图为例,两个Frozen MemTable经过迭代、整合、输出后得到了两个宏块,并且两个宏块在block file上处于并不连续的位置。我们将基于这两个宏块生成一个Mini SSTable结构,通过SSTable的元数据,我们能够定位到其包含宏块的物理位置(注:实现上OceanBase为微块构造了B树形式的索引结构,SSTable的元数据中只需要记录树根就可以方便地进行微块的定位)。接着由于table_store(这里我们可以理解为一个分区的LSM-Tree结构)的MemTable/SSTable组成发生了变化,我们会新生成一个table_store,其中包含新的Mini SSTable以及旧的Major SSTable。最后我们回收数据已被持久化到SSTable的Frozen MemTable。

这篇博客的内容大多基于ob_tablet_merge_task.cpp源码,欢迎大家前往阅读与学习,也欢迎在评论区讨论任何想法和问题。

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

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

相关文章

「小明赠书活动」第四期《Java开发坑点解析:从根因分析到最佳实践》

目录 ⭐️ 赠书 - 《Java开发坑点解析:从根因分析到最佳实践》 参 加 活 动 方 式 见 文 末 ⭐️内容简介 -《Java开发坑点解析:从根因分析到最佳实践》 ⭐️阅读建议 -《Java开发坑点解析:从根因分析到最佳实践》 ⭐️《Java开发坑…

CSS 介绍及用法,常用属性

一、CSS介绍 A. 简介 CSS全称:全称为层叠样式表(Cascading Style Sheets),是一种用于描述网页外观和格式的计算机语言。CSS可以使网页的布局更加丰富和多样化,并且可以将样式信息与网页内容分离,使得网…

C语言——基于stm32G030的温湿度传感器项目实验

一、功能要求: 设备自检功能: 设备上电自检(检查传感器采集是否正常, DHT11有存在响应, 可以自检使用, )自检通过后,由串口打印设备状态信息。 自动控制功能: 进入自动控…

python连接FTP服务器:[WinError 10054] 远程主机强迫关闭了一个现有连接

一、原始报错信息 pythonProcess finished with exit code -1073740791 (0xC0000409) 这个报错信息,太过于笼统,是分析不出代码出了什么问题的。 二、打印详细报错信息 在服务器相关可能报错的地方,进行报错信息追踪: import …

如何在OrangePi AIpro智能小车上实现安全强化学习算法

随着人工智能和智能移动机器人的广泛应用,智能机器人的安全性和高效性问题受到了广泛关注。在实际应用中,智能小车需要在复杂的环境中自主导航和决策,这对算法的安全性和可靠性提出了很高的要求。传统的强化学习算法在处理安全约束时存在一定…

SpringBoot搭建OAuth2

背景 前几天自己从零开始的搭建了CAS 服务器,结果差强人意(反正是成功了)。这几天,我躁动的心又开始压抑不住了,没错,我盯上OAuth2了,大佬们都说OAuth2比CAS牛批,我就想知道它有多牛…

Elasticsearch不删原有jdk8导致的系列安装和启动问题

以前在空机器直接装elasticsearch,没有遇到什么问题。今天在现有JDK上安装,遇到的问题记录一下: 1. JDK的环境变量配置与我原有的不一致报如下错误: [estestZK-DES-I root]$ /usr/elasticsearch/bin/elasticsearch could not fi…

SSL函数01-数组函数Array Functions

一、数组的初始化 SSL中,数组下标从1开始! 1-1、不知道数组的长度 :DECLARE a6; a6 : {}; Aadd(a6,a); Aadd(a6,b); Aadd(a6,c); 当用a : {}创建一个数组的时候,不可以用a[1] 值,来赋值! 1-2、知道数组的长度 方式一…

【录用案例】2天录用!提交可录,沾边即可!

本周投稿推荐 SSCI • 2区社科类,3.0-4.0(录用友好) EI • 计算机工程生物医学等(2天录用) CNKI • 3天内初审录用,随即出版(急录友好) SCI&EI • 4区生物医学类&#x…

数据链路层 + NAT技术

数据链路层:负责设备之间的数据帧的传送和识别。 一、以太网 以太网的帧格式 如何分离报头和有效数据? 报头是固定长度的 如何将数据交给上层协议? 通过类型,如果是0800,则交给IP协议,如果是0806&#xf…

JavaScript正则表达式

一、介绍 正则表达式是用于匹配字符串中字符组合的模式。在javascript中,正则表达式也是对象。通常用来查找、替换那些符合正则表达式的文本,许多语言都支持正则表达式。 正则表达式的作用: 表单验证(匹配)、过滤敏感…

筛斗数据提取:解锁信息宝藏的关键步骤

在数字化时代,数据已成为推动社会进步和企业发展的关键要素。然而,数据本身并不直接产生价值,其价值在于我们如何从中提取有用的信息。数据提取,作为解锁信息宝藏的关键步骤,对于任何希望从海量数据中获取洞察力和竞争…

十四天学会Vue——Vue核心(理论+实战)上篇(第一天)

一、Vue核心(上篇) 热身tops:选取开发模式 ①用于开发模式 我们只需要知道 我们是开发模式,开发模式他会跟你提示代码出现错误的地方以及出错原因,而生产模式比较简洁。 ②用于生产模式 1.1 new Vue()实例 了解Vue&a…

人脸识别——筛选与删除重复或近似重复数据提高人脸识别的精确度

1. 概述 人脸识别研究通常使用从网上收集的人脸图像数据集,但这些数据集可能包含重复的人脸图像。为了解决这个问题,我们需要一种方法来检测人脸图像数据集中的重复图像,并提高其质量。本文介绍了一种检测人脸图像数据集中重复图像的方法。该…

有趣的css - 双开门按钮

大家好,我是 Just,这里是「设计师工作日常」,今天分享的是一个双开门的按钮,交互效果比较强,但是实现很简单,快学起来吧。 最新文章通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码cs…

充电宝哪家好用推荐?买什么充电宝性价比高?2024年充电宝排行榜

说实话,我其实是个手机重度使用者,买过的充电宝也有无数款了,每次手机没电的时候插座都离得不是特别近,不是要下床充电就是要固定在一个位置充电感觉怪麻烦的,但是有了充电宝后可以在床上玩手机都不用担心手机没电&…

惯性测量单元M-G366PDG提供低误差系数的解决方案

人形机器人、自动驾驶的快速发展,促成了惯性测量单元(IMU)的爆火市场。据相关研究报告统计,IMU全球市场规模从2018年的99.94亿美元增加至2021年的135.95亿美元预计2027年将达到222.53亿美元,2021年至2027年复合增长率达8.56%。而由于智能技术…

VUE3+TS+elementplus创建table,纯前端的table

一、前言 开始学习前端,直接从VUE3开始,从简单的创建表格开始。因为自己不是专业的程序员,编程主要是为了辅助自己的工作,提高工作效率,VUE的基础知识并不牢固,主要是为了快速上手,能够做出一些…

免费,Python蓝桥杯等级考试真题--第13级(含答案解析和代码)

Python蓝桥杯等级考试真题–第13级 一、 选择题 答案:C 解析:正向下标由0开始,下标3代表第四个元素,故答案为C。 答案:A 解析:range(0,4)的取前不取后,元组的符号是小括…

AI大模型在测试中的深度应用与实践案例

文章目录 1. 示例项目背景2. 环境准备3. 代码实现3.1. 自动生成测试用例3.2. 自动化测试脚本3.3. 性能测试3.4. 结果分析 4. 进一步深入4.1. 集成CI/CD管道4.1.1 Jenkins示例 4.2. 详细的负载测试和性能监控4.2.1 Locust示例 4.3. 测试结果分析与报告 5. 进一步集成和优化5.1. …