分库分表数据汇聚
· 阅读需 6 分钟
简述
CloudCanal 2.X 版本近期支持了自定义代码能力,带来了丰富的场景化数据能力,本文主要介绍在面向 To C 业务分库分表情况下,如何通过 CloudCanal 进行数据实时汇聚。
本方案特点:
- 数据处理灵活,适配多变的业务数据汇聚需求
- 针对大部分带结构数据源互通,可举一反三
- 稳定性较好
技术点
约束冲突
对于一部分分库分表中间件或业务自己写的拆分逻辑,并没有考虑写入数据主键或者唯一字段值的全局唯一问题,导致做数据汇聚时约束冲突。
另一类系统,在业务上就独立,做数据汇集时,除了约束冲突,还存在结构不一致,数据规范不统一的问题。
对以上两种情况,添加额外的字段以消除分表之间的约束冲突,进行数据清洗、结构调整,将数据进行规整。自定义代码能够很好的完成这种使命。
DDL 同步
分库分表数据汇聚还存在一个较大的问题是 DDL 同步,对于大部分这类场景, 类似的 DDL 会在源端执行多遍,但是在对端只能执行一遍,并且数据和部分 DDL 有顺序依赖问题 --- 只有 DDL 在对端执行成功之后,新的数据才能写入或者执行。
我们目前建议不同步 DDL, 按照一定规范进行源和目标端 DDL 变更,达到不延迟且 DDL 不处于中间状态的目的。
操作示例
前置条件:
-
下载安装 CloudCanal 私有部署版本,使用参见快速上手文档
-
准备好 MySQL 数据库(本例源端 5.7 ,目标端 8.0)
-
源端 MySQL 上创建 2 个分库( shard_1 和 shard_2), 表结构一致(本例每一个分库只有一张分表)
CREATE TABLE `shard_1`.`my_order` (
`id` bigint(19) NOT NULL AUTO_INCREMENT,
`gmt_create` datetime NOT NULL,
`gmt_modified` datetime NOT NULL,
`product_id` bigint(20) NOT NULL,
`user_id` bigint(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8
CREATE TABLE `shard_2`.`my_order` (
`id` bigint(19) NOT NULL AUTO_INCREMENT,
`gmt_create` datetime NOT NULL,
`gmt_modified` datetime NOT NULL,
`product_id` bigint(20) NOT NULL,
`user_id` bigint(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8 -
目标 MySQL 上创建 1 个汇聚库(no_shard),并包含1张汇聚表
- 额外多出 region 字段,该字段通过自定义代码固定生成
- 源端主键 id 和生成字段 region 组合成联合主键,方便数据汇聚时保持唯一
CREATE TABLE `my_order` (
`id` bigint NOT NULL,
`region` varchar(64) NOT NULL,
`gmt_create` datetime NOT NULL,
`gmt_modified` datetime NOT NULL,
`product_id` bigint NOT NULL,
`user_id` bigint NOT NULL,
PRIMARY KEY (`id`,`region`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3