概念介绍
OceanBase 迁移服务(OceanBase Migration Service,OMS)是 OceanBase 提供的一种支持同构或异构 RDBMS 与 OceanBase 数据库之间进行数据交互的服务,它提供了数据的在线迁移和实时增量同步的数据复制能力。
OMS 提供可视化的集中管控平台,通过简单的配置用户即可完成数据的实时迁移,且对源数据库和业务系统的影响开销可忽略不计。OMS 旨在帮助用户以最低的风险、极小的开销和最高的效率实现同构/异构数据库向 OceanBase 数据库进行实时数据迁移和数据同步。OMS 社区版支持数据迁移功能,您可以通过该功能实时进行 MySQL 数据库与 OceanBase 社区版之间的数据迁移,以及 OceanBase 社区版与 OceanBase 社区版之间的数据迁移。
同时,通过 OMS 用户可以在不停服的情况下无缝将数据迁移到 OceanBase 数据库上。在业务应用切换数据库到 OceanBase 数据库前,OMS 可以启用反向数据同步链路,再执行应用切换到 OceanBase 数据库,重新建立主备关系,此时所有在切换后发生在 OceanBase 数据库上的数据变更都将实时同步至切换前的源端数据库,以此来应对紧急回切的需求场景,最大程度的降低业务迁移风险,助力企业用户构建高可用和高可靠的数据体系架构。
测试目的
本节主要测试 OceanBase 数据库不同租户之间的数据同步。当迁移的源端数据库为 OceanBase 时,会通过 OCP 获取相关信息,所以需要关联 OCP。OMS 社区版会通过 JDBC 直连 OCP 的元信息库,来查询数据迁移流程中需要使用的信息,然后发送数据给目标端 OceanBase 租户。该方法同样也适用于 MySQL 与 OceanBase 以及 OceanBase 与 OceanBase 之间的数据同步。
前提条件
1、 已部署 OCP 社区版 3.3.0,详细操作请参见 OCP 部署指南。
2、 已部署 OMS 社区版 3.3.0,详细操作请参见 OMS 部署指南。
3、部署待迁移的 OceanBase 集群(含 OBProxy),必须使用 OCP 接管或创建。详细操作请参见 创建集群 和 使用 OCP 接管 OBD 部署的集群。
数据同步测试
环境准备
1、登录 OCP,使用 OCP 为待迁移的集群创建租户、数据库及迁移所用的用户。具体操作请参见:管理租户。
租户 | 数据库 | 用户 | 备注 |
test1 | test_oms_1 | oms | 源端1 |
test2 | test_oms_2 | oms | 源端2 |
test3 | test_oms_3 | oms | 目标端 |
2、登录 OMS 社区版控制台。
3、关联 OCP。
当 OMS 社区版的运行涉及 OceanBase 数据源时,会通过 OCP 获取相关信息,所以需要关联 OCP。具体操作请参见 关联 OCP。添加完成后,可在关联 OCP 页面中看到已关联的 OCP。
4、添加 OceanBase 社区版数据源(源端和目标端),具体操作请参见 添加 OceanBase-CE 数据源,添加完成后可在数据源管理中看到已添加的数据源列表。
测试一:
测试目的:测试能否正常将租户 test1 表 t1 的数据和租户 test2 表 t2 的数据,分别迁移至租户 test3 的表 t1 和 表 t2 中。
测试步骤:
- 全量迁移:在 OMS 社区版中创建两个迁移项目,将源端租户 test1 和租户 test2 的全量数据迁移至目标端租户 test3 中。
- 增量同步:在源端租户 test1 的表 t1 和租户 test2 的表 t2 中进行
insert
、delete
、update
,查看目标端租户 test3 的表 t1 和 表 t2 数据的变化。 - 反向增量同步:正常增量同步完成后,开启租户 test3 到 租户 test1 的反向增量同步。在目标端租户 test3 的表 t1 中进行
insert
、delete
、update
,查看源端租户 test1 的表 t1 数据的变化。
租户 | 数据库 | 用户 | 表 | 备注 |
test1 | test_oms_1 | oms | t1 | 源端1 |
test2 | test_oms_2 | oms | t2 | 源端2 |
test3 | test_oms_3 | oms | t1,t2 | 目标端 |
1、在客户端使用 oms 用户分别登录租户 test1 和 test2,创建表 t1 和 t2。
obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test1#testoms -pXXX -A test_oms_1
CREATE TABLE `t1` (
`id` int NOT NULL,
`name` varchar(45) DEFAULT NULL,
`remark` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) CHARSET=utf8mb4;
MySQL [test_oms_1]> insert into t1(id,name,remark) values(10,'aa','test10');
MySQL [test_oms_1]> insert into t1(id,name,remark) values(11,'bb','test11');
MySQL [test_oms_1]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa | test10 |
| 11 | bb | test11 |
+----+------+--------+
2 rows in set (0.002 sec)
obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test2#testoms -pXXX -A test_oms_2
CREATE TABLE `t2` (
`id` int NOT NULL,
`name` varchar(45) DEFAULT NULL,
`remark` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) CHARSET=utf8mb4;
MySQL [test_oms_2]> insert into t2(id,name,remark) values(20,'aa','test20');
MySQL [test_oms_2]> insert into t2(id,name,remark) values(21,'bb','test21');
Query OK, 1 row affected (0.002 sec)
MySQL [test_oms_2]> select * from t2;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 20 | aa | test20 |
| 21 | bb | test21 |
+----+------+--------+
2 rows in set (0.002 sec)
2、创建数据迁移项目,具体操作请参见 数据迁移。
2.1、选择源节点和目标节点,这里选择源端1和目标端,即源端租户 test1 和目标端租户 test3。
2.2、选择要迁移的源端数据库表,单击“>”,添加至目标端对象中,默认生成与源端相同的表名,也可以进行重命名。
2.3、启动任务之后,可以看到任务的基本信息及迁移步骤详情。
2.4、同理继续创建第二迁移项目(源端租户 test2 和目标端租户 test3),创建完成后,可在迁移项目列表中,查看添加的项目。
3、验证迁移结果
3.1、全量迁移验证
登录目标端租户 test3 ,查看全量迁移的结果。可以看到 test1 租户的表 t1,和 test2 租户表 t2 已经迁移成功。
[admin@126 ~]$obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test3#testoms -pXXX -A test_oms_3
MySQL [test_oms_3]> show tables;
+----------------------+
| Tables_in_test_oms_3 |
+----------------------+
| t1 |
| t2 |
+----------------------+
2 rows in set (0.001 sec)
MySQL [test_oms_3]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa | test10 |
| 11 | bb | test11 |
+----+------+--------+
2 rows in set (0.001 sec)
MySQL [test_oms_3]> select * from t2;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 20 | aa | test20 |
| 21 | bb | test21 |
+----+------+--------+
2 rows in set (0.001 sec)
3.2、增量同步验证
- 分别在源端租户 test1 的表 t1 和租户 test2 的表 t2 中插入一条数据,在目标端租户 test3 中,查看数据同步的结果。可以看到新插入的数据已被同步过来。
MySQL [test_oms_1]> insert into t1(id,name,remark) values(12,'cc','test12');
MySQL [test_oms_2]> insert into t2(id,name,remark) values(22,'cc','test22');
MySQL [test_oms_3]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa | test10 |
| 11 | bb | test11 |
| 12 | cc | test12 |
+----+------+--------+
3 rows in set (0.000 sec)
MySQL [test_oms_3]> select * from t2;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 20 | aa | test20 |
| 21 | bb | test21 |
| 22 | cc | test22 |
+----+------+--------+
3 rows in set (0.001 sec)
MySQL [test_oms_3]>
- 在源端租户 test1 的表 t1 中修改一条数据,在目标端租户 test3 中,查看数据同步的结果。可以看到修改的数据已被同步过来。
MySQL [test_oms_1]> update t1 set name = 'dd' where id = 12;
MySQL [test_oms_3]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa | test10 |
| 11 | bb | test11 |
| 12 | dd | test12 |
+----+------+--------+
3 rows in set (0.000 sec)
- 在源端租户 test2 的表 t2 中删除一条数据,在目标端租户 test3 中,查看数据同步的结果,可以看到
id =20
的数据被删除。
MySQL [test_oms_2]> delete from t2 where id = 20;
MySQL [test_oms_3]> select * from t2;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 21 | bb | test21 |
| 22 | cc | test22 |
+----+------+--------+
2 rows in set (0.000 sec)
3.3、反向增量验证
以租户 test3 反向增量迁移至租户 test1 为例,进行反向增量同步前,请确认正向增量同步已完成,
全量校验完成后,单击【进入下一阶段】,进行正向切换。
注意:启动正向切换前,请确保源端数据源为即将停写或者已经停写状态。
反向增量任务启动成功后,在目标端租户 test3 的表 t3 中插入一条数据,在源端租户 test1 中,查看数据反向同步的结果。可以看到新插入的数据已被反向同步过来。
MySQL [test_oms_3]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa | test10 |
| 11 | bb | test11 |
| 12 | dd | test12 |
+----+------+--------+
3 rows in set (0.003 sec)
MySQL [test_oms_3]> insert into t1(id,name,remark) values(14,'ee','test14');
MySQL [test_oms_1]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa | test10 |
| 11 | bb | test11 |
| 12 | dd | test12 |
| 14 | ee | test14 |
+----+------+--------+
4 rows in set (0.000 sec)
在目标端租户 test3 的表 t1 中修改一条数据,在源端租户 test1 中,查看数据同步的结果。可以看到id = 10
数据已被删除。
MySQL [test_oms_3]> delete from t1 where id = 10;
MySQL [test_oms_1]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 11 | bb | test11 |
| 12 | dd | test12 |
| 14 | ee | test14 |
+----+------+--------+
3 rows in set (0.000 sec)
测试二:
测试目的:测试能否正常将租户 test1 和租户 test2 中两张结构相同的表,迁移至租户 test3 的一张表中。
测试步骤:
- 全量迁移:在 OMS 社区版中创建两个迁移项目,将源端租户 test1 和租户 test2 的全量数据迁移至目标端租户 test3 中。
- 增量同步:在源端租户 test1 的表 t3 和租户 test2 的表 t3 中进行
insert
、delete
、update
,查看目标端租户 test3 的表 t3 数据的变化。
测试结果:
同时将两个相同结构的表往另一张表汇总时,在进行全量迁移的过程中,若存在 id 相同的数据,后迁移的数据不会被同步过来,会导致后迁移的数据丢失。但是在增量同步的过程中,若插入的 id 相同,则后表插入的数据会覆盖前表插入的数据,导致前表插入的数据丢失。
租户 | 数据库 | 用户 | 表 | 备注 |
test1 | test_oms_1 | oms | t3 | 源端1 |
test2 | test_oms_2 | oms | t3 | 源端2 |
test3 | test_oms_3 | oms | t3 | 目标端 |
1、在客户端使用 oms 用户分别登录租户 test1 和 test2,创建表 t3。
obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test1#testoms -pXXX -A test_oms_1
CREATE TABLE `t3` (
`id` int NOT NULL,
`name` varchar(45) DEFAULT NULL,
`remark` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) CHARSET=utf8mb4;
MySQL [test_oms_1]> insert into t3(id,name,remark) values(010,'aa','r1');
MySQL [test_oms_1]> insert into t3(id,name,remark) values(011,'bb','r2');
MySQL [test_oms_1]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa | r1 |
| 11 | bb | r2 |
+----+------+--------+
2 rows in set (0.002 sec)
obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test2#testoms -pXXX -A test_oms_2
CREATE TABLE `t3` (
`id` int NOT NULL,
`name` varchar(45) DEFAULT NULL,
`remark` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) CHARSET=utf8mb4;
MySQL [test_oms_1]> insert into t3(id,name,remark) values(010,'zz','r3');
MySQL [test_oms_1]> insert into t3(id,name,remark) values(012,'yy','r4');
MySQL [test_oms_2]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | zz | r3 |
| 12 | yy | r4 |
+----+------+--------+
2 rows in set (0.002 sec)
2、创建租户 test1 至 租户test3 的数据迁移项目,具体操作请参见 数据迁移。
3、创建租户 test2 至 租户test3 的数据迁移项目。
3.1、选择源节点和目标节点,这里选择源端2和目标端,即源端租户 test2 和目标端租户 test3。
3.2、选择要迁移的源端数据库表,单击“>”,添加至目标端对象中,默认生成与源端相同的表名,也可以进行重命名。
3.3、配置迁移选项,这里注意在高级配置中,允许全量迁移目标表非空,因为前面已经创建了租户 test1 表1 至 test3 表 t3 的迁移项目,项目启动后,目标表非空。
3.4、租户 test1 表1 至 test3 表 t3 的迁移项目,已经在租户 test3 中创建了表 t3,此时不需要再创建表,因此可直接跳过结构迁移,再单击右上角的“恢复”,继续进行下一步。
创建完成后可在迁移项目列表中,查看到已创建的迁移项目。
4、验证迁移结果
4.1、全量迁移验证
登录目标端租户 test3 ,查看全量迁移的结果。可以看到租户 test2 中 id = 10 因为和 租户 test1 中的 id 相同,导致数据未被迁移过来。在项目详情的全量校验中也可以看到数据不一致的提示。
MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa | r1 |
| 11 | bb | r2 |
| 12 | yy | r4 |
+----+------+--------+
3 rows in set (0.001 sec)
3.2、增量同步验证
- 分别在源端租户 test1 的表 t3 和租户 test2 的表 t3 中插入一条数据,在目标端租户 test3 中,查看数据同步的结果。可以看到新插入的数据已被同步过来。
MySQL [test_oms_1]> insert into t3(id,name,remark) values(013,'cc','r5');
MySQL [test_oms_2]> insert into t3(id,name,remark) values(014,'xx','r6');
MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa | r1 |
| 11 | bb | r2 |
| 12 | yy | r4 |
| 13 | cc | r5 |
| 14 | xx | r6 |
+----+------+--------+
5 rows in set (0.001 sec)
- 分别在源端租户 test1 的表 t1 和租户 test2 的表 t2 中插入一条 id 相同的数据,在目标端租户 test3 中,查看数据同步的结果。可以看到当 id 相同时后插入的数据会覆盖前插入的数据。
MySQL [test_oms_1]> insert into t3(id,name,remark) values(015,'dd','r7');
MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa | r1 |
| 11 | bb | r2 |
| 12 | yy | r4 |
| 13 | cc | r5 |
| 14 | xx | r6 |
| 15 | dd | r7 |
+----+------+--------+
6 rows in set (0.001 sec)
MySQL [test_oms_2]> insert into t3(id,name,remark) values(015,'ww','r8');
MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa | r1 |
| 11 | bb | r2 |
| 12 | yy | r4 |
| 13 | cc | r5 |
| 14 | xx | r6 |
| 15 | ww | r8 |
+----+------+--------+
6 rows in set (0.000 sec)
- 在源端租户 test1 的表 t3 中修改一条数据,在目标端租户 test3 中,查看数据同步的结果。可以看到修改的数据已被同步过来。
MySQL [test_oms_1]> update t3 set remark='test1' where id = 10;
MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa | test1 |
| 11 | bb | r2 |
| 12 | yy | r4 |
| 13 | cc | r5 |
| 14 | xx | r6 |
| 15 | ww | r8 |
+----+------+--------+
6 rows in set (0.001 sec)
- 在源端租户 test2 的表 t3 中删除一条数据,在目标端租户 test3 中,查看数据同步的结果,可以看到
id = 12
的数据已被删除。
MySQL [test_oms_2]> delete from t3 where id = 12;
MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa | test1 |
| 11 | bb | r2 |
| 13 | cc | r5 |
| 14 | xx | r6 |
| 15 | ww | r8 |
+----+------+--------+
5 rows in set (0.000 sec)
搜索🔍钉钉群(33254054),或扫描下方二维码,还可进入 OceanBase 技术答疑群,有任何技术问题在里面都能找到答案哦~
OceanBase 开源仓库地址:https://github.com/oceanbase/oceanbase
👆 👆 👆
欢迎试用