更新时间:2025-08-27 GMT+08:00
分享

MySQL到Doris参数调优

源端优化

MySQL抽取优化。

可通过在作业任务配置参数单击中“添加自定义属性”来新增MySQL同步参数。

图1 添加自定义属性

可使用的调优参数具体如下:

表1 全量阶段优化参数

参数名

类型

默认值

说明

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异常时,考虑增大该值。

表2 增量阶段优化参数

参数名

类型

默认值

说明

debezium.max.queue.size

int

8192

数据缓存队列条数,默认为8192,当源表中单条数据过大时(如1MB),缓存过多数据会导致内存溢出,可以考虑减小该值。

debezium.max.queue.size.in.bytes

int

0

数据缓存队列大小,默认为0,即表示缓存队列不考虑数据大小,只按照数据条数计算。在debezium.max.queue.size无法有效限制内存占用时,考虑显式设置该值来限制缓存数据的大小。

目的端优化

可通过在Doris的目的端配置中修改写入相关配置,且可以通过单击高级配置的“查看编辑”按钮,添加高级属性。

图2 添加高级属性
表3 Doris写入优化参数

参数名

类型

默认值

单位

说明

sink.properties.format

string

json

-

Stream Load 使用的数据格式,可选择json/csv,使用csv写入格式并配套压缩参数,可提升写入速率,不建议在如下doris版本使用csv写入,如 1.2, 2.0.x(x<14),2.1.x(x<6), 3.0.x(x<1),存在开源问题可能会导致用csv写特殊字符异常。

sink.properties.Content-Encoding

string

-

-

HTTP头部消息体压缩格式,目前只支持 CSV 文件的压缩,支持gzip。

sink.properties.compress_type

string

-

-

文件的压缩格式,目前只支持 CSV 文件的压缩。支持 gz, lzo, bz2, lz4, lzop, deflate 压缩格式。

doris.sink.flush.tasks

int

1

-

单个taskmanager的flush并发数,在资源充足情况下可以适当提高该值提升写入速率。

sink.batch.interval

string

1s

h/min/s

异步线程写入数据的时间间隔,在源端数据量较大时可增加该值,如30s,减少与数据库的I/O。

sink.batch.size

int

20000

-

单次写(插入、更新、删除)数据的最大行数,在源端数据量较大时可增加该值,如50000,减少与数据库的I/O。

sink.batch.bytes

int

10485760

bytes

单次写(插入、更新、删除)数据的最大字节数,在源端数据量较大时可增加该值,如50485760,减少与数据库的I/O。

场景分析

降内存

  • 减小数据缓存、提高数据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 配置方式

相关文档