MySQL到DWS参数调优
源端优化
MySQL抽取优化。
可通过在作业任务配置参数单击中“添加自定义属性”来新增MySQL同步参数。

可使用的调优参数具体如下:
参数名 |
类型 |
默认值 |
说明 |
---|---|---|---|
scan.incremental.snapshot.backfill.skip |
boolean |
true |
全量阶段是否跳过读取Binlog数据,默认为true。跳过读取Binlog数据可以有效降低内存使用。需要注意的是,跳过读取Binlog功能只提供at-least-once保证。 |
scan.incremental.snapshot.chunk.size |
int |
50000 |
分片大小,决定了全量阶段单个分片最大数据的数据条数以及分片个数。分片大小越大,单个分片数据条数越多,分片个数越小。 当表的条数过多时,作业会划分较多的分片,从而占用过多的内存导致内存问题,请根据表的条数适当调整该值。 当scan.incremental.snapshot.backfill.skip为false时,实时处理集成作业会缓存单个分片的数据,此时分片越大,占用内存越多,引发内存溢出,在此场景下,可以考虑降低分片大小。 |
scan.snapshot.fetch.size |
int |
1024 |
全量阶段抽取数据时,从Mysql侧单次请求抽取数据的最大条数,适当增加请求条数可以减少对Mysql的请求次数提升性能。 |
debezium.max.queue.size |
int |
8192 |
数据缓存队列条数,默认为8192,当源表中单条数据过大时(如1MB),缓存过多数据会导致内存溢出,可以考虑减小该值。 |
debezium.max.queue.size.in.bytes |
int |
0 |
数据缓存队列大小,默认为0,即表示缓存队列不考虑数据大小,只按照数据条数计算。在debezium.max.queue.size无法有效限制内存占用时,考虑显式设置该值来限制缓存数据的大小。 |
jdbc.properties.socketTimeout |
int |
300000 |
全量阶段连接Mysql的socket超时时间,默认为5分钟。当Mysql负载较高,作业出现SocketTimeout异常时,考虑增大该值。 |
jdbc.properties.connectTimeout |
int |
60000 |
全量阶段连接Mysql的连接超时时间,默认为1分钟。当Mysql负载较高,作业出现ConnectTimeout异常时,考虑增大该值。 |
参数名 |
类型 |
默认值 |
说明 |
---|---|---|---|
debezium.max.queue.size |
int |
8192 |
数据缓存队列条数,默认为8192,当源表中单条数据过大时(如1MB),缓存过多数据会导致内存溢出,可以考虑减小该值。 |
debezium.max.queue.size.in.bytes |
int |
0 |
数据缓存队列大小,默认为0,即表示缓存队列不考虑数据大小,只按照数据条数计算。在debezium.max.queue.size无法有效限制内存占用时,考虑显式设置该值来限制缓存数据的大小。 |
目的端优化
DWS写入优化。
可通过在DWS的目的端配置中修改写入相关配置,且可以通过单击高级配置的“查看编辑”按钮,添加高级属性。

参数名 |
类型 |
默认值 |
说明 |
---|---|---|---|
写入模式 |
enum |
UPSERT |
DWS的写入模式,可在目的端配置中设置,实时处理集成作业推荐使用COPY MODE。
|
批写最大数据量 |
int |
50000 |
DWS单次写入的最大条数,可在目的端配置中设置。 当缓存的数据达到“批写最大数据量”和“定时批写时间间隔”之一的条件时,触发数据写入。 单次写入条数增大可以减少请求DWS的次数,但可能导致单次请求时长增加,同时也可能导致缓存的数据增加进而影响内存使用。请综合考虑DWS规格和负载, 适当调整该值。 |
定时批写时间间隔 |
int |
3 |
DWS单次写入的时间间隔,可在目的端配置中设置。 当缓存的数据达到定时批写时间间隔的条件,触发数据写入。 增大该值有助于增加单次写入时缓存的数据条数,但由于写入频率降低,会提升DWS数据可见的时延。 |
sink.buffer-flush.max-size |
int |
512 |
DWS单次写入的数据大小,默认为512MB,可在目的端配置的高级配置中设置。 当缓存的数据达到数据大小限制时,触发数据写入。 与批写最大数据量类似,单次写入大小增大可以减少请求DWS的次数,但可能导致单次请求时长增加,同时也可能导致缓存的数据增加进而影响内存使用。请综合考虑DWS规格和负载, 适当调整该值。 |
场景分析
- 在分析完监控指标与日志后可以确认调优场景,以下介绍写DWS时针对不同调优场景如何使用参数调优:
- 降内存
图3 MySQL > DWS内存调优方案
- 降反压
图4 MySQL > DWS反压调优方案
- 源端binlog激增(无反压)
源端binlog文件激增时,需要及时:
- 降内存
降内存
- 减小数据缓存、提高数据flush频率。
调小“批写最大数据量”和“定时批写时间间隔”配置,及时清理Migration Sink端缓存的数据。
参数名
默认值
解释
批写最大数据量
50000
Migration Sink端缓存队列最大缓存数据量。默认达到5万条数据时触发数据flush。
定时批写时间间隔
3
Migration Sink端flush缓存数据的最大时间间隔。默认每3秒做一次数据flush。
MySQL > DWS作业通常不会存在内存问题,但是如果调大了“定时批写时间间隔”可能会导致缓存数据增大,出现内存压力,导致数据同步速率反而下降。
在追数场景,推荐配置 定时批写时间间隔= 30,批写最大数据量= 8000。
图5 配置“批写最大数据量”和“定时批写时间间隔” - 合理建表(重建表)
请参考DWS官方文档或者咨询DWS专家评估建表合理性,避免热点数据等其他建表导致的性能问题。
- 增加taskmanager堆内存。
表4 【任务配置】中添加自定义参数 参数名
默认值
解释
taskmanager.memory.process.size
<4G
taskmanager堆内存大小,建议配置为4G。
taskmanager.memory.managed.fraction
0.2
管理内存,建议配置为0。
降反压
- 加大实时作业并发,提高数据写出效率。
在【任务配置】中扩大作业处理器核数,配合sink.keyby.mode=PK参数降低数据flush频率,减少IO消耗。的使用可以加大写并发,尽可能避免写DWS成为瓶颈。
- 降低数据flush频率,减少IO消耗。
Migration写DWS单并发单批次写出数据达到5000+条时效率最佳。通过获取作业taskmanager日志,搜索关键字“data size”可以看到当前作业每次写入DWS的数据量大小。
图6 当前作业每次写入DWS的数据量大小增加【定时批写时间间隔】可以增加单批缓存的数据量,为了防止缓存数据量过大对内存造成压力,可以限制【批写最大数据量】的值,调优时间可以参考以下配置。
定时批写时间间隔 = 30
批写最大数据量 = 8000
图7 调优后日志效果 - 按主键并发写出数据。
Migration写DWS主键表性能更佳,可以通过在目的端【高级配置】填入参数sink.keyby.mode=PK让并发充分利用。
影响:开启时,DDL同步会有概率乱序,追数完毕后请及时关闭参数。
参数名
默认值
解释
sink.keyby.mode
不开启
按照主键hash值做并发写。
图8 配置方式