整库同步&增量同步
整库同步
概述
整库同步是帮助提升用户效率、降低用户使用成本的一种快捷工具,本质上是一种批量配置同步任务的方式。假设数据库有100张表,原本可能需要配置100次数据同步任务,整库同步功能可以一次性完成100个同步任务的配置。
支持的数据源类型
目前可以支持的数据源类型如下:
作为源数据源 | 作为目标数据源 | |
---|---|---|
MySQL | 支持 | 支持 |
Polardb for MySQL 8 | 支持 | |
Oracle | 支持 | 支持 |
SQLServer | 支持 | |
PostgreSQL | 支持 | 支持 |
DB2 | 支持 | 支持 |
达梦 | 支持 | |
Greenplum | 支持 | |
TiDB | 支持 | 支持 |
GBase 8a | 支持 | |
ClickHouse | 支持 | |
Hive | 支持 | |
ADB | 支持 | |
Doris | 支持 | |
Hana | 支持 |
配置整库同步
配置整库同步的入口在「数据源」页面,在待同步的数据源点击「整库同步」按钮,进入整库同步页面。 整库同步的配置包括:
待同步表:将数据源指定的数据库下的所有表,以表格的形式展现出来,可以根据实际需要批量选择;目标表表名后还可查看对应数据源的建表语句,如下图。
高级设置:
表名转换:可填写表名中原有的字符,替换后的字符,例如将
ab
替换为ods_ab
注意,表名替换中,目前会将表名所有匹配到的地方都做替换,例如表名为abc_ab_table
,按以上规则,会被替换为ods_abc_ods_ab_table
字段名转换:原理与表名转换类似,依然会存在同个字符可能会被多次替换的情况,例如配置字段名转换规则为
d->od
,则MySQL中字段名address
将会被转换为aododress
字段类型转换:源表的字段类型转换为Hive表的字段类型
数据同步目标:选择数据同步目标,目标数据源可选择的范围参考上文中的「支持的数据源类型」
分区字段:当数据同步目标选择hive类的数据同步目标时,展示「分区字段」填写项,默认「分区字段」为pt,支持用户自定义。
同步任务生成目录:支持选择默认目录或自定义目录,默认目录为clone_database/数据源名称
生效日期:整库同步生成的每个任务的生效日期
具体时间:整库同步生成的每个任务的具体时间
同步方式:
增量(根据日期字段):使用同步任务的「[数据过滤]」功能,根据用户填写的增量日期字段自动拼接SQL,抽取前一天的数据。使用增量方式后,系统将对每张表使用同样的增量字段,配合离线开发调度参数(${bdp.system.bizdate})形成针对每天的数据抽取条件,例如MySQL的拼接(用户点击「发布任务」按钮后,会先对增量字段进行检查,若字段不存在,则此表会配置失败):
-- MySQL STR_TO_DATE('${bdp.system.bizdate}', '%Y%m%d') <= id AND id < DATE_ADD(STR_TO_DATE('${bdp.system.bizdate}', '%Y%m%d'), interval 1 day) SQLCopied!
配置增量抽取时,源库每张表的增量字段名需保持一致,若无法保持一致,可分批次分别配置,否则会导致SQL拼接失败
- 全量:不拼接增量抽取SQL,全量抽取各表的数据
- 并发配置:为了对数据源进行保护,避免同一时间点启动大量数据同步作业带来数据库压力过大,可选择分批上传,例如:从每日0点开始,每1小时启动3个数据库表同步
- 间隔时间:每隔xx小时同步多少张表
- 是否保存配置:保存配置后,可在「数据源-操作-同步历史」按钮中找到历史上配置过的整库同步任务与配置结果,系统仅保留最近5次的历史记录
- 发布任务进度:点击「发布任务」,系统将逐个生成同步任务,可在待同步表的「任务状态」一列查看每张表发布的结果,包括成功或失败信息
- 同步历史:同步历史的入口在「数据源-操作-同步历史」按钮,系统仅记录勾选了保存同步配置,否则不会保留历史记录
任务生成的步骤
整库同步批量生成任务,按照如下步骤进行处理,每个任务单独检查,其中部分失败不会影响其他任务的生成
任务生成规则
用户完成配置,点击「发布任务」按钮时,会按照如下规则批量生成同步任务:
- Hive表的表名、字段名和字段类型根据高级配置生成,如果没有填写高级配置,则与源表的结构完全相同。分区字段名为pt,格式为yyyyMMdd
- 生成的同步任务,所在目录为:clonedatabase>数据源名称>数据源名称2hive表名中找到生成的任务,然后对其进行更加个性化的编辑操作
- 生成的数据同步任务是按天调度的周期任务,会在第二天凌晨自动运行,传输速率为1M/s
- 若目标表名、任务名已存在,则该任务生成失败
- 若增量字段不存在,则该任务生成失败,并提示「日期分区字段在表中不存在」
字段类型转换
创建目标表会根据源库的字段类型,自动转换为目标字段的类型,字段转换规则可以在“高级设置”中配置。
提交任务
- 除了创建同步任务,系统还会自动创建一个虚节点,并将其他同步任务作为本任务的下游任务,方便用户执行补数据操作
- 完成以上操作后,将虚节点和其他同步任务执行一次提交操作
- 若用户对同一数据源多次操作补数据,则系统仅会创建一个虚节点,新创建的同步任务都会被置为此虚节点的子任务
其他说明
由于数据库的表设计规范性的问题,整库上传具有一定的约束性,具体如下: 仅提供每日增量、每日全量的上传方式
如果您需要一次性同步历史数据,则此功能无法满足您的需求,故给出以下建议:
- 建议您配置为每日任务,而非一次性同步历史数据。您可以通过调度提供的补数据来对历史数据进行追溯(从虚节点及其下游开始补数据),这样可避免全量同步历史数据后,还需要做临时的SQL任务来拆分数据。
- 如果您需要一次性同步历史数据,可以在任务开发页面进行任务的配置,然后单击运行,完成后通过SQL语句进行数据的转换,因为这两个操作均为一次性行为。
- 如果您每日增量上传有特殊业务逻辑,而非一个单纯的日期字段可以标识增量,则此功能无法满足您的需求,为了更方便地增量上传,建议您在创建所有数据库表的时候都有:gmt_create或gmt_modify的字段,同时为了效率更高,建议增加id为主键。
整库上传提供分批和整批上传的方式
- 为了保障对数据库的压力负载,整库上传提供了分批上传的方式,您可以按照时间间隔把表拆分为几批运行,避免对数据库的负载过大,影响正常的业务能力。以下有两点建议:
- 如果您有主、备库,建议同步任务全部同步备库数据。
- 批量任务中每张表都会有1个数据库连接,上限速度为1M/s。如果您同时运行100张表的同步任务,就会有100个数据库进行连接,建议您根据自己的业务情况谨慎选择并发数。
- 如果您对任务传输效率有自己特定的要求,此功能无法实现您的需求。所有生成任务的上限速度均为 1M/s。
增量同步
概述
表中的数据基本只有插入操作,随着业务的运行,表中的数据会越来越大。如果每次都整表同步的话,消耗的时间及资源也会越来越多,因此需要一个增量同步的功能,每次只同步增加部分的数据,对于已经同步过的数据则不再进行重复的同步工作。
本节使用MySQL作为示例,演示了如何利用本平台对MySQL的某张表进行增量同步:进行增量同步的步骤,除了基础的字段映射之外,关键是在同步任务的第一步数据来源的数据过滤表单中填写过滤条件,下面分几种情况举例如何填写过滤条件:
MySQL建表语句如下:
create table if not EXISTS filterData(
id int auto_increment,
mod_time datetime
)
SQLCopied!
且存储的数据为: image::filterMysql.png[]
- 天增量抽取
-- 抽取昨天数据
date(modtime)=DATE_FORMAT('${bdp.system.bizdate}','%Y-%m-%d');
SQLCopied!
- 小时增量抽取
-- 抽取设定的时间,前3小时至前1小时的数据,例如任务定时时间是19:00运行,则会抽取:[16:00~18:00)的数据
SELECT
id,
modtime
FROM
filterdata
WHERE
modtime >= DATE_ADD( DATE_FORMAT( '${bdp.system.cyctime}', '%Y-%m-%d %H' ), INTERVAL - 3 HOUR )
AND modtime < DATE_ADD( DATE_FORMAT( '${bdp.system.cyctime}', '%Y-%m-%d %H' ), INTERVAL - 1 HOUR );
SQLCopied!
- 半小时增量抽取
-- 抽取设定的时间,前半小时的数据,例如任务定时时间是19:00运行,则会抽取:[18:30~19:00)的数据
SELECT
id,
modtime
FROM
filterdata
WHERE
modtime >= DATE_ADD( DATE_FORMAT( '${bdp.system.cyctime}', '%Y-%m-%d %H:%i' ), INTERVAL -30 MINUTE )
AND modtime < DATE_FORMAT( '${bdp.system.cyctime}', '%Y-%m-%d %H:%i' );
SQLCopied!
- 月增量抽取
-- 抽取上个月,整月的数据,例如任务定时时间是2018-01-01 12:12:12运行,则会抽取:[2017-12-01 00:00:00 2018-01-01 00:00:00)的数据
SELECT
id,
modtime
FROM
filterdata
WHERE
modtime >= DATE_ADD( DATE_FORMAT( '${bdp.system.bizdate}', '%Y-%m-%d' ), INTERVAL -1 MONTH )
AND modtime < DATE_FORMAT( '${bdp.system.bizdate}', '%Y-%m-%d' );
SQLCopied!