OceanBase实践分享:如何用ODC进行历史数据归档,提升性能

news2024/11/24 10:51:02

作者:洪波,数据库爱好者



 最新版 V4.2.2 已上线,其新增的数据生命周期管理功能颇具吸引力。据官方资料显示,ODC现支持将源数据库中的表数据,无论是单次还是周期性地,归档至其它目标数据库。这一设计旨在解决线上数据日益增长对查询性能及业务运行带来的挑战。

此功能的引入意味着,我们可以轻松地将大量历史数据,从主集群中迁移至专门的历史归档集群。否则线上数据库的数据量会随着时间推移不断膨胀,而许多历史数据的查询频率逐渐降低,这会拖慢表的查询速度。而通过数据归档,线上数据库仅需保留数月或一年的数据,超出此时间范围的数据都可以归档并删除。这样便能确保线上数据库始终保持高性能。那么,这个功能具体是如何实现的呢?接下来,就让我为大家率先体验并详细解析这一新功能。

原理介绍

这块根据官网介绍,先简单了解下原理。

1703141483

如上图所示,简单理解就是有两个任务,根据条件,把历史数据从在线库迁移到归档库,然后再将历史数据从在线库中删除,总体需要经过几个步骤的配置,包括选择归档内容 -> 配置归档条件 -> 定义调度方式 -> 数据清理策略 -> 最终执行,这中间也包含了一些流量的限制,以及任务的回滚,下面就边演示边介绍。

不过根据官网介绍,这里面也是有一些限制,可以看一下:

  • 前置条件:
    • OceanBase 数据源必须通过 OBproxy 连接(暂不支持对直连的 OceanBase 进行归档操作)。
    • OceanBase 数据源目前仅支持集群实例,新建数据源时必须配置集群名称。
    • OceanBase 数据源必须配置 sys 租户账号。
    • 非同类型数据源,数据归档不支持自动创建目标表。
    • 需保证源端表字段在目标端兼容,数据归档不处理字段兼容性问题。
    • MySQL 数据源暂不支持 CPU 内存防爆能力。
  • 归档链路支持:
    • OceanBase MySQL 到 OceanBase MySQL 。
    • MySQL 到 MySQL。
    • MySQL 到 OceanBase MySQL 。
    • OceanBase MySQL 到 MySQL。
  • 以下情况不支持归档:
    • 若表中不包含主键 PRIMARY KEY,不支持进行归档。
    • 若表中包含 bit、enum、set、xml 、geometry字段类型,不支持进行归档。
    • 若归档条件中包含 limit 语句,不支持进行归档。
    • 若表中包含外键,不支持进行归档。

环境信息

这里有两个OceanBase集群,就简单模拟一个在线库和一个历史归档库

在线库127.xx.xx.90租户:obtest归档表:test.custom
历史归档库127.xx.xx.89租户:obtest归档表:test.custom
ODC服务127.xx.xx.89

测试表为custom,表结构如下,总共有10万行数据

obclient [test]> desc custom;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id       | int(11)      | NO   | PRI | NULL    |       |
| name     | varchar(200) | YES  |     | NULL    |       |
| birthday | datetime     | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+
3 rows in set (0.002 sec)

obclient [test]> select count(*) from custom;
+----------+
| count(*) |
+----------+
|   100000 |
+----------+
1 row in set (0.027 sec)

配置过程

ODC的部署非常简单,可以使用docker方式部署,也可以直接下载安装包,在mac或者windows机器上部署,具体部署方式可以查看官方文档:ODC部署

数据源管理

首先需要在ODC将两个集群添加到数据源中,在ODC数据源页面,新建数据源即可,选择OceanBase MySQL,填入对应的数据库信息

1703141503

填写完成之后,就开始创建项目

创建项目

在创建归档任务工单之前,需要先创建一个项目

1703141518

然后在项目中添加数据源和数据库,这块应该主要是做一些权限限制,防止登录ODC的用户有操作所有数据源的权限,因此可以将用户权限和项目绑定,只能操作项目中的数据库。

1703141534

创建归档工单
一次性归档

在这里我们先创建一个立即执行的工单,在工单页面中,创建数据归档的工单,工单中选择对应的线上集群和归档集群。

变量配置:因为我们创建的是只执行一次的工单,所以这里可以不用填写,后续创建周期性的工单时,我们再利用变量来配置。

归档范围:选择部分归档或者整库归档,整库归档的话,会把所有数据都归档到归档库中,这里我们选择部分归档,然后填写表名,选择过滤条件。当然也可以选择多张表,每张表指定不同的过滤条件。

清理源端已归档数据:这里是当数据归档完之后,是否需要在在线库中清理,这里我们勾选上。

执行方式:我们这里为了演示,就选择立即执行,当然也可以定时执行。

任务设置:插入策略,表示数据在归档库中主键或者非空唯一键出现冲突时,如何处理,忽略或者更新,这里选择忽略,我们在使用时可根据实际情况选择。

限流策略:可以同时配置行限流和数据大小限流,最终根据最小限额进行限制。

这些配置完成之后大概如下图:

1703141549

