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

MySQL 8.0 MGR 迁移至 OceanBase 4.0 ,我遇到了5个问题

193

01.


OMS 服务平台架构图


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



02.


实验环境准备


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

图片


目标端数据库:OceanBase 社区版 4.0 ,OBserver 3 节点 + 2 OBProxy
图片


03.


实验账号准备

源端 MySQL


1. 创建测试迁移的数据库
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)

2. 创建测试表并插入数据
root@localhost:mysql_uatDB.sock [performance_schema]> use db_oms_testDatabase changedroot@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)

3. 创建源端的迁移的账号
这里注意,如果我们需要勾选增量同步的话,需要赋权额外的选项: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


1. 创建 MySQL 租户以及迁移账户以及迁移的目标数据库

2. 创建 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)

3. 创建资源池

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


4. 创建 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 = '%';

5. 我们以 root账户登录租户 tenant_mysql_test
创建迁移账户 app_oms_account, 迁移数据库 db_oms_test.
[oceanbase@whdrcsrv403 ~]$ obclient -h10.25.15.83 -P2881 -uroot@tenant_mysql_test -Doceanbase -AWelcome to the OceanBase.  Commands end with ; or \g.Your OceanBase connection id is 3221601564Server 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 的迁移账户的过程。


04.


创建数据源

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

Source 数据源:MySQL 8.0


1. 在 OMS 的平台上点击数据源管理→新建数据源
图片
2. 我们创建一个名字叫 SOURCE_MYSQL8.0 的数据源
图片

3. 测试一下数据源的联通性
测试连接成功后,点击确定按钮,保存数据源。
图片


Target 数据源:OceanBase 4.0 社区版


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

配置关联之前安装的 OCP:
图片

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

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


04.


创建迁移任务


创建任务


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

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


同步方式


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

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

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

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


迁移对象


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

图片


迁移配置


我们选择正常模式, 如果你选择快速模式,那么请确保机器资源可用性,以及评估生产库对源端性能的影响。

增量保留时间, OMS 有一个 store 组件会实时抓取源端 MySQL 的 binlog, 并保留一段时间。

高级设置保持默认就行。
图片

全局检查


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


启动任务


最后点击启动项目:
图片

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

我们可以点击修改按钮,在本文框中去掉 default collate=utf8mb4_0900_as_cs.
图片

我们点击恢复按钮,可以通过 OMS 的平台观察迁移的整个过程。
图片

在目标端用 obclient 查看全量同步的数据。
图片

在源端 MySQL 上, 插入数据 , 测试一下增量同步。
图片

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

我们登陆目标 OceanBase 4.0 来验证一下结果:数据已经同步到了 OceanBase 端。
图片

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


05.


总结


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


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

图片

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

值得注意,这个集群名称和我们通过 OBD 安装的时的集群名称是不一样的:obd cluster list; 这个命令的值是 obtest
论坛提问链接:
https://ask.oceanbase.com/t/topic/35602811 
感谢论坛上蚂蚁的各位技术大佬 @洪波!

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

图片

解决方法
找到了根本的原因是磁盘空间剩余不够造成的,找个 Linux 的同事加了磁盘空间,完美解决!
机器资源阀值的监控可以根据OMS上:运维监控→机器→组件
图片

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

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

图片

解决方法:
设置参数 ob_query_timeout
set global ob_query_Timeout=36000000000


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

图片

解决方法重启 store 组件
图片


问题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 40000052dcc0486b89

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

如果还是觉得 OMS 相应时间慢,可以重启容器。
[root@whdrcsrv403 ~]# docker restart 52dcc0486b8952dcc0486b89
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论