从TiDB迁移到OceanBase的实践分享

news2025/1/20 19:09:13

本文来自OceanBase热心用户的分享

近期,我们计划将业务数据库从TiDB迁移到OceanBase,但面临的一个主要挑战是如何更平滑的完成这一迁移过程。经过研究,了解到OceanBase提供的OMS数据迁移工具能够支持从TiDB到OceanBase的迁移,并且它还具有数据增量同步的功能,不过需要依赖Kafka的支持。为了确保迁移的顺利进行,我们提前进行了全面的测试,以验证整个数据同步的可行性。以下是我们的测试记录,供大家参考和讨论。

环境介绍

以下各种组件安装过程不详细说明,具体安装过程在各产品官方网站都有详细说明,后面只介绍具体的配置过程

TiDB环境

TiDB版本:v5.4.3

TiDB的部署是在一台单机上混部了TiDB Server、TiKV以及PD,TiCDC单节点部署在另外一台机器上

角色机器端口
TiDB Server172.24.255.704000
TiKV172.24.255.7020160
TiKV172.24.255.7020161
TiKV172.24.255.7020162
PD172.24.255.702379
TiCDC172.24.255.558300

1702608903

[root@OB3 bin]# ./cdc cli capture list --pd=http://172.24.255.70:2379
[
  {
    "id": "c0769fd8-78fa-4841-8103-586099d8fcf6",
    "is-owner": true,
    "address": "172.24.255.55:8300"
  }
]
OceanBase环境

OceanBase版本:V4.2.0_CE

角色机器端口
OBServer172.24.255.562881
OBServer172.24.255.572881
OBServer172.24.255.582881
OBProxy172.24.255.562883
OBProxy172.24.255.572883

1702608921

Kafka环境

Kafka版本:3.1.0(TiCDC目前支持的最高版本是3.1.0版本)

Zookeeper版本:3.6.3

这里做测试,所以Kafka和zookeeper都是单机部署,没有采用集群部署,zookeeper用的是3.1.0版本自带的zookeeper,实际效果是一样的。

角色机器端口
Kafka:broker172.24.255.559092
zookeeper172.24.255.552181
[root@OB3 kafka]# ./bin/kafka-broker-api-versions.sh --bootstrap-server 172.24.255.55:9092 --version
3.1.0 (Commit:37edeed0777bacb3)
[root@OB3 bin]# ./zookeeper-shell.sh 172.24.255.55:2181 version
Connecting to 172.24.255.55:2181
ZooKeeper CLI version: 3.6.3--6401e4ad2087061bc6b9f80dec2d69f2e3c8660a, built on 04/08/2021 16:35 GMT

OMS环境

OMS版本:V4.1.1_CE

OMS采用的单节点部署

角色机器
OMS172.24.255.70

配置过程

创建TiCDC同步任务

TiCDC支持向mysql兼容、tidb以及Kafka中同步数据,这里因为需要OMS同步TiDB的增量数据,而增量数据是从Kafka中获取,因此需要创建TiCDC到Kafka的同步任务,创建示例如下:

./cdc cli changefeed create --pd=http://172.24.255.70:2379 \
--sink-uri="kafka://172.24.255.55:9092/test-topic?protocol=open-protocol&kafka-version=3.1.0&partition-num=1&max-message-bytes=67108864&replication-factor=1" \
--changefeed-id="simple-replication-task" --sort-engine="unified"

这条命令会在TiCDC中创建一个名字为simple-replication-task的同步任务,并且会在Kafka中创建一个名字为test-topic的topic。创建完成之后,会收到如下信息

Create changefeed successfully!
ID: simple-replication-task
Info: {"sink-uri":"kafka://172.24.255.55:9092/test-topic?protocol=open-protocol\u0026kafka-version=3.1.0\u0026partition-num=1\u0026max-message-bytes=67108864\u0026replication-factor=1","opts":{"max-message-bytes":"1048588"},"create-time":"2023-10-09T15:41:57.1669333+08:00","start-ts":444815721665658881,"target-ts":0,"admin-job-type":0,"sort-engine":"unified","sort-dir":"","config":{"case-sensitive":true,"enable-old-value":true,"force-replicate":false,"check-gc-safe-point":true,"filter":{"rules":["*.*"],"ignore-txn-start-ts":null},"mounter":{"worker-num":16},"sink":{"dispatchers":null,"protocol":"open-protocol","column-selectors":null},"cyclic-replication":{"enable":false,"replica-id":0,"filter-replica-ids":null,"id-buckets":0,"sync-ddl":false},"scheduler":{"type":"table-number","polling-time":-1},"consistent":{"level":"none","max-log-size":64,"flush-interval":1000,"storage":""}},"state":"normal","error":null,"sync-point-enabled":false,"sync-point-interval":600000000000,"creator-version":"v5.4.3"}

在Kafka中查看topic

[root@OB3 kafka]# bin/kafka-topics.sh --bootstrap-server 172.24.255.55:9092 --list
__consumer_offsets
test-topic

这里有的参数简单说明下:

  • --pd:指定TiCDC任务同步源端TiDC集群的pd信息
  • --changefeed-id:指定同步任务的ID,如果不指定会自动生成
  • --sink-uri:同步任务下游地址,需按照下面格式配置,目前 scheme 支持 mysql/tidb/kafka/pulsar:
    • [scheme]://[userinfo@][host]:[port][/path]?[query_parameters]
  • --sort-engine:指定 changefeed 使用的排序引擎。因 TiDB 和 TiKV 使用分布式架构,TiCDC 需要对数据变更记录进行排序后才能输出。该项支持 unified(默认)/memory/file:
    • unified:优先使用内存排序,内存不足时则自动使用硬盘暂存数据。该选项默认开启。
    • memory:在内存中进行排序。 不建议使用,同步大量数据时易引发 OOM。
    • file:完全使用磁盘暂存数据。已经弃用,不建议在任何情况使用。
  • 其他包括:--start-ts、--target-ts、--config配置,具体可参考官网,这里不过多介绍,本次同步任务也未用到。

实际同步到下游配置,是通过sink-uri决定,这里再简单说明下sink-uri中参数含义,在这次创建的任务中--sink-uri参数内容如下:

--sink-uri="kafka://172.24.255.55:9092/test-topic?protocol=open-protocol&kafka-version=3.1.0&partition-num=1&max-message-bytes=67108864&replication-factor=1"

参数解析
172.24.255.55下游 Kafka 对外提供服务的 IP
9092下游 Kafka 的连接端口
topic-name变量,使用的 Kafka topic 名字,这里使用test-topic
kafka-version下游 Kafka 版本号(可选,默认值 2.4.0,目前支持的最低版本为 0.11.0.2,最高版本为 3.1.0)
partition-num下游 Kafka partition 数量
max-message-bytes每次向 Kafka broker 发送消息的最大数据量(可选,默认值 10MB)
replication-factorKafka 消息保存副本数(可选,默认值 1)
protocol输出到 Kafka 的消息协议,可选值有 canal-json、open-protocol、canal、avro、maxwell
  • 除了上面这些配置,另外还有加密等配置,这里没有使用加密方式。

另外,OMS 社区版仅支持 TiCDC Open Protocol,不支持其它协议,因此在sink-uri中指定protocol时,必须制定protocol=open-protocol

在以上创建完成之后,在TiDB中创建表并插入数据

MySQL [test]> create table test_table(id int primary key, name varchar(20));
Query OK, 0 rows affected (0.08 sec)

MySQL [test]> show tables;
+----------------+
| Tables_in_test |
+----------------+
| test_table     |
+----------------+
1 row in set (0.00 sec)

MySQL [test]> insert into test_table values(1,'OceanBase');
Query OK, 1 row affected (0.00 sec)

可以在Kafka中看到增量信息

[root@OB3 kafka]# ./bin/kafka-console-consumer.sh --bootstrap-server 172.24.255.55:9092 --topic test-topic
Q{"q":"CREATE TABLE `test_table` (`id` INT PRIMARY KEY,`name` VARCHAR(20))","t":3}
Q{"u":{"id":{"t":3,"h":true,"f":11,"v":1},"name":{"t":15,"f":64,"v":"OceanBase"}}}

OMS创建数据源

OMS上创建数据源时,需要创建两个数据源,一个是Kafka的,一个是TiDB的,在配置TiDB数据源时,需要关联Kafka数据源,因此这里先创建Kafka数据源。

Kafka数据源

