多表实时同步任务
通过多表实时同步功能,您可以将数据库中的数据整库同步到Lakehouse中,包括历史数据的全量同步和变更数据的实时增量同步。多表实时同步功能可达到秒级的端到端时效性,为您提供更好的数据新鲜度。
支持的数据源类型和版本
类型 | 增量读取模式 | 数据库版本 |
---|---|---|
MySQL类 | Binlog | 5.6及以上、8.x |
PostgreSQL类 | WALs日志 | 14及以上 |
源端数据库准备工作
数据库参数配置
PostgreSQL
注意:修改以下参数需要重启Postgresql Server后生效。
配置 | 说明 | 默认值(单位) |
---|---|---|
wal_level | 预写日志(WAL)级别,决定多少信息写入到 WAL 中。 replica:会写入足够的数据以支持WAL归档和复制,包括在standby服务器上运行只读查询 minimal:会去掉除从崩溃或者立即关机中进行恢复所需的信息之外的所有记录 logical:会增加支持逻辑解码所需的信息 要支持实时同步,需要将wal_level设置为logical | replica |
max_replication_slots | 服务端允许创建的slot数量。 | 10 |
max_wal_senders | 服务端最多可同时运行的wal sender进程,对应我们可以同时进行实时同步的任务数。 | 10 |
max_slot_wal_keep_size | 每个slot保存的wal大小。-1表示无限制。 | -1(MB) |
wal_sender_timeout | 超过这个配置时间的复制连接会被终端。 | 60000(ms) |
MySQL
属性 | 描述 | 要求配置 | 查询方法 |
---|---|---|---|
log_bin | 是否开启binlog | ON或on | SHOW GLOBAL VARIABLES LIKE 'log_bin' |
binlog_format | binlog日志格式。有三种取值可能: statement模式:记录的sql语句,优点是binlog保存内容少,缺点是有时候会导致同步结果不准确,因为同样的sql函数,可能在master和server上执行出不一样的结果,导致同步结果不对 row:记录的是sql执行前后的完整行数据,优点是数据准确,缺点是binlog数据量大 mixed:mysql会根据执行的sql内容自己决定用statement模式还是row模式来保存记录。 | ROW或row | SHOW GLOBAL VARIABLES LIKE 'binlog_format' |
binlog_row_image | binlog记录前镜像和后镜像的方式 | FULL或full(前镜像和后镜像都记录全部字段) | SHOW GLOBAL VARIABLES LIKE 'binlog_row_image' |
binlog_expire_logs_seconds | binlog自动清理时间 | 按业务要求配置,建议配置86400(秒)或以上 |
数据库权限配置
同步不同类型数据源的变更事件时,需要在相应数据源服务端配置好适当的权限才能保证数据的正常同步。尽管直接分配一个管理员或超级用户的权限足够保证任务正常运行,但通常会希望能够最小化权限需要分配给同步数据的用户的权限。各操作步骤需要的具体权限配置说明如下。
PostgreSQL
请注意,在执行赋权SQL语句时,确保执行账号自身具备可以授权的权限,建议使用管理员账号。为了确保任务顺利运行,建议将下述所有场景的授权均执行一遍。
场景:配置任务(获取元数据:schema列表、table列表、table字段列表)
所需权限:
授权方式
-
赋予某个角色读取information_schema的权限:
-
赋予某个角色读取某张表的权限:
场景:同步WAL日志
所需权限
授权语句
场景:同步历史全量数据(可选)
所需权限
授权语句
-
赋予某个角色读取某张表的权限:
-
赋予某个角色读取schema下所有表的权限:
场景:变更数据同步,创建publication
所需权限
授权语句
- 赋予CREATE权限
MySQL
请注意,在执行赋权SQL语句时,确保执行账号自身具备GRANT OPTION权限,建议使用超管账号比如root。为了确保任务顺利运行,建议将下述所有场景的授权均执行一遍。
使用场景:配置任务(获取元数据:database列表、table列表、table字段列表)
所需权限
授权语句
-
赋予用户查询 database 列表的权限:
-
赋予用户查询 table 列表和 table 详情的权限(SELECT包含了SHOW TABLES的权限):
使用场景:基于binlog日志同步变更数据
所需权限
授权语句
使用场景:同步历史全量数据
所需权限
授权语句
-
赋予用户查询 table 的权限:
任务创建
操作入口
在任务开发界面,点击新建操作,选择“多表实时同步”任务类型。
配置来源数据类型
选择一种需要同步的来源数据类型。当前支持的来源数据源类型如下:
选择同步类型
支持三种任务同步模式,请按需选择:
- 实时同步-多表镜像:用于将源端数据,镜像同步到目标端的场景。
- 实时同步-整库镜像:用于将源端数据,镜像同步到目标端的场景,此种方式以数据库为粒度进行配置,会自动适配库中新增表、自动同步。
- 实时同步-多表合并:用于将分库分表数据合并写入同一张目标表的场景。
多表镜像
来源配置
-
选择数据源
- 对于多表镜像同步,请选择一个数据源。如果这里不展示,请新建一个数据源,详见 数据源配置。
- 请确保数据源中的账号具备足够的权限,详见下文的权限说明。
-
配置读取模式
- MySQL 当前只支持 BINLOG 模式。
- PostgreSQL 当前只支持 WALs 模式。
-
选择同步对象
- 先选择需要同步的库,再选择需要同步的表。
- 页面提供批量配置的功能,基于配置模板,按照格式要求填写配置文件、上传后,页面会按照文件中给定的内容来选中需要同步的对象,选中后可以按需再进行微调。请注意删除模板文件中的注释说明。
-
配置槽位(slot)
- 仅PostgreSQL需要配置,槽位(slot)指PostgreSQL 的 replication slot,详见 说明文档。
- 每个数据库都需要配置一个槽位。目前支持decoderbufs和pgoutput两种插件类型。
- 可以选择已存在的槽位进行使用;或者在页面页面来操作新建,在新建窗口的下方区域的创建语句,可按需修改。点击确定后进行创建。在数据源中配置的用户名必须具备创建slot的权限,否则会创建失败,详见下文的权限说明。
- 特别注意,不同任务不要复用同一个槽位。任务启动时,如果槽位被其它在运行中的任务占用,会启动失败。如果其它任务处在停止状态,因槽位中的数据会被共享消费使用,位点是被共享的,新任务消费的增量数据,同步到目标端的表数据可能会不全。
目标配置
目标端目前只支持写入到Lakehouse。
- 目标数据源
- 默认是当前工作空间对应的Lakehouse数据源,不需修改。
- 命名空间规则
- 当前仅支持选择特定的命名空间,后续会扩展支持按照源端进行镜像命名或者自定义命名。
- 按需选择特定命名空间(工作空间)即可。
- 目标表命名规则
- 当前仅支持镜像来源名字,后续会扩展支持添加前缀或者自定义命名规则。
- 计算集群
- 选择工作空间下可用的集群,推荐使用AP类型的集群。
预览配置
- 完成上述源端和目标端配置后,可以预览同步表和字段的映射关系。如果有需要修改,请返回上一步进行调整。
同步规则
- 同步规则中,可以配置Schema Evolution规则,来定义源端表和字段变化后的处理行为,以及选择需要处理的源端变更消息类型等。请按需配置。
整库镜像
配置方式和多表镜像基本类似,请参考上文。最大的区别在于选择源端库表时,限制只让选择库,不可以选择具体的表。
多表合并
来源配置
- 选择数据源
- 同上,多表镜像同步类似
- 配置读取模式
- 同上,多表镜像同步类似
- 选择同步对象
多表合并同步,会使用“虚拟表”作为中间的过度承接,需要在配置时候指定使用什么虚拟表来承接哪些对象的数据。支持两种方式进行配置
- 方式一:基于规则配置,通过正则匹配进行筛选,比如选出以abc开头的所有表,在正则表达式中填写 abc 即可
- 方式二:基于文件批量配置,按照模板中格式要求填写配置文件、上传后,页面会按照文件中给定的内容来选中需要同步的对象,选中后可以按需再进行微调。请注意删除模板文件中的注释说明
目标配置
- 同上,和多表镜像同步类似
预览配置
- 同上,和多表镜像同步类似
同步规则
- 同上,和多表镜像类似
任务高阶参数
在多表实时同步任务的「参数」区域,可以设定一些高阶参数来控制同步任务的资源消耗等。
具体可以设定的高阶参数的名称、含义和默认取值如下:
参数名称 | 参数含义 | 参数取值 |
---|---|---|
step1.taskmanager.memory.process.size | 增量同步任务计算进程使用的总内存大小 | 默认值:1600m |
step1.taskmanager.memory.task.off-heap.size | 增量同步任务计算进程使用的堆外内存大小 | 默认值:256m |
step2.taskmanager.memory.process.size | 全量同步任务计算进程使用的总内存大小 | 默认值:2000m |
lh.table.cz.common.output.file.max.size | 全量同步写表时切分出单个文件的大小 | 默认值:33554432 |
lh.table.cz.common.output.enable.rotate | 全量同步写表时是否切分文件 | 默认值:true |
pod.limit.memory | 提交同步任务的客户端使用内存上限 | 默认值:1Gi |
提交
点击提交按钮,可将任务提交到生产环境执行。请注意,任务提交后默认不启动,需要手动启动。
任务运维
启动任务
进入任务详情页,可以操作启动任务,请按需选择以下启动方式之一。任务启动后,初始化阶段,根据表的数量不同,可能会消耗几分钟或者更久的时间,请耐心等待。
启动方式
- 无状态启动(仅在任务首次启动才支持):完整同步所有数据,先全量同步,再启动增量同步。
- 从上次保存状态恢复(仅对停止后的任务再次启动支持):如果上次同步被停止,会从停止的位置断点续传。
- 自定义起始位置:从给定的位点进行同步,可以用于数据回刷。对任务中配置的所有表全统一生效。
- MySQL:选择指定文件启动或者指定时间启动。在页面监控区域可以获取到上次文件位置。
- PostgreSQL:指定LSN取值,在下文的实例监控中可以查看到最新的LSN取值。
全量同步
- 通过此配置控制在增量同步前,是否先进行全量的数据同步。请注意,如果选择不进行全量同步,停止任务后重启可以再选择全量同步。
- 最大并发数:如果在启动任务时,选择了先进行全量数据同步,可以通过此参数来控制进行全量数据同步的并发子任务个数。同步任务会建立对应个数的JDBC连接到源端数据库。参数数值越大,理论同步速度会更快(在打满源端负载之前),但对源端的压力也会越大。
实例监控
阶段监控
任务启动后,会经历初始化、全量同步、增量同步三个阶段。可在实例监控区域查看这三个阶段的运行状态。
指标监控
在指标监控区域,可以查看全量同步和增量同步的关键监控指标。
指标名称 | 口径说明 |
---|---|
读取数据 | 数据同步任务在统计周期内从数据源读取的记录数。 |
写入数据 | 数据同步任务在统计周期内向目标数据源写入的记录数。 |
平均读取速率 | 数据同步任务在统计周期内平均读取速率。(周期内总读取记录/周期时间) |
平均写入速率 | 数据同步任务在统计周期内平均写入速率。(周期内总写入记录/周期时间) |
Failover次数 | 数据同步任务在统计周期内运行发生Failover次数。Failover次数与数据情况和数据同步服务自身运行的稳定性均相关。默认只展示最近10次的Failover信息。 |
同步对象
在同步对象区域,可以查看单表的同步终态和进行对应的运维操作。
指标 | 口径说明 |
---|---|
最新读取位置 | 同步任务实时读取来源对象数据并写入目标表,以目标表最新一条记录的写入时间作为读取位置。 |
最新更新时间 | 最近一次写入目标表的时间。 |
数据延迟 | 数据从数据源端事务提交到同步至目标端可见的时间间隔。 |
操作 | 行为定义 |
---|---|
全量同步详情 | 点击后可跳转全量同步任务界面查看详情 |
优先执行 | 在全量同步阶段,通过此操作可以让表的同步优先级提高,优先执行 |
取消运行 | 对于正在同步的表可操作,取消当前表的同步 |
强制停止 | 对于正在同步的表可操作,强制停止表所在的同步子任务进程。由于有可能多张表在同一个子任务进行中,所以此操作有可能会影响其它表的同步,请务必谨慎操作 |
重新同步 | 对该表重新进行全量和增量同步 |
查看异常 | 点击后可以查看表的增量同步任务的异常信息,比如Schema Evolution的异常等。 |
补数同步 | 针对该表,可以给定过滤条件后进行全量同步,比如按照id取值来筛选出部分的数据 |
停止任务
停止任务会停止任务中正在进行的全量同步和增量同步。停止时会自动保存增量同步的位点状态。
- 如果停止时表处在全量同步阶段,重启后,未完全全量同步的表,会重新进行一次全新的全量同步。
- 如果停止时表处在增量同步阶段,重启后,默认会从同步停止的位点继续同步。
下线任务
下线任务属于高危操作,任务下线后,不会保存当前同步的位点。如果再次上线并启动任务,会重新开始同步数据。
- 下线不会清理已经同步到目标端的数据,但会清理中间过程的缓存数据和位点信息。
- 重新同步不会重新建表,全量数据同步会对于老的表进行覆盖写入,增量同步会对目标表做merge into的更新。
已知局限
-
Schema Evolution,暂不支持变更字段类型、不支持自动新增表。
-
多表实时同步任务中,源端不同库表中若存在主键相同的数据,同步结果会出现异常。
-
MySQL同步,尚不支持的字段类型:
字段类型 同步后行为 year 取值不对应 -
PostgreSQL同步,尚不支持的字段类型:
字段类型 同步后行为 varbit 取值不对应 bytea 取值不对应 TIMETZ 取值不对应 interval 取值不对应 NAME 取值不对应 NUMERIC 精度不对应,目标端精度会更高 decimal 精度不对应,目标端精度会更高