阿里云DTS作为数据世界高速传输通道的建造者,每周为您分享一个避坑技巧,助力数据之旅更加快捷、便利、安全。
导读
阿里云数据传输服务(Data Transmission Service,简称DTS)是一个便捷、高效的数据迁移和数据同步服务。一般而言,一个完整的DTS数据迁移任务主要包括预检查、结构迁移,全量迁移,增量迁移等阶段,其中全量迁移会将源数据库的存量数据全部迁移到目标数据库。面对各种各样的用户场景, 本文将重点介绍如何使用阿里云DTS实现全量数据迁移加速,以缩短迁移时间,确保数据迁移的效率和稳定性。
阿里云DTS全量迁移的工作原理
要对DTS全量迁移进行加速,首先要理解DTS全量迁移的工作原理。 如下图所示,DTS全量迁移主要包含三大模块:库表抓取模块,表切分模块,切片调度模块。其中库表抓取模块主要是根据 dblist 获取要迁移的库表,并从源库和目标库拉取这些表的表结构。表切分模块用于将每个表按照一定的大小切分成固定大小的切片。切片调度模块会启动若干source线程从源库拉取切片对应的数据, 放到DTS内部的内存队列中,并启动若干sink线程从内存队列中拉取切片对应的数据,写入到目标库中。然后在数
定位全量迁移慢的原因
根据服务数千客户的经验,大部分客户全量迁移较慢的原因为以下几点:
- 用户认为全量慢,实际任务正常,只是用户数据量大,希望进行加速。
- 任务实际上已经报错,但是因为在重试,任务并未失败,全量进度也停止了推进。用户误以为是全量慢。
- 用户任务由于一些特殊场景,比如说大字段,目标端rt高等导致全量迁移速率不符合预期。
针对第一类问题,下文会介绍一些常见全量迁移加速方法,用户可根据这些方法进行尝试,而对于第二类问题,由于任务已经失败,用户一方面可以等任务停止重试后根据控制台上报错提示来采取相应的策略恢复任务,另外一方面可以提交工单找值班同学进行处理。针对第三类问题,我们需要先根据DTS任务日志,数据库状态等资源定位出导致全量慢的原因,再针对性的采取加速策略。
根据上面介绍的全量迁移原理, 全量迁移主要包括拉取库表结构,切片,从源库拉数据,向目标端写数据等步骤。导致全量慢的原因也可以从这四个方面进行分析。
拉表结构慢
一般而言,拉表结构都不会慢,但是也有例外。为了加速拉取表结构的速度, 目前DTS拉取库表结构是从information_schema 的相关视图中批量获取的。 但是当遇到需要迁移的表数量过大时,比如说达到几十万的量级,DTS执行这个批量拉取表结构的SQL时可能会卡住。这种case目前只能提工单,由DTS值班同学切换成 单个表获取表结构的方式。
切片慢
切片慢的原因是DTS 执行获取切片左右边界的sql时比较慢。常见的场景是用户配置任务时配置了过滤器,以实现只迁移满足条件的数据到目标端。DTS 切片时,会把这个过滤条件添加到切片sql的where条件中, 从而导致切片sql 的执行计划改变从而慢。如下所示, 用户希望只迁移2023年之后的数据, 切片SQL执行时先按照主键做排序(order by), 然后直接在主键上按顺序扫描,直到create_time>='2023-01-01 00:00:00的条数达到1000。由于create_time>='2023-01-01 00:00:00的分布都比较靠后,所以接近全表扫描,导致切片SQL执行慢。这种case目前也只能提工单,由DTS值班同学切换成切片时不加过滤条件的方式。
拉数据慢
拉数据慢的原因很多,比如说源库是自建库,源端RT较高, 再比如说表结构中有大字段(指text, longtext, blob等类型字段),都可能导致dts 从源库拉数据的sql执行时间较长。我们可以通过在DTS服务器上连接源库,在源库执行一些简单的sql, 根据sql的执行时间来大致判断源端的RT。 如果是网络原因导致的RT高,可找用户提高专线带宽,或者找网络同学排查具体网络问题。 如果是数据库原因导致的RT高,则需要数据库的相关值班同学介入调查。如果源库表结构中存在大字段,可适当调整切片大小和每批写入目标端的记录数大小,可通过观察全量迁移的RPS或者BPS指标多次尝试调整,目标就是在保证拉数据sql能执行得动以及全量不发生OOM的前提下,尽可能使全量迁移的bps或者rps更高。
写数据慢
写数据慢的场景比较常见,有可能是数据库的原因,也有可能是网络的原因,也有可能是DTS在特定场景下的默认参数设置不合理。一方面我们可以通过numen上的任务进程页面知道sink线程执行SQL的时间, 另外一方面也可以通过观察DTS日志知道DTS写一个bach需要的时间。根据sink sql执行时间,可以判断是否是写数据慢导致的全量迁移慢。如果确定是写数据慢,一方面可以对目标库做一些检查,比如说磁盘空间是否已满,目标库写入是否达到了性能瓶颈,目标端的RT,目标端是否存在锁表,表结构是否是宽表等等。另外一方面,可以参考如下的全量迁移加速方法,通过观察全量迁移的RPS或者BPS指标进行多次尝试调整。
全量迁移加速方法
根据以往的值班经验,可以尝试使用如下全量加速方法进行调整:
- 如果是filter导致的切片慢,需要找值班同学切换成切片sql不加过滤条件的方式。
- 当未迁移的表较少时, 可以将source.polling.schema.max.missed.times 设置为1减少负载均衡的等待。
- 如果任务卡在切片,但是单个切片执行较快, 可提高切片线程数 dts.datamove.record.blasters 。
- 在batch模式时,可以尝试提高读写线程数和单个batch的大小来提升全量迁移速度:
- 读线程数:dts.datamove.record.pumper.readers
- 写线程数:sink.task.number
- batch的最小值 :dts.datamove.record.batch.size.min
- batch的最大值:dts.datamove.record.batch.size.max
- 在bulkcopy模式时,可以尝试提高mysql.bulk.copy.rows.per.transaction 参数来提升每次load data的数量。
- 在DTS任务受到规格限制时, 可以尝试提高全量任务的内存大小和cpulimit, 来提升全量迁移速度。
- 在一些全量极致加速的场景,可以把DTS任务切换到高规格的oxs机器,速度会比vpc机器更快。
快来关注
- 数据传输服务(Data Transmission Service,简称DTS)支持关系型数据库、NoSQL、大数据(OLAP)等数据源,集数据迁移、订阅、实时同步、校验功能于一体,能够解决公共云、混合云场景下,远距离、秒级异步数据传输难题。其底层基础设施采用阿里双11异地多活架构,为数千下游应用提供实时数据流,已在线上稳定运行7年之久,是一款沉淀了丰富实践经验的可靠产品。点击了解更多DTS相关信息
- 欢迎加入钉群讨论交流: