16

Go Dumpling!让导出数据更容易

 3 years ago
source link: https://segmentfault.com/a/1190000023879506
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

作者介绍:李淳竹(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-seperator

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

作为 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 参数开启表内并发。

AVFjQvV.png!mobile

NreeYjf.png!mobile

可以看出目前 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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK