暂无图片
暂无图片
10
暂无图片
暂无图片
暂无图片

「OceanBase 征文」OMS 4.0 实现 mysql 8.0 MGR 到 oceanbase 4.0 的迁移

原创 大表哥 2023-03-23
876

大家好,最近公司在做数据库国产化的信创项目的调研。 Oceanbase 最为国内为数不多的具有12年历史的自研分布式数据库, 自然也是我们重点研究的数据库对象。

作为业内OLTP的高并发数据库的领先者, 支持着每年双十一的核心业务模块。 作为国内OLTP的 DBA来说,特别是分布式数据库爱好者 , 也是必须要学习的一门功课。

在本次实验之前, 我先后完成了如下的环境搭建:

1.OMA 数据库迁移对象的兼容性分析(支持mysql,oracle,db2,tidb 等等的兼容性评估)
2.OBD 部署 oceanbase 社区版 4.0 (集成化一键部署命令方式)
3.OCP 管控平台的安装 (支持 docker 安装,可视化的监控运维管理平台)
4.ODC 开发者桌面管理工具的安装 (公司开发小伙伴需要的连接工具,特别是ORACLE 租户,MYSQL租户的话,开源的工具基本上都支持)
5.OMS 迁移平台的安装(支持docker 安装,提供类似于阿里云上DTS 的数据迁移服务)

相信大多数的小伙伴的学习过程应该也是类似的, step by step 从基础环境的搭建学习起来。

我们进入今天的正题: OMS 4.0 实现 mysql 8.0 MGR 到 oceanbase 4.0 的迁移

OMS 服务平台架构图:

简单的来说, 类似于阿里云的DTS, 需要配置 source 和 target 2个数据源,然后创建数据同步的任务,选择同步的对象,完成数据的迁移并且支持增量同步和数据校验等功能。

Image.png

实验环境准备

源端数据库: MYSQL 8.0 MGR 架构 版本 Percona 8.0.20-11

image.png

目标端数据库Oceanbase社区版 4.0 : OBserver 3 节点 + 2 OBProxy

image.png

实验账号准备:

源端 mysql :

创建测试迁移的数据库:

root@localhost:mysql_uatDB.sock [performance_schema]> create database db_oms_test ; -------------- create database db_oms_test -------------- Query OK, 1 row affected (0.01 sec)

创建测试表并插入数据:

root@localhost:mysql_uatDB.sock [performance_schema]> use db_oms_test Database changed root@localhost:mysql_uatDB.sock [db_oms_test]> create table t_oms_tab(id int primary key, name varchar(200)); -------------- create table t_oms_tab(id int primary key, name varchar(200)) -------------- Query OK, 0 rows affected (0.01 sec) root@localhost:mysql_uatDB.sock [db_oms_test]> insert into t_oms_tab values (1,'mysql 8.0 to OB4.0 via OMS'); -------------- insert into t_oms_tab values (1,'mysql 8.0 to OB4.0 via OMS') -------------- Query OK, 1 row affected (0.00 sec) root@localhost:mysql_uatDB.sock [db_oms_test]> commit; -------------- commit -------------- Query OK, 0 rows affected (0.00 sec)

创建源端的迁移的账号:

这里注意: 如果我们需要勾选增量同步的话 需要赋权额外的选项: GRANT REPLICATION CLIENT, REPLICATION SLAVE ON .
OMS需要写入心跳的信息到源端数据库 drc 里面。 我们需要手动创建 database drc.

root@localhost:mysql_uatDB.sock [performance_schema]> create user app_oms_test@'%' identified with mysql_native_password by '1234_abcD'; -------------- create user app_oms_test@'%' identified with mysql_native_password by '1234_abcD' -------------- Query OK, 0 rows affected (0.01 sec) root@localhost:mysql_uatDB.sock [performance_schema]> grant all on db_oms_test.* to app_oms_test@'%'; -------------- grant all on db_oms_test.* to app_oms_test@'%' -------------- Query OK, 0 rows affected (0.01 sec) root@localhost:mysql_uatDB.sock [db_oms_test]> GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO app_oms_test@'%' WITH GRANT OPTION; -------------- GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO app_oms_test@'%' WITH GRANT OPTION -------------- Query OK, 0 rows affected (0.01 sec) root@localhost:mysql_uatDB.sock [db_oms_test]> create database drc; -------------- create database drc -------------- Query OK, 1 row affected (0.01 sec) root@localhost:mysql_uatDB.sock [db_oms_test]> grant all on drc.* to app_oms_test@'%'; -------------- grant all on drc.* to app_oms_test@'%' -------------- Query OK, 0 rows affected (0.01 sec)

