大家好,最近公司在做数据库国产化的信创项目的调研。 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个数据源,然后创建数据同步的任务,选择同步的对象,完成数据的迁移并且支持增量同步和数据校验等功能。
实验环境准备
源端数据库: MYSQL 8.0 MGR 架构 版本 Percona 8.0.20-11
目标端数据库Oceanbase社区版 4.0 : OBserver 3 节点 + 2 OBProxy
实验账号准备:
源端 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的平台上点击 数据源管理 -》 新建数据源
我们创建一个名字叫 SOURCE_MYSQL8.0 的数据源
测试一下数据源的联通性:测试连接成功后 点击确定按钮 保存数据源
Target 数据源:oceanbase 4.0 社区版
接下来,我们用同样的方式创建目标端 oceanbase 4.0CE的数据源: TARGET_OB4.0
配置关联之前安装的OCP:
我们再次回到OMS的平台上,查看我们之前配置好的数据源。
以上我们完成了数据源的配置。
创建迁移任务
创建任务
配置好数据源之后,我们来创建一个数据迁移的任务:
源端选择: 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
我们登陆目标 ob4.0 来验证一下结果: 数据已经同步到了OB端
Okay, 以上我们通过OMS来实现了 mysql 8.0 到 oceanbase 4.0 的全量和增量同步的测试,图形化的界面还是比较简单易用的。
总结:
本次实验陆陆续续进行了好几天, 最后总结一下,实验遇到主要的几个问题:
问题1: OMS上创建OB的数据源报错 : 集群名称不存在
解决方法:
通过OB论坛提问: 根据技术大佬 @洪波 提供的方式 得到了正确的OB集群的名称: 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 🙂 !