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

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

680

第七期征文正在进行中,欢迎滑至文章底部查看详情

 陈旭(大表哥)

 作者介绍

捷信(中国)消费金融有限公司 DBA,拥有15年工作经验熟悉MySQLPostgreSQLMongoDBOracle 数据库,擅长 SQL 以及数据库优化等。
本文来自于 OceanBase 与 墨天轮技术社区共同举办的第六期技术征文:小鱼快跑|一起玩转4.0
首发于墨天轮技术社区👉https://www.modb.pro/db/620058



大家好,最近公司在做数据库自主研发的信息技术应用创新产业项目的调研。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 的迁移


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_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)

      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 -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 的迁移账户的过程。


                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 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 🙂 !

                    今天分享到这里就结束了,关于本期内容,如果大家有什么想交流的,欢迎评论区留言探讨~





                    OceanBase 联合墨天轮技术社区,共同启动 第七期技术征文活动「小鱼快跑|OceanBase 4.1 上手体验」,欢迎广大数据库开发者畅谈 OceanBase 4.1。


                    无论你是数据工程师、DBA、应用开发者、架构师,还是其他数据库厂商的用户,又或是对数据库充满兴趣的爱好者,我们都期待你的参与,期待“小鱼”能成为你的朋友。

                    除了稿酬、证书,我们还特别为本次征文活动准备了树莓派、运动手环、徽章等限定周边,快来参与吧~


                    参加第七期技术征文

                    请点击下方【阅读原文】 


                    文章转载自OceanBase数据库星球,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论