归档前,我们先登录数据库,根据过滤条件确认下数据,等归档完成之后,再看下数据是否正常,可以看到,根据我们的归档条件,生日小于1990年10月20日的有13487人

obclient [test]> select count(*) from custom where birthday < "1990-10-20 00:00:00";
+----------+
| count(*) |
+----------+
|    13487 |
+----------+
1 row in set (0.035 sec)

然后点击确认,就会立即执行这个归档和清理工作,在工单中也可以看到这个任务的执行情况。

1703141566

归档完成之后,再登录数据库查看数据归档情况,在线库中被归档的数据都已经被删除。

obclient [test]> select count(*) from custom where birthday < "1990-10-20 00:00:00";
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.035 sec)

obclient [test]> select count(*) from custom;
+----------+
| count(*) |
+----------+
|    86513 |
+----------+
1 row in set (0.028 sec)

登录归档库,查看数据是否归档成功,如下图,可以看到数据已经全部归档成功

obclient [test]> select count(*) from custom;
+----------+
| count(*) |
+----------+
|    13487 |
+----------+
1 row in set (0.005 sec)

对于上述的归档任务,如果想回滚,也可以在工单中,直接点击回滚,将整个任务回滚掉。

周期性归档

配置周期执行的归档任务,方便我们经常要做数据归档,每次归档都要配置比较麻烦,因此可以直接配置周期性执行的归档任务。

在这里我们就可以利用变量名,来实现周期性任务,这里配置多个变量名,例如指定变量名为create_time,选择格式为 yyyy-MM-dd HH:mm:ss, 时间运算栏,则以系统默认变量“archive_date”时间点为基准设置偏移信息,archive_date可以理解为任务触发时的时间,例如下面的配置

1703141581

页面上的配置含义从上往下介绍下:指定 create_time = current_time - 100000h,然后过滤条件则是birthday < create_time,周期执行,每小时执行一次。总体含义就是归档 小于 任务触发事件往前100000小时 的数据。

从数据库中我们查看,小于当前时间往前100000小时的数据量,有 40546 条

obclient [test]> select count(*) from custom where birthday < date_sub(curdate(),interval 100000 hour);
+----------+
| count(*) |
+----------+
|    40546 |
+----------+
1 row in set (0.036 sec)

等归档任务整点触发完成之后,对比下数据是否归档正确。

obclient [test]> select count(*) from custom where birthday < date_sub(curdate(),interval 100000 hour);
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.039 sec)

obclient [test]> select count(*) from custom;
+----------+
| count(*) |
+----------+
|    59454 |
+----------+
1 row in set (0.031 sec)

可以看到在线库中的数据符合条件的数据已经被清理,而归档后的数据在归档库中:

obclient [test]> select count(*) from custom;
+----------+
| count(*) |
+----------+
|    40546 |
+----------+
1 row in set (0.012 sec)

并且这个任务还在周期性被调度,在执行记录中可以看到

1703141621

以上就是归档功能的简单介绍,各位感兴趣的话,也可以在本地测试和使用。除了归档能力,另外还可以创建单独的数据清理任务,只做清理。配置方式也是类似的。

ODC中也有很多其他强大的功能,目前官方宣布也兼容了mysql,可以将mysql接入进来。另外像数据变更,影子表同步等功能都很有用,后续有机会也可以跟大家分享下这些功能。

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

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

相关文章

R折线图(自备)

目录 折线图基础 创建散点和折线图 复杂折现加图例 折线图柱状图 数据处理 进行差异检验 基础绘图折线 基础绘图箱线 进行合并 双轴柱状与折线图 数据 折线图基础 创建散点和折线图 rm(list ls()) opar <-par(no.readonlyTRUE)##自带orange数据集 par(mfrowc…

【C++】基础:STL容器库

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍STL容器库。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#x1f95…

【Java程序设计】【C00370】基于(JavaWeb)Springboot的公司进存销管理系统(有论文)

TOC 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;博客中有上百套程序可供参考&#xff0c;欢迎共同交流学习。 项目简介 项目获取 &#x1f345;文末点击卡片…

linux-开发板移植MQTT

将源码复制到共享文件夹 链接&#xff1a;https://pan.baidu.com/s/1kvvO-HhDMDXkQ_wlNtyW_A?pwd332i 提取码&#xff1a;332i 以下步骤教程里都写了&#xff0c;我这里边进行&#xff0c;方便大家对照 pc端 1.进入mqtt_lib, 解压open压缩包 2.按照教程复制这一句并运行&…

稀碎从零算法笔记Day25-LeetCode:数组中的第K个最大元素

题型&#xff1a;排序、堆 链接&#xff1a;215. 数组中的第K个最大元素 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。&#xff08;降序排列后的第K个元素&#xff0…

蓝桥杯算法 - DP

上一篇&#xff1a;[[蓝桥杯算法-排序、递归、全排列]] 动态规划&#xff08;dp&#xff09; dp即动态规划&#xff0c;常用于&#xff1a;数学&#xff0c;计算机科学&#xff0c;管理学&#xff0c;经济和生物信息学。 dp在生活中也很常见&#xff0c;如&#xff1a;你今天…