进入到OMS数据源管理页面,新建数据源,选择Kakfa数据源,因为这里未使用SSL和认证,所以取消勾选,填写完成之后测试连接,连接成功之后确定即可添加成功。

1702608947

TiDB数据源

同样进入到新建数据源页面,选择TiDB数据源,填写对应的信息,同时绑定Kafka,然后关联上一步创建的Kafka即可,选择创建好的test-topic,然后进行连接测试,测试成功之后确定即可添加TiDB数据源

1702608982

OceanBase数据源

方式基本相同

1702609002

OMS创建迁移任务

在OMS数据迁移页面,点击创建迁移项目,输入项目名称,源和目标之后,点击下一步

1702609029

根据需求选择同步任务配置,这里勾选结构迁移、全量迁移、增量同步(Insert、Update、Delete)以及全量校验,注意这里不支持DDL同步,然后点击下一步

1702609058

选择要同步的对象,这里可以直接指定对象,也可以选择匹配规则。我直接用了匹配规则,test库下所有对象都同步,然后点击校验,预览对象,因为目前TiDB的test库下只有test_table这张表,因此可以看到最终对象这里只显示了test_table,然后继续点击下一步

1702609083

配置迁移选项,这里选择同步和校验的速率,速率越高,对资源的消耗越大。另外有高级配置中,目标端表对象存在记录时处理策略,以及是否允许索引后置,索引后置指OMS在完成对应表全量数据迁移、同步后创建非唯一键的索引,配置完成之后,进行预检查

1702609112

预检查如果失败,需要检查失败原因,另外对于一些告警,也建议进行修复下,然后再开始同步任务。确认无误之后启动项目即可。

1702609134

任务启动之后,会先进行全量迁移,即将原表中已有数据先迁移过来,完成之后会继续执行增量同步任务。

1702609162

同步测试

在TiDB端执行insert、update、delete操作,可以看到在OceanBase端同步成功。

1702609185

另外在OMS上可以看到变更的统计信息

1702609206

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

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

相关文章

使用snap安装docker配置阿里云镜像加速

使用snap安装docker非常的简单,一条命令即可 snap install docker 但是通过这个命令安装的docker, 配置阿里云镜像跟常规安装的配置起来不太一样, 下面讲一下配置流程 修改docker配置文件/var/snap/docker/current/config/daemon.json 这个文件应该是已经创建好…

13-按键的元件模型创建

1.画线的时候,栅格切为10mil 2.放置管脚的时候,栅格切为100mil

贝叶斯网络介绍与求解方法

贝叶斯网络综述 1. 引言2. 贝叶斯网络原理介绍3. 求解贝叶斯网络的各种方法3.1 精确推理算法3.2 近似推理算法3.3 学习贝叶斯网络的结构和参数3.3.1 MMPC(Max-Min Parents and Children)3.3.2 MMHC(Max-Min Hill-Climbing)3.3.3 I…

论文阅读报告: 在时间双向图上查询基于时间的的密集子图 | ICDE 2024

摘要 本文提出了一个新的模型(α, β, T)-core,用于在时间双向图上寻找凝聚子图。时间双向图中,不同实体之间的关系随着时间的推移而变化。为了提高查询效率,本文提出了顶点分区和时间分区的历史索引(VH-I…

windows docker容器部署前端项目

一、介绍 Docker 是一个开源的平台,旨在简化应用程序的开发、部署和运行。它通过使用容器(containers)来实现这一点。容器是一种轻量级、可移植的虚拟化方式,可以在不同的环境中一致地运行软件。 Docker 的主要作用和优点包括&a…

C语言 ——— 学习、使用memcpy函数 并模拟实现

目录 memcpy函数的功能 学习memcpy函数​编辑 使用memcpy函数 模拟实现memcpy函数 memcpy函数的功能 memcpy函数是内存拷贝函数,用于把任意类型的数据的内存拷贝到另一个同类型的数据上 学习memcpy函数 函数的参数: void* destination&#xff1…

C++基础编程的学习2

has-a(组合关系) 在C中,has-a关系是一种对象之间的组合关系,表示一个类的对象包含另一个类的对象作为其成员。 前向引用说明 在全局命名作用域中声明函数,可以避免递归调用时的函数重名问题。前向声明允许我们声明一…

使用Pinata在IPFS上存储NFT图片的实践

文章目录 前言一、什么是IPFS?二、为什么NFT需要IPFS?三、 Pinata:IPFS上的存储解决方案四、 实践:使用Pinata存储NFT图片1. 注册2. 获取API密钥与网关3. 上传图片到IPFS 总结 前言 随着区块链技术的快速发展,NFT&…

【iOS】OC关键字总结及底层原理(下)

目录 weak实现原理objc_initWeak()objc_storeWeak()weak_register_no_lock()weak_entry_for_referent()dealloc关于弱引用的处理weak相关问题 __autoreleasing关键字自动释放池__autoreleasing修饰变量 weak实现原理 weak弱引用指针会存储在SideTable里的weak弱引用表里面&…

实验室冷冻干燥机的安装与调试步骤

实验室冷冻干燥机是一种重要的科研设备,广泛应用于生物、化学、食品科学等领域。正确安装与调试冷冻干燥机,不仅能确保设备的正常运行,还能延长其使用寿命。本文将详细介绍实验室冷冻干燥机的安装与调试步骤,帮助用户顺利完成设备…

Java中等题-最大子数组和(力扣)

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,4] 输出:…

