本文为您介绍实时同步任务延迟时的自助解决方案。
确认造成延迟问题在同步任务的读端还是写端
如果是在DataStudio创建的实时同步任务,您需要在实时同步任务运行与管理。
界面单击运行中的任务名称,弹出任务运行详情对话框。详情请参见
确认造成延迟问题的系统是否有异常

确认实时同步任务是否有频繁OOM

- 对于DataStudio新建的单表到单表ETL实时同步任务,您可以单击右侧的基本配置设置任务内存。
- 在DataStudio新建的数据库迁至DataHub等类型实时同步任务,您可以单击右侧的基本配置设置任务内存。
- 同步解决方案任务,您可以在运行资源设置步骤中设置内存。
确认源端数据是否有倾斜或者是否需要扩展分区或shard的数量
对于源端是Kafka、DataHub和Loghub三种类型的实时同步任务,如果根据上述步骤未发现异常或Failover,则需要检查源端系统数据是否有倾斜或者分区、shard的读取流量是否达到了同步速率的上限。
对于源端是Kafka、DataHub和Loghub三种类型的实时同步任务,每个分区或者shard只能由一个并发消费,如果存在写入源端系统的数据集中在个别分区或者shard,而其他分区或shard数据很少的情况,则很可能导致数据倾斜分区或shard的消费瓶颈,造成延迟。此时将无法通过数据集成任务设置解决延迟问题,需要从Kafka、DataHub和Loghub系统的上游数据生产侧解决数据写入倾斜问题后,延迟问题才能恢复。
您可以通过在上述任务运行详情中切换到运行信息页签,查看不同Reader线程总字节数统计,如果有个别Reader现场总字节数明显大于其他Reader线程,可以判断存在数据倾斜情况。但由于总字节数包括任务从上次指定位点启动开始的数据量,如果任务运行时间已经很长,则可能无法反映出最近的数据倾斜情况,您需要继续通过源端系统的监控指标确认是否存在数据倾斜情况。
确认MySQL源端是否有提交大事务或者变更过于频繁(如大量的DML和DDL的操作)
对于源端是MySQL的实时同步任务,如果根据上述步骤未发现异常或Failover,则需要检查源端系统是否提交了大事务或者源端系统变更过于频繁(如大量的DML和DDL的操作),导致Binlog增长过快超过同步任务消费速度导致延迟。
- 当同步速度很大时,说明Binlog增长速度快。
- 当同步速度不大,您可以在MySQL服务端查看Binlog的统计指标和审计日志确认实际增长速率。
如果确认是大事务或者临时的大量变更导致了任务延迟,则可以等待大事务或者大量变更包含的变更数据被同步任务处理完成后,任务延迟会逐步被追上。
确认是否有写入动态分区频繁切换问题(uploader map size has reached uploaderMapMaximumSize)
对于写入MaxCompute的实时同步任务,当分区方式选择根据字段内容动态分区时,要特别注意选择对应于MaxCompute表分区列的源端列,在实时同步任务右侧基本配置中配置的Flush间隔内(默认为1分钟)包含的可枚举值个数不能太大。
由于在Flush间隔内待写入MaxCompute表的数据实际是在实时同步任务的一组队列中保存,每个队列会缓存一个MaxCompute的写入数据,队列的默认最大个数是5个,如果对应于MaxCompute表分区列的源端列在配置的Flush间隔内可枚举值个数超过了缓存队列的最大个数,会立即触发对所有写入数据的Flush操作,而频繁的Flush操作将严重影响写入性能。
您需要确认是否存在MaxCompute表分区缓存队列个数耗尽触发频繁Flush操作问题。您可以在实时同步任务的运行详情页切换到日志页签,在日志中搜索是否有uploader map size has reached uploaderMapMaximumSize
。

增加并发设置或开启分布式运行模式解决延迟问题
- 对于DataStudio新建的单表到单表ETL实时同步任务,您可以单击右侧的基本配置设置任务并发和内存。
- 在DataStudio新建的数据库迁至DataHub等类型实时同步任务,您可以在运行资源设置步骤中设置并发,在右侧的基本配置设置任务内存。
- 同步解决方案任务,您可以在运行资源设置步骤中设置并发和内存。
任务类型 | 源端 | 目标端 |
---|---|---|
DataStudio ETL任务 | Kafka | MaxCompute |
DataStudio ETL任务 | Kafka | Hologres |