目标端 oceanbase 4.0:

创建mysql 租户以及迁移账户以及迁移的目标数据库:

创建resource unit:

obclient [oceanbase]> CREATE resource unit mysqlunit max_cpu=2, min_cpu=1, MEMORY_SIZE='1G', min_iops=1024, LOG_DISK_SIZE='2G'; Query OK, 0 rows affected (0.006 sec)

创建资源池

CREATE resource pool app_pool unit = 'mysqlunit', unit_num = 1, ZONE_LIST = ('zone1','zone2','zone3');

创建mysql 租户: 这里必须设置IP的访问权限 ob_tcp_invited_nodes = ‘%’ , 否则会连不上数据库。

CREATE TENANT IF NOT EXISTS tenant_mysql_test charset='utf8mb4', comment 'mysql tenant/instance', primary_zone='RANDOM', resource_pool_list = ('app_pool') set ob_tcp_invited_nodes = '%';

我们以 root账户登录租户 tenant_mysql_test: 创建迁移账户 app_oms_account, 迁移数据库 db_oms_test

[oceanbase@whdrcsrv403 ~]$ obclient -h10.25.15.83 -P2881 -uroot@tenant_mysql_test -Doceanbase -A Welcome to the OceanBase. Commands end with ; or \g. Your OceanBase connection id is 3221601564 Server version: OceanBase_CE 4.0.0.0 (r100000272022110114-6af7f9ae79cd0ecbafd4b1b88e2886ccdba0c3be) (Built Nov 1 2022 14:57:18) Copyright (c) 2000, 2018, OB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. obclient [oceanbase]> create user app_oms_account identified by "12345678"; Query OK, 0 rows affected (0.137 sec) obclient [oceanbase]> create database db_oms_test ; Query OK, 1 row affected (0.149 sec) obclient [oceanbase]> grant all on *.* to app_oms_account; Query OK, 0 rows affected (0.062 sec)

以上就是我们准备 源端mysql和目标端 oceanbase 的迁移账户的过程。

创建数据源

下一步,我们登陆OMS 迁移平台用刚才创建的迁移账号来新建数据源。

Source 数据源:mysql 8.0

在OMS的平台上点击 数据源管理 -》 新建数据源

Image.png
我们创建一个名字叫 SOURCE_MYSQL8.0 的数据源

Image.png
测试一下数据源的联通性:测试连接成功后 点击确定按钮 保存数据源
Image.png

Target 数据源:oceanbase 4.0 社区版

接下来,我们用同样的方式创建目标端 oceanbase 4.0CE的数据源: TARGET_OB4.0

配置关联之前安装的OCP:

Image.png

我们再次回到OMS的平台上,查看我们之前配置好的数据源。

Image.png

以上我们完成了数据源的配置。

创建迁移任务

创建任务

配置好数据源之后,我们来创建一个数据迁移的任务:

源端选择: SOURCE_MYSQL8.0
目标端选择: TARGET_OB4.0
场景类型: 仅支持还有唯一键的表(由于我们的源端mysql 是MGR的架构,默认的表必须是innoDB 存储引擎+必须带有主键,所以可以放心大胆的勾选)

Image.png

同步方式

同步方式我们选择: 结构迁移 + 全量迁移 + 增量迁移

增量同步这个场景是符合我们实际生产实时同步,接近 0 down 机切换的业务场景。

关于结构同步,这个需要根据业务做判断,如果你之前表是大数据量的,可以预先创建根据业务需要分区表,这样可以利用oceanbase 的 partition level 的分片功能,提高性能。

当然了,基于分区键的这种sharding , 需要代码进行业务的评估和代码改造。

Image.png

迁移对象

