利用 Addax 异构迁移数据到 Databend

news2024/11/18 16:24:03

作者:邰翀

(https://github.com/TCeason) Databend 研发工程师

现在互联网应用越来越复杂,每个公司都会有多种多样的数据库。通常是用最好的硬件来跑 OLTP,甚至还在 OLTP 中进行分库分表来足业务,这样对于一些分析,聚合,排序操作非常麻烦。这也有了异构数据库的数据同步需求,今天重点给大家介绍两个利器 :异构数据迁移:Addax 结合云原生数仓 Databend 实现异构数据库数据合并及分析。

Addax (https://github.com/wgzhao/Addax) 是一个异构数据源离线同步工具,最初来源于阿里的 DataX ,致力于实现包括关系型数据库(MySQL、PostgreSQL、Oracle等)、HDFS、Hive、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。

Databend (https://github.com/datafuselabs/databend) 是一个开源、弹性、负载感知的现代云数仓库,赋能企业降本增效。在之前的文章中介绍了 如何快速部署 Databend (https://www.databend.cn/blog/deploy-databend-on-minio)。

为什么是 Addax 没有选用 Datax, 实际这次发起这个项目的原因是一个用户原来的环境中有 Clickhouse, Datax 不支持 Clickhose 读取和写入,所以我们优先支持了 Addax 这个异构迁移工具。下面我们通过一个简单练习,让你学习使用 Addax , 另外通过几个进阶案例给你展示一下 Addax 的魅力。

本文中仅以 Addax 的 mysqlreader plugin 为例进行实验,databendwriter 支持所有 Addax 提供的 reader plugin。

1. Addax 基本使用

1.1. 安装 Addax

# more info https://wgzhao.github.io/Addax/4.0.11/
wget https://github.com/wgzhao/Addax/releases/download/4.0.11/addax-4.0.11.tar.gz;
tar xvf addax-4.0.11.tar.gz;

Addax 也支持 Docker 安装 (https://github.com/wgzhao/Addax#use-docker-image)和编译安装 (https://github.com/wgzhao/Addax#compile-and-package)。

1.2. Demo (from MySQL to Databend)

在 MySQL Server 中建立迁移用户。(本例中待迁移的表为 db.tb01)

mysql> create user 'mysqlu1'@'%' identified by '123';
mysql> grant all on *.* to 'mysqlu1'@'%';
mysql> create database db;
mysql> create table db.tb01(id int, col1 varchar(10));
mysql> insert into db.tb01 values(1, 'test1'), (2, 'test2'), (3, 'test3');

在 Databend 中建立对应的表结构。(将 MySQL 的 db.tb01 数据迁移至 Databend 的 migrate_db.tb01)

databend> create database migrate_db;
databend> create table migrate_db.tb01(id int null, col1 String null);

进行如下配置后,即可开始迁移。

$ cd addax-4.0.11/bin;

$ cat <<EOF > ./mysql2databend.json
{
  "job": {
    "setting": {
      "speed": {
        "channel": 4
      }
    },
    "content": {
      "writer": {
        "name": "databendwriter",
        "parameter": {
          "preSql": [
            "truncate table @table"
          ],
          "postSql": [
          ],
          "username": "u1",
          "password": "123",
          "database": "migrate_db",
          "table": "tb01",
          "jdbcUrl": "jdbc:mysql://127.0.0.1:3307/migrate_db",
          "loadUrl": ["127.0.0.1:8000","127.0.0.1:8000"],
          "fieldDelimiter": "\\x01",
          "lineDelimiter": "\\x02",
          "column": ["*"],
          "format": "csv"
        }
      },
      "reader": {
        "name": "mysqlreader",
        "parameter": {
          "username": "mysqlu1",
          "password": "123",
          "column": [
            "*"
          ],
          "connection": [
            {
              "jdbcUrl": [
                "jdbc:mysql://127.0.0.1:3306/db"
              ],
              "driver": "com.mysql.jdbc.Driver",
              "table": [
              "tb01"
              ]
            }
          ]
        }
      }
    }
  }
}
EOF

$ ./addax.sh -L debug ./mysql2databend.json

1.3. 校验数据

databend> select * from migrate_db.tb01;
+------+-------+
| id   | col1  |
+------+-------+
|    1 | test1 |
|    2 | test2 |
|    3 | test3 |
+------+-------+

更多使用方式参见:https://wgzhao.github.io/Addax/4.0.11/writer/databendwriter/

1.4. 小结

上面的例子是通过 Addax 跑通一个表的迁移到 Databend , 通过一个简单的例子也可以感受一下 Addax 大概的流程。

但 Addax 远比这个 Demo 强大。另外 Addax 强大之处可能通过参数来控制配置文件,这样比轻松地实现一个配置迁移, 甚至可以传入 SQL 这样来读取指定区间做数据的迁移。

2. Addax 进阶使用

Addax 配置框架可以参考:https://wgzhao.github.io/Addax/4.0.11/setupJob/

如果只是使用源端和目标,这块在配置中主要需要关注:

    "content": {
      "reader": {},
      "writer": {},
  }

另外 Addax 参考了 DataX 的设计和使用习惯,对于 DataX 支持语法在 Addax 都可以使用。

下面我举几个生产中可能会用到例子,来给大家参考一下:

  • Case1: 生产中 10 张表的数据合并到 Databend 中一张表

  • Case2: 把 MySQL 中所有的表都迁移到 Databend 中

  • Case3: 指定 SQL 读取原表的数据,迁移到指定的表中

Case 1: 生产中 10 张表的数据合并到 Databend 中一张表

这个需求在生产中比较常见,需要把线上的数据汇聚一个地方进行分析, 这块正好可以利用 Databend 基于对象存储及高压缩的能力。假设源端是 MySQL 数据库, 目标端是 Databend, 下面是一个简化的配置:

      "reader": {
        "name": "mysqlreader",
         ...
          "connection": [
          ...
              "table": [
               '${dst_table}'
              ]
          ]
        },
        "writer": {
        "name": "databendwriter",
         ...
         "table":  '${src_table}',
         ...
       }

基于这配置我们需要写一个脚本来调用, 例如要迁移的前缀是 sbtest 从 1 到 10 ,最终合并为 sbtest 调用方法如下:

pre_tb="sbtest"
dst_tb="sbtest"
for t in `seq 1 10`
do
        tb=$pre_tb$t
        echo $tb
        ./bin/addax.sh ./job/my2databend.json -p "-Dsrc_table=$tb -Ddst_table=$dst_tb"
done

mysql2databend.json 配置参考:databend-workshop/mysql2databend.json at main · wubx/databend-workshop (https://github.com/wubx/databend-workshop/blob/main/addax_mysql2databend/mysql2databend.json)

Case 2: 把 MySQL 中所有的表都迁移到 Databend 中

基于上面的案例,估计大概已经明白其中的套路了。如果 MySQL 到 Databend 还可以基于上面的配置文件,只需要把要迁移的表整理成一个 list 控制。全库迁移难点在于表结构生成,对于 Databend 表结构的生成只需要字段名和类型即可。

表结构生成的脚本参考:https://github.com/wubx/databend-workshop/blob/main/addax_mysql2databend/mysql_str2databend.py

调用方法:

#python3 g_mysql.py -H MySQL_IP -P MySQL_PORT -u MySQL_User -p mysql_password -d dbname |mysql -h databend_ip -Pdatabend_port -udatabend_user dbname

python3 g_mysql.py -H 172.21.16.9 -P 3306 -u root -p vgypH8nc -d wubx |mysql -h 127.0.0.1 -P3307 -uroot wubx

定制迁移配置

      "reader": {
        "name": "mysqlreader",
         ...
          "connection": [
          ...
              "table": [
               '${src_table}'
              ]
          ]
        },
        "writer": {
        "name": "databendwriter",
         ...
         "table":  '${src_table}',
         ...
       }

调用方式

pre_tb="sbtest"
for t in `seq 1 10`
do
        tb=$pre_tb$t
        echo $tb
        ./bin/addax.sh ./job/mysql2databend.json -p "-Dsrc_table=$tb"
done

Case 3: 指定 SQL 读取原表的数据,迁移到指定的表中

这种场景适合定期小批量迁移的,但原始表里需要有时间字段,比如订单类数据迁移。这里我们要使用到 Addax 数据读取中指定 querySQL 这个特性

    "content": {
      "reader": {
        "name": "mysqlreader",
        "parameter": {
          ...
          "connection": [
            {
             "querySql": ["$DS"],
             ...
            }
          ]
        }
      },
    "writer": {
    "name": "databendwriter",
     ...
     "table":  '${DT}',
     ...
   }

调用方法:

# 利用 DS 传入读取的 SQL ,通过 DT 指定写入的表名
python3  ./bin/addax.py job/msql.json -p "-DDS='select * from sbtest1 limit 10' -DDT=sbtest"

小结

本部分通过几个案例分展示了 Addax 的数据读取能力,通过灵活的组合基本可以满足生产中的各种需求。实际使用中如果为了提速,需要调整任务的配置和 autoPK 的这个功能。另外也可以使用 Addax 和 Databend 也可以担负起数据库的归档需求。

Databend 兼容 MySQL 协议 (https://databend.rs/doc/integrations/api/mysql-handler),如果使用 Databend 做 ODS 层,又想结合原来的大数据生态使用,也可以使用 Addax 直接使用 mysql (https://wgzhao.github.io/Addax/4.0.11/reader/mysqlreader/) reader (https://wgzhao.github.io/Addax/4.0.11/reader/mysqlreader/) 插件读取 Databend 中的数据。

3. 使用中注意事项

Addax 使用中对于具体的数据库,建议多阅读官方的 reader 或是 writer 的说明,根据实际情况决定合理的配置。这里的案例中 Databend 使用的是 Streaming_load 接口进行的数据写入,如果单节点 databend-query 有压力的情况下,也可以考虑配置多个 databend-query ,Addax 也是支持多个 databend-query 写入。

以上都是参考,如果还有不能满足你的使用,或是你对 Addax 和 Databend 有进一步需求,也可以 wx 小D : Databend 约一些线上的交流。

关于 Databend

Databend 是一款开源、弹性、低成本,基于对象存储也可以做实时分析的新式数仓。期待您的关注,一起探索云原生数仓解决方案,打造新一代开源 Data Cloud。

  • Databend 文档:https://databend.rs/

  • Twitter:https://twitter.com/Datafuse_Labs

  • Slack:https://datafusecloud.slack.com/

  • Wechat:Databend

  • GitHub :https://github.com/datafuselabs/databend

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序封装wx.request请求

对微信小程序的印象我还停留在2年前刚入行的时候&#xff0c;那是还不懂什么是Promise&#xff0c;只知道小程序发请求有时候要在success回调中嵌套好多层(后来我才知道这叫回调地狱)。最近刚好有个小程序的项目交给我发开发&#xff0c;加上如今的我自认为对Promise掌握的还可…

Python接口项目实战篇(1)读取xlsx中账户密码,unittest框架实现通过requests接口post登录网站请求,JSON判断登录是否成功

Python接口项目实战篇&#xff08;1&#xff09;读取xlsx中账户密码&#xff0c;unittest框架实现通过requests接口post登录网站请求&#xff0c;JSON判断登录是否成功实现功能描述1.首先获取到接口谷歌浏览器中获取接口信息fiddler里面抓取接口信息2.创建一个xlsx文档3.导入我…

List-反向迭代器

List List接口使用 List&#xff1a;双向带头循环的链表&#xff0c;不支持随机访问&#xff0c;排序就是一个大问题 当大量的插入数据的时候就体现出了优势。 在任意位置以O(1)的时间复杂度插入数据. 只有一种遍历方式就是迭代器&#xff0c;因为他的物理结构是不连续的无…

05_xml

目录0、文档声明1.XML 简介2、xml 的作用&#xff1f;3、xml 语法3.1、文档声明3.2、xml 注释3.3、元素&#xff08;标签&#xff09;3.4、xml 属性3.5、语法规则&#xff1a;3.5.1&#xff09;所有 XML 元素都须有关闭标签&#xff08;也就是闭合&#xff09;3.5.2&#xff09…

uniapp:常用跨端业务组件(ts版本)

插件内组件包含以下功能&#xff1a; 自定义状态栏组件(ZoNavBar)上拉加载状态组件(ZoLoading)弹窗组件(ZoPopup)搜索组件(ZoSearchBar)空数据组件(ZoEmpty)tab标签组件(ZoTabs)tab下拉筛选组件(ZoSelectTabs)底部导航组件(ZoTabBar)cell导航组件(ZoCell) 10.标题内容组件(ZoT…

iptables端口复用后门、sslh

iptables端口复用 创建端口复用链 创建端口复用规则将流量转到22端口 开启开关&#xff0c;接收到一个长为1139的icmp包&#xff0c;则将来源ip添加到LETMEIN表中 如果syn包来源ip处于letmein列表中&#xff0c;则跳转到LETMEIN链处理&#xff0c;有效时间为3600秒 开启复…

c++11 标准模板(STL)(std::multiset)(五)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class multiset;(1)namespace pmr { template <class Key, class Compare std::less<Key>> usi…

PyQt5编程基础 2.2 信号与槽函数

信号与槽函数信号&#xff08;Signal&#xff09;信号是在特定情况下被发射的一种通告。举例&#xff1a;PushButton的信号是鼠标单击时发射的clicked信号槽&#xff08;Slot&#xff09;对信号相应的函数。举例&#xff1a;Qwidget有一个槽函数&#xff0c;功能是关闭窗口信号…

Uncaught SyntaxError: Unexpected token ... 【bug记录】vue项目发布

项目场景&#xff1a; 项目场景&#xff1a;部署vue项目&#xff0c;组件或页面html使用ES6语法导致&#xff0c;界面无法显示。 客户那边采用了比较低版本的浏览器&#xff0c;自己电脑上却没有出现&#xff0c;也不方便调试测试。 问题描述 打开来控制台&#xff0c;看到异…

单片机开发---ESP32S3移植NES模拟器(一)

书接上文 《单片机开发—ESP32-S3模块上手》 《单片机开发—ESP32S3移植lvgl触摸屏》 参考内容 依旧是参考韦东山老师的作品来移植的 《ESP32|爷青回&#xff01;ESP32(单片机) NES模拟器_NES游戏机掌机教程(开源详细讲解实现代码&#xff01;)》 韦老师已经将代码开源&am…

深入解读神策分析云两大闭环,助力企业全面数字化转型应用

随着市场的发展、客户的深度使用以及全新的产品认知&#xff0c;神策希望能够帮助企业客户构建拥有正向反馈、持续提升、优化经营效率的数据应用闭环。本次&#xff0c;神策在用户行为分析的基础上&#xff0c;对分析云的整体产品架构进行全面升级&#xff0c;不仅包括公私域流…

json字符带有反斜杠\处理

目录说明说明 json字符带有反斜杠\&#xff0c;需要转义处理 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-text</artifactId><version>1.6</version></dependency>String json "{\"n…

解决安装2.4版本的percona-xtrabackup和5.6版本的mysql冲突的问题

问题描述&#xff1a;在阿里云上有一个5.6版本的mysql&#xff0c;想把备份的数据恢复到本地。按照阿里云的文档描述&#xff0c;本机mysql的版本也得是5.6&#xff0c;percona-xtrabackup版本得是2.4。于是开始动手操作&#xff0c;无非是在本机安装5.6版本的mysql和2.4版本的…

【C++】C++11语法 ~ 可变参数模板

&#x1f308;欢迎来到C专栏~可变参数模板 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&…

2月3日第壹简报,星期五,农历正月十三

2月3日第壹简报&#xff0c;星期五&#xff0c;农历正月十三坚持阅读&#xff0c;静待花开1. 香港&#xff1a;将向世界各地旅客派发50万张免费机票&#xff0c;3月1日起派发&#xff0c;为期6个月&#xff0c;率先向东南亚地区送出。2. 我国新增18处国际重要湿地&#xff0c;湿…

聚观早报|网易开放暴雪游戏退款申请通道;鱼跃医疗回应被罚270万

今日要闻&#xff1a;网易开放暴雪游戏退款申请通道&#xff1b;谷歌 ChatGPT 竞品搜索设计将迎来大改&#xff1b;“鱼跃医疗”回应被罚270万元&#xff1b;大众考虑在加拿大建设新的电池工厂&#xff1b;微软将把ChatGPT整合到必应搜索中网易开放暴雪游戏退款申请通道 2 月 1…

力扣刷题|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

LeetCode 654.最大二叉树 题目链接&#x1f517; LeetCode 654.最大二叉树 思路 最大二叉树的构建过程如下&#xff1a; 构造树一般采用的是前序遍历&#xff0c;因为先构造中间节点&#xff0c;然后递归构造左子树和右子树。 class Solution {public TreeNode constructM…

构造http请求的几种方式(附源码)

文章目录前言一、form表单构造http请求二、ajax构造http请求三、Java socket构造http请求总结前言 博主个人社区&#xff1a;开发与算法学习社区 博主个人主页&#xff1a;Killing Vibe的博客 欢迎大家加入&#xff0c;一起交流学习~~ 一、form表单构造http请求 form (表单) 是…

SSH基础知识(一)

SSH基础知识SSH对称加密非对称加密如何生成秘钥如何管理秘钥不同版本ssh命令安装ssh启动ssh服务登录ssh退出ssh登录远程登录执行命令ssh参数端口转发本地转发远程转发动态转发最近有用到SFTP协议完成一些功能开发&#xff0c;这玩意和FTP比较像&#xff0c;当时以为是升级版&am…

FPGA和CPLD芯片选型介绍(二)

FPGA器件选型&#xff08;以Xilinx和Altera为例&#xff09;器件选型是件很严肃的事情&#xff0c;既要考虑性能又要兼顾成本&#xff0c;还要考虑长期供货的稳定性&#xff0c;因此很考验工程师的知识广度储备。一般而言&#xff0c;FPGA&#xff08;CPLD&#xff09;需要分三…