SSM城市垃圾分类管理系统-计算机毕业设计源码44582

摘 要 在当前全球环境问题日益突出的背景下,城市垃圾分类成为推动可持续发展和环境保护的重要举措之一。然而,传统的垃圾处理方式存在效率低下、资源浪费和环境污染等问题。因此,开发一个基于Java编程语言、MySQL数据库和HTML前端技术的高效…

vue()

目录 首先我们回顾一下之前学的东西 入门: v-bind 绑定属性用法 ​编辑 v-if 用法 v-for v-on v-model:双向绑定 组件: 全局组件: 局部组件: vue生命周期:(这里让我研究研究&…

C++ 函数模板和类模板

参考视频:C类模板_哔哩哔哩_bilibili 遗留问题:编译器怎么处理函数模板和类模板 目录 一、为什么会有函数模版?函数模板是为了解决什么问题? 二、函数模板的概念 三、函数模版的使用 四、函数模板的特化 五、类模板的概念 …

24/8/7 算法笔记 支持向量机回归问题天猫双十一

import numpy as np from sklearn.svm import SVR import matplotlib.pyplot as plt X np.linspace(0,2*np.pi,50).reshape(-1,1) y np.sin(X) plt.scatter(X,y) 建模 线性核函数 svr SVR(kernel linear) svr.fit(X,y.ravel())#变成一维y_ svr.predict(X) plt.scatter(…

heapq.heapify构建小顶堆的流程

代码示例 import heapqlst [2, 3, 4, 6, 9, 1, 5] heapq.heapify(lst) print(lst)流程解释 初始列表: 列表 lst 在开始时是 [2, 3, 4, 6, 9, 1, 5]。 调用 heapq.heapify(lst): heapify 函数将 lst 转换为一个小顶堆(min-heap)。在小顶堆中&#xff0…

Spring框架漏洞(附修复方法)

Spring是Java EE编程领域的一个轻量级开源框架,该框架由一个叫Rod Johnson的程序员在2002年最早提出并随后创建,是为了解决企业级编程开发中的复杂性,业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应…

《UniverSeg: Universal Medical Image Segmentation》ICCV2023

摘要 这篇论文提出了一种名为 UniverSeg 的方法,它能够解决未见过的医学图像分割任务,而无需额外的训练。现有的深度学习模型通常无法泛化到新的解剖结构、图像模式或标签上。UniverSeg 利用一种新的 CrossBlock 机制,通过查询图像和定义新分…

利用tkinter制作简易计算器,页面美观,计算保留4位小数

import tkinter as tk import time window tk.Tk() window.title("简易计算器") window.geometry(300x400) content def btn_onclick(data):global contentif data"AC" or data "MC":expression.set()result.set()content elif data :result…

无人机长生不老秘籍

机身保养 外观检查 1.检查机器表面整洁无划痕无针孔凹陷擦伤、畸变等损坏情况 2.晃动机身,仔细听机身内部有无松动零件或者螺丝在机身内部 桨叶检查 1.有无裂痕、磨损、变形等缺陷,如有明显缺陷建议更换 2.卡扣、紧固件有无松脱或失效,…