关于OceanBase中旁路导入的应用分享

背景

前段时间,在用户现场协助进行OceanBase的性能测试时,我注意到用户常常需要运用 insert into select 将上亿行的数据插入到一张大宽表里,这样的批量数据插入操作每次都需要耗时半个小时左右。对这一情况,我提议用户尝试采用旁路导入的方式,结果不到五分钟就就完成了相同数据量的导入。虽然当时我表面保持冷静,但内心却充满喜悦。用户方的DBA同事们也半开玩笑地表示:“看来我们即将失去因导入数据而赢得的咖啡时间红利了。”

昨晚负责旁路导入研发的剑鸣同学分享了一次关于旁路导入的技术讲座。我借此机会写了一篇学习笔记,详细梳理了旁路导入的大致思路,并总结了用户在使用过程中需要注意的要点。

​​​​​​​

设计思路

目前,OceanBase主流使用三种导入方式:load data、obloader 和 oms,这些方式都使用 insert 语句将数据写入 OceanBase。然而,使用 insert 语句写入数据需要经过 SQL、事务和存储。OceanBase 使用 LSM-Tree 结构进行存储。在这种存储结构中,insert 语句会先将数据写入内存表中,然后经过多轮转储和合并,才能最终存入最底层的 SSTable 中。这些过程消耗了大量的系统资源,特别是 CPU 资源,因此导入数据的速度不够理想。为了加快导入速度,我们采用了一种绕过中间步骤的技术,将需要导入的数据直接写入最底层的 SSTable 中,这种技术称为旁路导入。此外,旁路导入还可以用于加速一些需要大量写入 SQL 的操作,例如背景中提到的 insert into select 语句。旁路导入的语法详见官网中几个相关的语法,例如 load data。

1705632762

根据上图所示,数据导入可采用两种路径,上方深蓝色箭头所示的传统路径需要经过 SQL查询、事务处理、数据存储等一系列模块。而下方的浅蓝色箭头所示旁路导入路径主要是对导入的数据进行类型转换(按需),然后按照主键进行排序(按需),最后将排序后的数据写入到 major sstable 中。旁路导入是一条短路径,能减少不少系统资源消耗,加快导入速度。(上图中的 LSM-tree 指的是 Log-Structured Merge Tree, 一种基于内存和磁盘的数据结构,用于高效地插入、删除和查询大量数据。SSTable 指的是 Sorted String Table, 一种有序、持久化存储数据的数据结构,可支持高效的读写操作和范围查询。)

实现原理

现在的旁路导入是利用 DDL 来实现的,可以认为是一种特殊类型的 DDL。

所以主要的执行流程和 DDL 类似(DDL 的实现原理可以详见夏进的这篇博客《OceanBase Alter Table 原理介绍》),旁路导入的实现分为了几个步骤:

    1. 创建 hidden table,用于导入
    2. 给原表和 hidden table 加表锁
    3. 把原表的数据和新导入的数据合并后写入 hidden table 中
    4. 在 hidden table 中重建原表的索引和外键
    5. 交换原表和 hidden table 的 table_id(如果中间任何一步出现错误,不交换 table id 就可以保证原子性,只有当全部步骤都成功,才会交换 table id)
    6. 解表锁

如果原表不是空表,已经有一些数据了,就会把原表里的数据和导入数据一起整合到 hidden table 里面。

例如下图中 tablet 是原表的 tablet,tablet' 是 hidden table 的 tablet,旁路导入会把原表的 memtable、sstale,以及导入的数据一起归并到新的 hidden table 里。

1705632779

例如通过 load data 命令进行旁路导入,整体的数据流向是:类型转换、根据分区键转发到对应节点、在节点上按需进行排序,最后写入 major sstable。

1705632790

我们在这里还对数据类型转换的优化、数据排序、解析 csv 等过程都做了大量的优化。

对于数据类型转换:例如 csv 文件里的内容是 string,但是实际的列类型是 number(在 MySQL 模式下相当于 decimal),这时候就需要根据 number format 进行一个非常复杂的隐式类型转换,我们在这里对隐式类型转换中的 to_number 函数最常用的一些 number format 进行了非常极致的短路优化,性能比直接调用 to_number 能提升四五倍的样子。

