本文将以MySQL分库分表实时写入实时数仓Hologres场景为例,为您介绍分库分表写入Hologres数据集成最佳实践。
前提条件
已完成Hologres和MySql数据源配置。您需要将数据库添加至DataWorks上,以便在同步任务配置时,可通过选择数据源名称来控制同步读取和写入的数据库。本实践中创建的数据源名为
doc_mysql1
,详情请参见配置MySQL数据源、配置Hologres数据源。说明数据源相关能力介绍详情请参见:数据源概述。
已购买合适规格的独享数据集成资源组。详情请参见:新增和使用独享数据集成资源组。
已完成独享数据集成资源组与数据源的网络连通。详情请参见:网络连通方案。
已完成数据源环境准备。
Hologres:本实践需要在目标端创建Schema,所以您需要先授权数据源配置账号在Hologres创建Schema的权限,详情请参见Hologres权限模型概述。
MySQL:来源数据源为MySQL时,您需要开启Binlog相关功能,详情请参见MySQL环境准备。
背景信息
实际业务场景下数据同步通常不能通过一个或多个简单离线同步或者实时同步任务完成,而是由多个离线同步、实时同步和数据处理等任务组合完成,这就会导致数据同步场景下的配置复杂度非常高。尤其是在MySQL分库分表的场景下,上游的数据库和表非常多,都需要同时写入一张Hologres表,如果同时配置多个任务会导致配置非常复杂且运维困难。
针对以上痛点,DataWorks数据集成一键同步解决方案提供了面向业务场景的同步任务配置化方案,支持不同数据源的一键同步功能,方便业务简单快速的进行数据同步。
注意事项
同步数据至Hologres时,目前仅支持将数据写入分区表子表,暂不支持写入数据至分区表父表。
需求分析
场景描述:MySQL实例有三个分库分表数据库
order_db01
、order_db02
、order_db03
。业务上有两种逻辑表:订单表t_order
和用户表t_user
,其中每张逻辑表分别对应三个数据库下的两张物理表。如下图所示总共3个物理库,12张分表,分表分别对应两种逻辑表。现在需要将这12张分库分表的历史全量数据一次性迁移到Hologres对应的逻辑表中,并且后续能够实时增量写入,以满足用户实时数仓数据分析等需求。同时,为了便于在Hologres表里区分某条记录属于源端哪个物理库、物理表,则需要在Hologres表中添加上三个附加字段(src_datasource、src_database、src_table),标识某条记录的来源数据源实例、数据库以及表,这三个附加字段和物理表中的主键在Hologres里构成了唯一键,保障了某条物理表记录在Hologres逻辑表里的唯一性,全量数据迁移以及实时增量数据写入时均需要对这三个附加字段赋值。
需求汇总:
数据:将MySQL全量数据一次性同步至Hologres,增量数据后续实时写入目标端。
表:将源端分表数据写入目标单表,并为写入的Hologres表添加统一前缀。
将分表数据写入目标单表:将源表满足
t_order.*
正则表达式的表数据写入到Hologres名为t_order
的表中,所有满足t_user.*
正则表达式的表数据写入到Hologres名为t_user
的表中。为表加上统一前缀:在目标名前统一加上
cdo_
前缀。
schema:需要将源端所有满足
order_db.*
正则表达式的库写入目标Hologres名为order_db
的schema中。字段:目标表在原有表结构基础上,增加src_datasource、src_database、src_table字段用于记录源端表数据来源。
综合如上分析结果,最终的表对应关系如下所示:
源端分库
源端待同步表
写入的目标表
目标表新增字段
order_db01
t_order_01
cdo_t_order
src_datasource
src_database
src_table
t_order_02
t_user_01
cdo_t_user
t_user_02
order_db02
t_order_03
cdo_t_order
t_order_04
t_user_03
cdo_t_user
t_user_04
order_db03
t_order_05
cdo_t_order
t_order_06
t_user_05
cdo_t_user
t_user_06
操作流程
步骤一:选择同步方案
在此步骤中,您需要进入数据集成页面配置同步解决方案。
进入数据集成页面。
登录DataWorks控制台,切换至目标地域后,单击左侧导航栏的数据集成,在下拉框中选择对应工作空间后单击进入数据集成。
在数据集成同步任务页任务列表中单击请创建,进入同步方案配置页面。
数据来源与去向:选择待同步的源端数据源类型,目标端数据源选择Hologres。
新任务名称:配置当前方案名称。
同步类型:选择整库实时。
同步步骤:按需选择。
步骤二:网络与资源配置
源端选择环境准备步骤中已创建的数据源doc_mysql1
,目标数据源为DataWorks工作空间创建Hologres数据源。并测试连通性。
您需要根据业务需要定义读取源端数据库所使用的编码格式,及同步任务区源端数据库读取数据时所使用的时区。
步骤三:选择要同步的库表
此步骤中,您可以在源端库表区域选择doc_mysql1
数据源下需要同步的源端表,您可以选择该MySQL实例下的所有库、表进行同步,或者选择部分表进行同步。
步骤四:目标表映射
在上一步骤选择完需要同步的表后,将自动在此界面展示当前待同步的表,但目标表的相关属性默认为待映射状态,需要您定义并确认源表与目标表映射关系,即数据的读取与写入关系,然后单击刷新映射后才可进入下一步操作。您可以直接刷新映射,或自定义目标表规则后,再刷新映射。
您可以选中待同步表后,单击批量刷新映射,未配置映射规则时,默认根据源表所在库和表,写入至与源库同名的Hologres schema;与源表同名的Hologres表,若目标端不存在同名库与表时,将自动新建。
在进行自定义目标schema、表名和表字段等操作时,若在表格中未找到相关信息列,您可以单击表格右上方按钮自定义表格的显示列。
自定义目标schema和表
基于当前业务场景,我们需要将源端分表数据写入目标单表,并为写入的Hologres表添加统一前缀,自定义写入的schema名称,具体操作如下:
定义目标schema名与表名映射规则。
需求
配置过程
自定义写入的目标schema名称
创建schema名变换规则
schema_rule1_pre
,操作如下:在目标Schema名映射自定义列,单击编辑按钮。
由于需要将多个物理库实时写入一个目标Schema下面,所以需要将物理库和目标schema进行转换(默认是源库写入目标同名schema)。
如上图所示,使用源端数据库名将源端数据库名作为目标schema名称,并且将所有满足
order_db.*
正则表达式的源库写入目标Hologres名为order_db
的schema中。
自定义写入的目标表名称
创建表名变换规则
table_rule
,操作如下:在目标表名映射自定义列,单击编辑按钮。
由于需要将分库分表的物理表写入Hologres对应的逻辑表,所以需要通过正则来定义目标表的匹配规则。
如上图所示,使用源端表名将源端表名作为目标表名称。并且将源端表名中符合
t_order.*
正则表达式的表数据写入到Hologres名为t_order
表中;将源端表名中符合t_user.*
正则表达式的表数据写入到Hologres名为t_user
表中。
应用目标schema名与表名映射规则。
选中待同步的所有表,单击批量修改>目标Schema名映射自定义或批量修改>目标表名映射自定义,并分别选择已创建的规则
schema_rule1_pre
和table_rule
,使规则生效。自定义目标规则后的映射关系如下图所示。
编辑字段类型映射
同步任务存在默认的源端字段类型与目标端字段类型映射,您可以单击表格右上角的编辑字段类型映射,自定义源端表与目标端表字段类型映射关系,配置完后单击应用并刷新映射。本案例使用默认映射规则,无须设置。
为目标表添加字段并赋值
当目标Hologres表为待建立状态时,您可以为目标表在原有表结构基础上新增字段,用于记录源端表数据来源。
基于当前案例,为了便于在Hologres表里区分某条记录属于源端哪个物理库、物理表,则需要在Hologres表中添加上三个附加字段(src_datasource、src_database、src_table),标识某条记录的来源数据源实例、数据库以及表,这三个附加字段和物理表中的主键在Hologres里构成了唯一键,保障了某条物理表记录在Hologres逻辑表里的唯一性,全量数据迁移以及实时增量数据写入时均需要对这三个附加字段赋值。具体操作如下:
在列表底部选择批量修改>目标表结构_批量修改和新增字段,为目标表添加字段(
src_datasource
、src_database
、src_table
)。。
说明您也可以通过单击目标表名列的按钮,对目标表单独添加附加字段。
在列表底部选择批量修改>目标表字段赋值为上述步骤中添加的三个字段分别赋值为变量
DATASOURCE_NAME_SRC
、DB_NAME_SRC
、TABLE_NAME_SRC
。说明在赋值时支持赋值常量与变量,您可通过图标切换赋值模式。
配置DML规则
数据集成提供默认DML处理规则,同时,您可以根据业务需要在此界面对写入Hologres的DML命令定义处理规则。
单表定义规则:单击表格列DML规则配置>配置DML,对目标表单独定义DML规则。
批量定义规则:在列表底部选择批量修改>DML规则配置。
步骤五:报警配置
为避免任务出错导致业务数据同步延迟,您可以对实时同步子任务设置不同的报警策略。操作如下:
单击页面右上方的报警设置,进入实时同步子任务报警设置页面。
单击新增报警,配置报警规则。
说明此处定义的报警规则,将对该任务产生的实时同步子任务生效,您可在任务配置完成后,进入实时同步任务界面查看并修改该实时同步子任务的监控报警规则。
管理报警规则。
对于已创建的报警规则,您可以通过报警开关控制报警规则是否开启,同时,您可以根据报警级别报警给不同的人员。
步骤六:高级参数配置
数据集成提供数据库最大连接数,并发度等配置的默认值,如果需要对任务做精细化配置,达到自定义同步需求,您可对参数值进行修改,例如通过最大连接数上限限制,避免当前同步方案对数据库造成过大的压力从而影响生产。操作如下:
请在完全了解对应参数含义情况下再进行修改,以免产生不可预料的错误或者数据质量问题。
单击界面右上方的高级参数配置,进入高级参数配置页面。
在高级参数配置页面基于业务需要与资源组、数据库实际情况配置各项参数。
配置区域
参数
说明
读端配置
离线任务源端最大连接数
支持您通过该参数控制当前同步方案所产生的所有离线子同步任务可占用的源端数据库连接数,即同一时间内,当前同步解决方案所产生的所有离线子同步任务读取数据库的并发数上限。
说明实际执行时,当前任务同时运行的离线子任务并发度将不会超过此值。
配置运行时配置中的离线同步任务并发数时请参考该值。
写端配置
实时任务写端最大连接数
支持通过该参数控制当前同步方案所产生的所有实时子任务可占用的写端数据库最大连接数。
说明实际执行时,当前任务所产生的实时同步子任务并发度将不会超过此值。
配置运行时配置中的实时任务并发数时请参考该值。
离线任务写端最大连接数
支持通过该参数控制当前同步方案所产生的单个离线同步子任务可占用的写端数据库最大连接数。
运行时配置
离线同步任务并发度
单个离线同步子任务的并发数,建议按照对应规格的资源组支持的最大并发数合理分配。
说明因为离线同步任务个体配置差异较大,实际执行时不一定可以达到此处配置的并发数。收费将按照实际执行的并发数收费。详情请参见:性能指标。
离线任务是否开启限流
提供限流功能控制同步流量。
不限流:默认不限流,在不限流的情况下,任务将在所配置的并发数的限制基础上,提供现有硬件环境下最大的传输性能。
限流:考虑到速度过高可能对数据库造成过大的压力从而影响生产,数据集成同时提供了限速选项,您可以通过限流控制同步速率,从而保护读取端数据库,避免抽取速度过大,给数据库造成太大的压力。限速最小配置为1MB/S,最高上限为30MB/s。
离线任务限流大小
当开启限流场景下,您可以在此配置单个离线子任务流量大小。
说明流量度量值是数据集成本身的度量值,不代表实际网卡流量。通常,网卡流量往往是通道流量膨胀的1至2倍,实际流量膨胀取决于具体的数据存储系统传输序列化情况。
实时任务并发度
单个实时同步子任务并发数。
是否支持自动创建Schema
定义当前任务是否允许自动创建Hologres Schema。
步骤七:DDL能力配置
来源数据源会包含许多DDL操作,您可以根据业务需求,单击界面右上方DDL能力配置,进入DDL能力配置页面对不同的DDL消息设置同步至目标端的处理策略。不同DDL消息处理策略请参见:DDL消息处理规则。
步骤八:资源组配置
运行当前同步解决方案将产生多个离线同步子任务和一个实时同步子任务,您可以单击界面右上方的资源组配置,查看并切换当前的任务所使用的离线同步资源组和实时同步资源组。
离线和实时同步任务推荐使用不同的资源组,以便任务分开执行。如果选择同一个资源组,任务混跑会带来资源抢占、运行态互相影响等问题。例如,CPU、内存、网络等互相影响,可能会导致离线任务变慢或实时任务延迟等问题,甚至在资源不足的极端情况下,可能会出现任务被OOM KILLER杀掉等问题。
步骤九:执行同步解决方案任务
在数据集成主站页面,单击左侧菜单栏的同步任务界面,找到已创建的同步方案。
单击操作列的启动/提交执行按钮,启动同步的运行。
单击操作列的执行详情,查看任务的详细执行过程。
后续步骤
完成任务配置后,您可以对已创建的任务进行管理、执行加减表操作,或对任务配置监控报警,并查看任务运行的关键指标等。详情请参见:全增量同步任务运维。