Go Dumpling!让导出数据更容易
作者介绍:李淳竹(lichunzhu),TiDB 研发工程师。
Tools SIG Community:主要涵盖 TiDB 数据处理工具,包含 TiDB 数据备份/导入导出,TiDB 数据变更捕获,其他数据库数据迁移至 TiDB 等。
Dumpling 是由 Go 语言编写的用于对数据库进行数据导出的工具。目前支持 MySQL 协议的数据库,并且针对 TiDB 的特性进行了优化。Dumpling 的主要特点包括:
1. 适配 Mydumper,轻松上手。
2. Go 语言编写,定制开发简单。
- 自定义导出过滤条件;
- 多种导出格式。目前支持 SQL、CSV 格式的导出;
- 多种目标源。目前支持本地盘,S3/GCS 正在开发中;
- 未来计划支持导出多种数据库源。
Go 语言支持
给 Mydumper 贡献代码没有那么容易。主要原因如下:
- Mydumper 由 C 编写,相比起来编译与准备环境要更为复杂。
- Mydumper 调试不太方便,这也不利于在发现问题后查错。
- C 语言更难做抽象化,定制化功能困难。
- 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。
- 这些行业的饭碗要被机器人抢了 再不努力就被它们PK掉了!
- DeveWork.com 上线“前端工具箱”(附源码下载)
- Debug和Release之本质区别
- ArgoUML -- 开源UML 建模工具
- 性能分析工具-PerfView
- c#测试字符串是否为GUID的几种方法
- 编译错误CS1595
- 分享一款带尖角浮出 公告栏 样式
- 在asp.net页面上得到Castle容器的实例
- WordPress自带TinyMCE编辑器相关功能增强
- 联众互动收购3家棋牌游戏公司,其域名买自蔡文胜手中
- 未来有什么工作绝对不会被人工智能取代
- WordPress在RSS Feed 中输出版权信息
- WordPress免插件仅代码实现文章浏览次数的方法(2)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Angularjs动态加载ECharts(一)
- NodeMCU连接wifi语句报错:“stdin:1: bad argument #1 to 'config' (config table not found!)”
- Angularjs动态加载ECharts(二)
- 【LeetCode】每日一题(8.3)
- LeetCode精选好题(四)
- 【Android 直播软件开发:音视频硬解码篇】
- 知更鸟主题修改CSS:让凌乱的标签变得整洁清爽
- 浅谈 Android Dex 文件
- Tcp连接建立与连接释放
- Python Django开发 异常及解决办法(三)
- 有赞零售小票打印跨平台解决方案
- Angular [(ngModel)]的ng-dirty设置时机
- 有赞订单导出的配置化实践
- k2路由器刷系统
- 使用Seq搭建免费的日志服务