对于数据的排序:因为 OB 都是索引组织表,所以如果对于无主键表,是不需要进行排序的(写入时一个隐藏的 increment pk 列会自动保证有序),直接写入 major sstable 就可以了,这也就是无主键表比有主键表的旁路导入速度还能再快上几倍的原因。对于有主键表,那就不得不按照主键进行排序了,如果输入的数据已经是有序的(例如 csv 文件中的数据就有序),我们还提供了一个选项,支持用户通过指定要导入的数据是否有序来决定能否进行优化,如果已经有序,内部就只会做归并排序。完全无序时才会走完整的排序流程,无序时为了充分利用内存资源,我们会对数据进行一个归并的外排,首先先利用最大可用内存对数据进行排序,然后落盘,最后再对磁盘上的各个有序的数据文件进行一个多线程的归并排序,这样不仅可以充分利用内存资源,还可以有效减少落盘的次数。

1705632806

其他的优化由于篇幅关系,这里就不再详细描述了。

使用时需要注意的一些地方

用户在日常使用中,如果不了解目前旁路导入一些要注意的地方,很可能会遇到各种问题,以下就是使用旁路导入时需要注意的几个点:

1. 旁路导入期间会加表锁,表无法被写入其他数据,整个过程中表是只读的。

2. 旁路导入的实现是 DDL 而非 DML,这点要特别留意!

(1)按理说 insert into select 可以在事务里面的,但是例如 Oracle 的 DDL 如果出现在事务中,就会在 DDL 执行结束之后提交事务,然后再继续处理事务中的后面的内容,DDL 类似于事务中的一个 barrier。因为 DDL 在事务中的特殊表现,所以我们暂时不支持旁路导入出现在多行事务中,只能出现在 autocommit 的单行事务中,否则会报错 not supported。

(2)还有一个要注意的点是 DDL 框架比较重,导入 1 行数据可能就需要 2s,所以不适合用于导入量特别小的数据(例如 100M 以下的数据)。

(3)由于 DDL 实现逻辑的限制(在 RS 上会有一段儿逻辑需要串行执行),暂时不能很好地支持大规模多条旁路导入并行。比如并发执行几百个普通的 insert into select 是没问题的,但是并发执行几百个旁路导入的 insert into select,可能就会有一堆 DDL 排队等着 RS 的调度了。

这几个点确实给使用上带来了一些麻烦,不过我们后面会把它的实现方式给改成 DML。

3. 功能上支持增量导入,但是性能上可能不会特别理想。因为旁路导入的目标表如果在导入前已有数据,那么已有数据会被重写一遍。如果导入一个已有数据量很大的表,增量需要把原来的数据重写一遍,这时候可能并不划算。

4.如果租户的内存特别大,或者说数据量比 memtable 还要小,那内存的 memtable 就能兜住全部要导入的数据,旁路导入可能就没啥优势了。因为旁路导入是要写磁盘的,肯定比不过只写内存不需要转储、合并的场景

5. 4.2 版本 lob 列还不支持走旁路导入,不过后面即将发布的 4.3 版本已经支持了。

6. 使用 INSERT INTO SELECT 语句旁路导入数据时,只支持 PDML(Parallel Data Manipulation Language,并行数据操纵语言),非 PDML 不能用旁路导入,详见官网。

总结

最后总结一下,OB 目前的旁路导入功能,最适用于:

  1. 大表的首次导入场景;
  2. 10 GB~TB 级别的数据迁移场景;
  3. 还有就是 CPU 和 内存都不是特别充裕的场景,因为旁路导入的执行路径很短,可以省掉非常多的 CPU 开销。

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

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

相关文章

基于springboot+vue的失物招领平台

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

【软考】生成树

目录 1. 概念2. 图解3. 例题3.1 例题1 1. 概念 1.对于有n个顶点的连通图,至少有n-1条边,而生成树中恰好有n-1条边2.连通图的生成树是该图的极小连通子图3.若在图的生成树中任意加一条边,则必然形成回路4.图的生成树不是唯一的5.从不同的顶点…

python3+requests+unittest:接口自动化测试(一)

简单介绍框架的实现逻辑,参考代码的git地址: GitHub - zhangying123456/python_unittest_interface: pythonunittest接口自动化测试脚本 1.环境准备 python3 pycharm编辑器 2.框架目录展示 (该套代码只是简单入门,有兴趣的可…

UE4 面试题整理

1、new与malloc的区别 new: new首先会去调用operator new函数,申请足够的内存(大多数底层用malloc实现),然后调用类型的构造函数来初始化变量,最后返回自定义类型的指针,delete先调用析构函数&…

HCIP—BGP路由聚合

在大型网络中,路由条目通常多达成千上万条,甚至几十万条,这给路由设备带来的挑战是:如何存储并有效管理如此众多的路由信息? BGP是一种无类路由协议,支持CIDR、VLSM和路由聚合。路由聚合技术的使用…

【微服务】Nacos配置管理

📝个人主页:五敷有你 🔥系列专栏:微服务 ⛺️稳中求进,晒太阳 Nacos除了可以做注册中心,同样可以做配置管理来使用。 1.统一配置管理 当微服务部署的实例越来越多,达到数十、数百时&am…

JVM垃圾回收之内存分配,死亡对象判断方法

Java 堆是垃圾收集器管理的主要区域,因此也被称作 GC 堆。 堆划分为新生代 老生代 永久代。 下图所示的 Eden 区、两个 Survivor 区 S0 和 S1 都属于新生代,中间一层属于老年代,最下面一层属于永久代。 内存分配原则 对象优先在Eden区域分…

jupyter notebook设置代码提示方法

在命令行运行以下代码: pip install jupyter_contrib_nbextensionsjupyter contrib nbextension install --userpip install jupyter_nbextensions_configuratorjupyter nbextensions_configurator enable --user (有时安装第一行后会自动执行第二行&a…

Redis监控工具

Redis 是一种 NoSQL 数据库系统,以其速度、性能和灵活的数据结构而闻名。Redis 在许多领域都表现出色,包括缓存、会话管理、游戏、排行榜、实时分析、地理空间、叫车、聊天/消息、媒体流和发布/订阅应用程序。Redis 数据集完全存储在内存中,这…

八部门联合打击涉税违法犯罪活动,企业合规经营刻不容缓

近期,国家税务总局、公安部、最高人民法院、最高人民检察院、中国人民银行、海关总署、市场监管总局、国家外汇管理局在北京召开全国八部门联合打击涉税违法犯罪工作推进会议。 会议强调八部门将持续深化完善联合打击工作机制,依法严厉打击涉税违法犯罪行…

借教室与差分

原题 题目描述 在大学期间,经常需要租借教室。 大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。 教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。  面对海量租借教室的信息&…

9.测试教程-性能测试概述

文章目录 1.常见的性能问题2.为什么要进行性能测试3.性能测试实施的流程4.概念和术语介绍5.性能测试模型6.性能测试方法介绍7.性能测试实施与管理8.性能测试前期准备9.测试工具引入10.性能测试方案11.性能测试设计与开发12.性能测试设计与管理13.性能测试设计与调优14.性能测试…

Python+Appium实现自动化测试的使用步骤

一、环境准备 1.脚本语言:Python3.x IDE:安装Pycharm 2.安装Java JDK 、Android SDK 3.adb环境,path添加E:\Software\Android_SDK\platform-tools 4.安装Appium for windows,官网地址Redirecting 点击下载按钮会到GitHub的下载…

广西开放大学电大搜题微信公众号,助你快速解题,轻松学习!

近年来,广西开放大学电大搜题微信公众号备受关注。作为一名电大学者,我有幸亲身体验了该公众号的功能,并深感其对广大学生学习的帮助之大。 广西开放大学作为一所具有百年历史的学府,一直致力于为学生提供优质的教育资源。而电大…

Uibot6.0 (RPA财务机器人师资培训第2天 )采购付款——网银付款机器人案例实战

训练网站:泓江科技 (lessonplan.cn)https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981(本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~&#xff0…

【Python + Django】启动简单的文本页面

前言: 为了应付(bushi)毕业论文,总要自己亲手搞一个像模像样的项目出来吧 ~ ~ 希望自己能在新的连载中学到项目搭建的知识,这也算是为自己的测试经历增添光彩吧!!! 希望、希望大家…

09 事务和连接池

文章目录 properties文件连接池service层实现类dao层实现类dao层实现类 连接池类: 创建线程池静态常量,用于放连接。 创建Properties静态常量,用于解析properties文件 静态代码块中,解析properties文件,将解析结果用于创建连接池 …

Linux快速入门,上手开发 02.VMware的安装部署

倘若穷途末路,那便势如破竹 —— 24.3.21 一、VMware的作用 在Windows或IOS系统下,给本地电脑安装VMware虚拟机,用来在虚拟机上安装Linux系统,避免重复资源的浪费,可以在虚拟机上搭建Linux系统进行学习 二、VMware的安…

PCL点云处理之中值计算(二百三十三)

PCL点云处理之中值计算(二百三十三) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 读取的点云是无序散乱的,点云坐标包括xyz三个维度,以常用的z高程维度为例,计算其高程中值,获取对应的点。 主要涉及到根据高程对点云进行排序的操作,下面是具体的代码和结果。 …

视频号下载助手失效了?如何解决下载视频问题!

在刷短视频的时候难免会遇到部分的视频号视频下载不下来,那我们该如何解决视频号下载问题呢? 视频号下载助手解决方案 视频号下载助手失效分为两种情况! 1、可以解析,但不能下载 根据使用视频号下载助手常见的问题,我们发现会有…