选择迁移对象: 这里可以采用正则匹配的方式: db_oms_test.*
然后点击校验,可以进行对象的合法性验证。

Image.png

迁移配置

我们选择正常模式, 如果你选择快速模式,那么请确保机器资源可用性,以及评估生产库对源端性能的影响。
增量保留时间, OMS 有一个store 组件会实时抓取源端mysql的 binlog, 并保留一段时间。
高级设置保持默认就行。

Image.png

全局检查

最后进行一下全局的检查, 有的警告,有的为失败, 失败的选项最好按照体制进行修复(当然了测试环境的话,你也可以手动点击跳过失败选项)

Image.png

启动任务

最后点击启动项目:

Image.png

迁移job 启动后,自动创建表的时候, 我们发现 mysql 8.0 的排序字符集 utf8mb4_0900_as_cs 在ob4.0 里面是不支持的,需要手动改一下

Image.png

我们可以点击修改按钮:在本文框中去掉 default collate=utf8mb4_0900_as_cs;

Image.png
我们点击恢复按钮: 可以通过OMS的平台观察迁移的整个过程:

Image.png

在目标端用obclient 查看全量同步的数据:

Image.png

在源端mysql 上, 插入数据 , 测试一下增量同步:

Image.png

观察OMS: 增量同步的DML 会显示统计信息 insert:1

Image.png

我们登陆目标 ob4.0 来验证一下结果: 数据已经同步到了OB端

Image.png

Okay, 以上我们通过OMS来实现了 mysql 8.0 到 oceanbase 4.0 的全量和增量同步的测试,图形化的界面还是比较简单易用的。

总结:

本次实验陆陆续续进行了好几天, 最后总结一下,实验遇到主要的几个问题:

问题1: OMS上创建OB的数据源报错 : 集群名称不存在

Image.png

解决方法:

通过OB论坛提问: 根据技术大佬 @洪波 提供的方式 得到了正确的OB集群的名称: show parameters like “%cluster%”

Image.png

值得注意: 这个集群名称和我们通过OBD安装的时的集群名称是不一样的: obd cluster list; 这个命令的值是 obtest

论坛提问链接: https://ask.oceanbase.com/t/topic/35602811 感谢论坛上蚂蚁的各位技术大佬 @洪波!

问题2: 启动同步任务报错: OMS 集群内机器部分资源指标超出系统阈值

Image.png

解决方式:

找到了根本的原因是磁盘空间剩余不够造成的,找个linux 的同事加了磁盘空间,完美解决!

机器资源阀值的监控可以根据OMS上: 运维监控-》机器-》组件

Image.png

论坛提问链接: https://ask.oceanbase.com/t/topic/35602818 这个报错信息不够明确,希望蚂蚁公司未来版本中可以改善一下。

问题3:运行同步任务的时候 报错: 查询超时

Image.png

解决方法:设置参数 ob_query_timeout

set global ob_query_Timeout=36000000000

问题4: 之前的步骤执行失败, store变成停止的状态

Image.png

解决方式: 重启 store 组件

Image.png

问题5: OMS网站平台 响应很慢

解决方案:给容器扩容 https://www.oceanbase.com/docs/community-oms-cn-10000000001223126
(此方案同样适用于容器中的OCP管理平台)

OMS对机器资源的需求还是很高的 , 测试容器设置为4C + 16GB 感觉跑起来 也是马马虎虎, 建议选一台高配置的机器

# 动态更新 OMS 社区版容器可用 CPU 到 4C [root@whdrcsrv403 ~]# docker update 52dcc0486b89 --cpu-quota 400000 52dcc0486b89 # 动态更新 OMS 社区版容器可用内存到 16G [root@whdrcsrv403 ~]# docker update 52dcc0486b89 --memory 16G --memory-swap 16G 52dcc0486b89

如果还是觉得OMS相应时间慢,可以重启容器

[root@whdrcsrv403 ~]# docker restart 52dcc0486b89 52dcc0486b89

最后总体来说, OceanBase论坛上的技术大佬们回答问题上响应时间上还是很迅速的! 基本上问题都可以当天提出,当天解决!

Have a fun with small fish 🙂 !

最后修改时间:2023-03-23 16:43:57
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论