Go Dumpling!让导出数据更容易

avatar
@http://pingcap.com

作者介绍:李淳竹(lichunzhu),TiDB 研发工程师。

Tools SIG Community:主要涵盖 TiDB 数据处理工具,包含 TiDB 数据备份/导入导出,TiDB 数据变更捕获,其他数据库数据迁移至 TiDB 等。

Dumpling 是由 Go 语言编写的用于对数据库进行数据导出的工具。目前支持 MySQL 协议的数据库,并且针对 TiDB 的特性进行了优化。Dumpling 的主要特点包括:

1. 适配 Mydumper,轻松上手。

2. Go 语言编写,定制开发简单。

  • 自定义导出过滤条件;

  • 多种导出格式。目前支持 SQL、CSV 格式的导出;

  • 多种目标源。目前支持本地盘,S3/GCS 正在开发中;

  • 未来计划支持导出多种数据库源。

Go 语言支持

给 Mydumper 贡献代码没有那么容易。主要原因如下:

  1. Mydumper 由 C 编写,相比起来编译与准备环境要更为复杂。

  2. Mydumper 调试不太方便,这也不利于在发现问题后查错。

  3. C 语言更难做抽象化,定制化功能困难。

  4. Mydumper repo 没有单元测试与集成测试,只能手动验证功能是否正确。

而 Dumpling 由 Go 语言实现,非常易于维护。 Go 生态有非常丰富的扩展包,这使得在 Dumpling 上实现添加新功能更加容易。同时 Go 语言方便的包管理系统与调试机制也更方便用户编译自己定制化的 Dumpling binary 并且调试功能,Dumpling 的单元测试与集成测试与 Go 简单的测试编写机制也可以帮助用户更容易地验证功能是否正确。

Mydumper 参数适配

Dumpling 适配了 Mydumper 的常用参数,这使得 Mydumper 用户迁移到 Dumpling 的学习成本非常低。 同时 Dumpling 还对其中部分参数进行了改善,比如:

  • -B 参数支持了导出多个数据库,而 Mydumper 只支持指定一个数据库。

  • 将 Mydumper -x 参数改为用 table-filter -f 参数,原先要筛选库表用户必须手写规则为一条复杂的正则表达式,而 table-filter 类似 .gitignore 语法,更容易筛选库表。

更多 Dumpling 参数的详细使用可以阅读 Dumpling 参数表。如果是暂时没有支持的 Mydumper 参数或者有想到方便实用的参数,也欢迎大家在Dumpling Repo中提出 PR 或者 issue。此外 Go 语言新增参数功能非常容易,这也是大家参与开发开源项目一个很好的切入点。

CSV 导出定制

Dumpling 支持通过制定 filetype = xx 导出 csv 文件,通过配置相关的参数也可以定制化 csv 的输出格式,例如:

  • 使用 csv-null-value 指定 csv 中空值的表示

  • 使用 csv-seperator 指定 csv 中各列数据的分隔符

详细配置说明参考使用文档

作为 Library 被集成

Dumpling 支持作为 Library 被其他包所集成。Go 应用开发者可以在定义好导出配置文件 export.Config 后运行 export.Dump 函数即可。这也使得开发者可以在不需要调用外部工具,不需要额外编写代码的情况下实现数据库逻辑导出功能的集成。TiDB-DM 项目正是采用这种方式集成了 Dumpling。

性能对比

为了比较 Dumpling 和 Mydumper 的性能差异,我们在一台 2 物理 CPU (Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz) 的机器上进行了导出测试,导出单个数据量大小为 87G,约 20 亿行的大表。测试了五种导出参数下的导出耗时与消耗系统资源情况,包括:

  • mydumper: 单线程,使用 -F 256MB 参数;

  • dumpling: 单线程,使用 -F 256MB 参数;

  • mydumper 8 线程:八线程,使用 -t 8 -r 500000 参数开启表内并发;

  • dumpling 8 线程:八线程,使用 -t 8 -r 500000 参数开启表内并发。

可以看出目前 Dumpling 实验分支的 Dumpling 时间可以达到 Mydumper 的水平。值得注意的是,相比起 Mydumper,Go 语言的 profile 功能也使得我们更加容易排查和优化 Dumpling 的性能问题。我们也将在后续持续改进 Dumpling 的性能问题,提高导出速度。

Dumpling 后续开发计划

以下为 Dumpling 后续开发的一些计划与设想,也欢迎大家在 Dumpling Repo 一起交流讨论,参与开发。让我们一起让导出数据更加容易!

支持并行导出主键分布不均匀的数据(issue#75)

目前 Mydumper 和 Dumpling 都可以通过指定 rows 参数开启表内并发,从而优化导出单个大数据表时的导出效率。它们的划分方式都是将表按照表的整数主键的从最小到最大划分为 count/rows 个区块再导出,然而这样的方式在数据的主键比较分散时导出效果会很差。尤其是 TiDB 4.0 后,开启了 auto-random 的数据表的主键将会更加离散,这势必引起数据块分布不均匀从而影响导出效率。

Dumpling 可以在开启 chunk-by-region 选项后,通过 TiDB regions 的数据信息来按照 region 划分导出数据的区块,从而使数据块中数据分布更加均匀,进而提高导出的效率。该优化目前已有 PR。

支持导出到 S3、GCS 等云盘(issue#8)

Dumpling 计划在 TiDB 5.0 前支持直接导出数据到云盘,从而方便云上部署使用。

支持导出更多种类的源数据库(issue#11)

一般来说,只要需要支持的数据库有对应的 database driver 或 client,比如 Oracle 数据库的 golang driver godror,我们都可以轻微改造导出语句和调用的 Go 代码库后就实现该数据库的导出支持。这里也欢迎社区的小伙伴们参与,帮助 Dumpling 支持导出更多类型的数据库。

欢迎通过 Slack 联系我们channel #sig-tools in the tidbcommunity slack workspace, you can join this channel through this invitation link