vue前端标准

此文档的目的是让前端和产品、服务端开发&#xff0c;相互之间形成一种默契。 比如一些通用设计&#xff0c;不需要产品去说明&#xff0c;我们默认怎么做。 以及&#xff0c;我们开发之间的默契。 期盼大家的补充 开发原则&#xff1a; 感谢各位开发大佬共建原则&#xf…

STM32 ESP8266模块的曲折探索

这是本文的配套资料&#xff0c;最终工程请参考 新_ESP8266资料\stm32f103成功移植的项目 【免费】stm32f103c8t6esp8266资料资源-CSDN文库 一、等到了ready 产品参数 我使用的是ai-thinker的esp8266-01s&#xff0c;以下为产品规格书 引脚定义&#xff1a; 依据引脚定义&…

docker安装redis 6.2.7 并 远程连接

阿里云ecs服务器&#xff0c;docker安装redis 6.2.7 并 远程连接 文章目录 阿里云ecs服务器&#xff0c;docker安装redis 6.2.7 并 远程连接1. 拉取redis镜像2. 查看是否下载成功3. 挂载配置文件4. 下载reids配置文件(redis.conf)5. docker创建redis容器6. 查看redis容器运行状…

JL-34 超声波气象站 可集成多要素 集成度高、颜值高、免安装、免布线

产品概述 超声波气象站是我公司结合多年气象产品开发经验&#xff0c;根据现场实际情况开发的一款多功能自动气象站。该产品集温度、湿度、气压、风速、风向、雨量、大气压力、颗粒物和噪声等要素为一体&#xff0c;该系列产品集成度高、颜值高、免安装、免布线。 功能特点 …

038—pandas 重采样线性插补

前言 在数据处理时&#xff0c;由于采集数据量有限&#xff0c;或者采集数据粒度过小&#xff0c;经常需要对数据重采样。在本例中&#xff0c;我们将实现一个类型超分辨率的操作。 思路&#xff1a; 首先将原始数据长度扩展为 3 倍&#xff0c;可以使用 loc[] 方法对索引扩…

54、Qt/对话框、事件机制相关学习20240325

一、完善对话框&#xff0c;点击登录按钮&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#…

android h5理财(记账)管理系统eclipse开发mysql数据库编程服务端java计算机程序设计

一、源码特点 android h5理财管理系统是一套完善的WEBandroid设计系统&#xff0c;对理解JSP java&#xff0c;安卓app编程开发语言有帮助&#xff08;系统采用web服务端APP端 综合模式进行设计开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要…

TCP与UDP:传输层协议对比

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

VMware中添加使用ubuntu

提示&#xff1a;本文为学习记录&#xff0c;若有错误&#xff0c;请联系作者&#xff0c;谦虚受教。 文章目录 前言一、ubuntu安装二、下载vmwareTool三、解压文件四、解决联网失败五、linux常用命令总结 前言 打破舒适圈 一、ubuntu安装 Vmware安装流程 二、下载vmwareToo…

编程语言|C语言——C语言实现玫瑰花(情人节)

1.说明 在古希腊神话中&#xff0c;玫瑰花集爱与美于一身&#xff0c;既是美神的化身&#xff0c;又溶进了爱神的血液&#xff0c;所以它所代表的含义是爱情。 我们应该用玫瑰花来表达我们的爱意&#xff0c;但是好多的恋人都是因为异地而没有办法去买一束新鲜的玫瑰去送给自己…

Fast-Planner(三)详解后端B-Spline曲线优化

本文上接Fast-Planner的B-spline曲线生成详解&#xff0c;介绍B-spline曲线优化。如有问题&#xff0c;欢迎各位大佬评论指出&#xff0c;带着我一起进步。 三、B样条优化 初始化获得的B样条曲线只是达到了可达性检测&#xff0c;本章介绍为得到更加光滑安全的轨迹&#xff0…

训练自己的分类数据集

文章目录 1.数据集准备2. 数据集划分3.设计模型进行训练1. 随便乱写的网络2. 借鉴优秀的网络模型&#xff08;MobileNetV3&#xff09; 分析&#xff1a;练习&#xff1a; 1.数据集准备 准备你要进行分类的数据集&#xff0c;可以自己拍摄&#xff0c;可以网上进行爬取。 将不…

pdf压缩文件怎么压缩最小?一键压缩PDF

pdf文件压缩是为了减小文件大小&#xff0c;以便更轻松地共享、传输和存储文件&#xff0c;通过压缩pdf文件&#xff0c;可以减少文件占用的存储空间&#xff0c;加快文件的上传和下载速度&#xff0c;并节省带宽和存储成本;在本教程中&#xff0c;我们将介绍一些有效的方法来最…

人工智能三剑客NumPy、pandas、matplotlib和Jupyter四者之间的关系

NumPy 主要用途&#xff1a;NumPy&#xff08;Numerical Python的缩写&#xff09;主要用于处理大型多维数组和矩阵的科学计算。它提供了一个高性能的多维数组对象&#xff0c;以及用于数组操作的工具。与其他三者的联系&#xff1a;NumPy是pandas和matplotlib的基础库之一。许…