
# MySQL到DWS参数调优
#### 源端优化
MySQL抽取优化。
可通过在作业任务配置参数单击中"添加自定义属性"来新增MySQL同步参数。
图1添加自定义属性   
![](https://support.huaweicloud.com/usermanual-dataartsstudio/zh-cn_image_0000002096006468.png "点击放大")
可使用的调优参数具体如下：
表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无法有效限制内存占用时，考虑显式设置该值来限制缓存数据的大小。 |
   
#### 目的端优化
DWS写入优化。
可通过在DWS的目的端配置中修改写入相关配置，且可以通过单击高级配置的"查看编辑"按钮，添加高级属性。
图2添加高级属性   
![](https://support.huaweicloud.com/usermanual-dataartsstudio/zh-cn_image_0000002131638381.png "点击放大")
表3DWS写入优化参数 
| 参数名                        | 类型   | 默认值    | 说明                                                                                                                                                                                                                                                                                                                                                        |
|:---|:---|:---|:---|
| 写入模式                       | enum | UPSERT | DWS的写入模式，可在目的端配置中设置，实时处理集成作业推荐使用COPY MODE。 - UPSERT：为批量更新入库模式。  - COPY：为DWS专有的高性能批量入库模式。   |
| 批写最大数据量                    | int  | 50000  | DWS单次写入的最大条数，可在目的端配置中设置。 当缓存的数据达到"批写最大数据量"和"定时批写时间间隔"之一的条件时，触发数据写入。 单次写入条数增大可以减少请求DWS的次数，但可能导致单次请求时长增加，同时也可能导致缓存的数据增加进而影响内存使用。请综合考虑DWS规格和负载， 适当调整该值。                                                                                                                       |
| 定时批写时间间隔                   | int  | 3      | DWS单次写入的时间间隔，可在目的端配置中设置。 当缓存的数据达到定时批写时间间隔的条件，触发数据写入。 增大该值有助于增加单次写入时缓存的数据条数，但由于写入频率降低，会提升DWS数据可见的时延。                                                                                                                                                                     |
| sink.buffer-flush.max-size | int  | 512    | DWS单次写入的数据大小，默认为512MB，可在目的端配置的高级配置中设置。 当缓存的数据达到数据大小限制时，触发数据写入。 与批写最大数据量类似，单次写入大小增大可以减少请求DWS的次数，但可能导致单次请求时长增加，同时也可能导致缓存的数据增加进而影响内存使用。请综合考虑DWS规格和负载， 适当调整该值。                                                                                                              |
   
#### 场景分析
- 在分析完监控指标与日志后可以确认调优场景，以下介绍写DWS时针对不同调优场景如何使用参数调优：
  - **降内存**
    图3MySQL \> DWS内存调优方案   
    ![](https://support.huaweicloud.com/usermanual-dataartsstudio/zh-cn_image_0000002335355080.png "点击放大")
    - [减小数据缓存、提高数据flush频率。]
    
    - [合理建表（重建表）]
    
    - [增加taskmanager堆内存。]
     
  
  - **降反压**
    图4MySQL \> DWS反压调优方案   
    ![](https://support.huaweicloud.com/usermanual-dataartsstudio/zh-cn_image_0000002369114813.png "点击放大")
    - [加大实时作业并发，提高数据写出效率。]
    
    - [降低数据flush频率，减少IO消耗。]
    
    - [按主键并发写出数据。]
     
  
  - **源端binlog激增（无反压）**
    源端binlog文件激增时，需要及时：
    - 调大实时作业并发，避免目的端写出成为瓶颈，反压源端抽取。
    
    - 调大taskmanager堆内存，避免数据量过大时打爆作业。 在任务配置中添加参数：
      taskmanager.memory.managed.fraction = 0（默认0.2）
      taskmanager.memory.process.size = 4G（默认不足4G）
      
    
    - 必要时果断将时延较大的表从实时作业中拆分出去，通过离线迁移完成大表的数据迁移。
     
   
 
#### 降内存
- **减小数据缓存、提高数据flush频率。**
  调小"批写最大数据量"和"定时批写时间间隔"配置，及时清理Migration Sink端缓存的数据。
  表4参数配置 
  | 参数名      | 默认值   | 解释                                               |
  |:---|:---|:---|
  | 批写最大数据量  | 50000 | Migration Sink端缓存队列最大缓存数据量。默认达到5万条数据时触发数据flush。  |
  | 定时批写时间间隔 | 3     | Migration Sink端flush缓存数据的最大时间间隔。默认每3秒做一次数据flush。 |
     
  MySQL \> DWS作业通常不会存在内存问题，但是如果调大了"定时批写时间间隔"可能会导致缓存数据增大，出现内存压力，导致数据同步速率反而下降。
  在追数场景，推荐配置 定时批写时间间隔= 30，批写最大数据量= 8000。
  图5配置"批写最大数据量"和"定时批写时间间隔"   
  ![](https://support.huaweicloud.com/usermanual-dataartsstudio/zh-cn_image_0000002369170909.png "点击放大") 
- **合理建表（重建表）**
  请参考DWS官方文档或者咨询DWS专家评估建表合理性，避免热点数据等其他建表导致的性能问题。
  
- **增加taskmanager堆内存** 。
  表5【任务配置】中添加自定义参数 
  | 参数名                                 | 默认值  | 解释                        |
  |:---|:---|:---|
  | 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的数据量大小   
  ![](https://support.huaweicloud.com/usermanual-dataartsstudio/zh-cn_image_0000002369011029.png "点击放大")
  增加【定时批写时间间隔】可以增加单批缓存的数据量，为了防止缓存数据量过大对内存造成压力，可以限制【批写最大数据量】的值，调优时间可以参考以下配置。
  定时批写时间间隔 = 30
  批写最大数据量 = 8000
  图7调优后日志效果   
  ![](https://support.huaweicloud.com/usermanual-dataartsstudio/zh-cn_image_0000002335172882.png "点击放大") 
- **按主键并发写出数据** 。
  Migration写DWS主键表性能更佳，可以通过在目的端【高级配置】填入参数sink.keyby.mode=PK让并发充分利用。
  影响：开启时，DDL同步会有概率乱序，追数完毕后请及时关闭参数。
  表6参数配置 
  | 参数名             | 默认值 | 解释             |
  |:---|:---|:---|
  | sink.keyby.mode | 不开启 | 按照主键hash值做并发写。 |
     
  图8配置方式   
  ![](https://support.huaweicloud.com/usermanual-dataartsstudio/zh-cn_image_0000002335332646.png "点击放大") 
 
