前言 我们公司有个项目的数据量高达五千万,但是因为报表那块数据不太准确,业务库和报表库又是跨库操作,所以并不能使用 sql 来进行同步。当时的打算是通过 mysqldump 或者存储的方式来进行同步,但是尝试后发现这些方案都不切实际:
mysqldump:不仅备份需要时间,同步也需要时间,而且在备份的过程,可能还会有数据产出(也就是说同步等于没同步)
存储方式:这个效率太慢了,要是数据量少还好,我们使用这个方式的时候,三个小时才同步两千条数据…
后面在网上查看后,发现 datax 这个工具用来同步不仅速度快,而且同步的数据量基本上也相差无几。
一、datax 简介 datax 是阿里云 dataworks 数据集成 的开源版本,主要就是用于实现数据间的离线同步。 datax 致力于实现包括关系型数据库(mysql、oracle 等)、hdfs、hive、odps、hbase、ftp 等 各种异构数据源(即不同的数据库) 间稳定高效的数据同步功能。
为了 解决异构数据源同步问题,datax 将复杂的网状同步链路变成了星型数据链路 ,datax 作为中间传输载体负责连接各种数据源; 当需要接入一个新的数据源时,只需要将此数据源对接到 datax,便能跟已有的数据源作为无缝数据同步。 1.datax3.0 框架设计 datax 采用 framework + plugin 架构,将数据源读取和写入抽象称为 reader/writer 插件,纳入到整个同步框架中。
角色 作用
reader(采集模块) 负责采集数据源的数据,将数据发送给 framework。
writer(写入模块) 负责不断向 framework 中取数据,并将数据写入到目的端。
framework(中间商) 负责连接 reader 和 writer,作为两者的数据传输通道,并处理缓冲,流控,并发,数据转换等核心技术问题。
2.datax3.0 核心架构 datax 完成单个数据同步的作业,我们称为 job,datax 接收到一个 job 后,将启动一个进程来完成整个作业同步过程。datax job 模块是单个作业的中枢管理节点,承担了数据清理、子任务切分、taskgroup 管理等功能。
datax job 启动后,会根据不同源端的切分策略,将 job 切分成多个小的 task (子任务),以便于并发执行。 接着 datax job 会调用 scheduler 模块,根据配置的并发数量,将拆分成的 task 重新组合,组装成 taskgroup(任务组) 每一个 task 都由 taskgroup 负责启动,task 启动后,会固定启动 reader --> channel --> writer 线程来完成任务同步工作。 datax 作业运行启动后,job 会对 taskgroup 进行监控操作,等待所有 taskgroup 完成后,job 便会成功退出(异常退出时 值非 0 ) datax 调度过程:
首先 datax job 模块会根据分库分表切分成若干个 task,然后根据用户配置并发数,来计算需要分配多少个 taskgroup; 计算过程:task / channel = taskgroup,最后由 taskgroup 根据分配好的并发数来运行 task(任务) 二、使用 datax 实现数据同步 准备工作:
jdk(1.8 以上,推荐 1.8) python(2,3 版本都可以) apache maven 3.x(compile datax)(手动打包使用,使用 tar 包方式不需要安装) 主机名 操作系统 ip 地址 软件包
mysql-1 centos 7.4 192.168.1.1 jdk-8u181-linux-x64.tar.gz datax.tar.gz
mysql-2 centos 7.4 192.168.1.2
安装 jdk:
下载地址:https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html(需要创建 oracle 账号)
[root@mysql-1 ~]# lsanaconda-ks.cfg jdk-8u181-linux-x64.tar.gz[root@mysql-1 ~]# tar zxf jdk-8u181-linux-x64.tar.gz [root@datax ~]# lsanaconda-ks.cfg jdk1.8.0_181 jdk-8u181-linux-x64.tar.gz[root@mysql-1 ~]# mv jdk1.8.0_181 /usr/local/java[root@mysql-1 ~]# cat /etc/profileexport java_home=/usr/local/javaexport path=$path:$java_home/binend[root@mysql-1 ~]# source /etc/profile[root@mysql-1 ~]# java -version 因为 centos 7 上自带 python 2.7 的软件包,所以不需要进行安装。 1.linux 上安装 datax 软件 [root@mysql-1 ~]# wget http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz[root@mysql-1 ~]# tar zxf datax.tar.gz -c /usr/local/[root@mysql-1 ~]# rm -rf /usr/local/datax/plugin/*/._* # 需要删除隐藏文件 (重要) 当未删除时,可能会输出:[/usr/local/datax/plugin/reader/._drdsreader/plugin.json] 不存在. 请检查您的配置文件. 验证:
[root@mysql-1 ~]# cd /usr/local/datax/bin[root@mysql-1 ~]# python datax.py ../job/job.json # 用来验证是否安装成功 输出:
2021-12-13 1928.828 [job-0] info jobcontainer - perftrace not enable!2021-12-13 1928.829 [job-0] info standalonejobcontainercommunicator - total 100000 records, 2600000 bytes | speed 253.91kb/s, 10000 records/s | error 0 records, 0 bytes | all task waitwritertime 0.060s | all task waitreadertime 0.068s | percentage 100.00%2021-12-13 1928.829 [job-0] info jobcontainer - 任务启动时刻 : 2021-12-13 1918任务结束时刻 : 2021-12-13 1928任务总计耗时 : 10s任务平均流量 : 253.91kb/s记录写入速度 : 10000rec/s读出记录总数 : 100000读写失败总数 : 0 2.datax 基本使用 查看 streamreader --> streamwriter 的模板:
[root@mysql-1 ~]# python /usr/local/datax/bin/datax.py -r streamreader -w streamwriter 输出:
datax (datax-opensource-3.0), from alibaba !copyright (c) 2010-2017, alibaba group. all rights reserved.please refer to the streamreader document: https://github.com/alibaba/datax/blob/master/streamreader/doc/streamreader.md please refer to the streamwriter document: https://github.com/alibaba/datax/blob/master/streamwriter/doc/streamwriter.md please save the following configuration as a json file and use python {datax_home}/bin/datax.py {json_file_name}.json to run the job.{ job: { content: [ { reader: { name: streamreader, parameter: { column: [], slicerecordcount: } }, writer: { name: streamwriter, parameter: { encoding: , print: true } } } ], setting: { speed: { channel: } } }} 根据模板编写 json 文件
[root@mysql-1 ~]# cat create database `course-study`;query ok, 1 row affected (0.00 sec)mariadb [(none)]> create table `course-study`.t_member(id int,name varchar(20),email varchar(30));query ok, 0 rows affected (0.00 sec)
因为是使用 datax 程序进行同步的,所以需要在双方的数据库上开放权限:
grant all privileges on *.* to root@'%' identified by '123123';flush privileges; 2)创建存储过程:
delimiter $$create procedure test()begindeclare a int default 1;while (a < 3000000)doinsert into `course-study`.t_member values(a,concat(lisa,a),concat(lisa,a,@163.com));set a = a + 1;end while;end $$delimiter ;
3)调用存储过程(在数据源配置,验证同步使用):
call test(); 4.通过 datax 实 mysql 数据同步 1)生成 mysql 到 mysql 同步的模板:
[root@mysql-1 ~]# python /usr/local/datax/bin/datax.py -r mysqlreader -w mysqlwriter{ job: { content: [ { reader: { name: mysqlreader, # 读取端 parameter: { column: [], # 需要同步的列 (* 表示所有的列) connection: [ { jdbcurl: [], # 连接信息 table: [] # 连接表 } ], password: , # 连接用户 username: , # 连接密码 where: # 描述筛选条件 } }, writer: { name: mysqlwriter, # 写入端 parameter: { column: [], # 需要同步的列 connection: [ { jdbcurl: , # 连接信息 table: [] # 连接表 } ], password: , # 连接密码 presql: [], # 同步前. 要做的事 session: [], username: , # 连接用户 writemode: # 操作类型 } } } ], setting: { speed: { channel: # 指定并发数 } } }} 2)编写 json 文件:
[root@mysql-1 ~]# vim install.json{ job: { content: [ { reader: { name: mysqlreader, parameter: { username: root, password: 123123, column: [*], splitpk: id, connection: [ { jdbcurl: [ jdbc//192.168.1.1:3306/course-study?useunicode=true&characterencoding=utf8 ], table: [t_member] } ] } }, writer: { name: mysqlwriter, parameter: { column: [*], connection: [ { jdbcurl: jdbc//192.168.1.2:3306/course-study?useunicode=true&characterencoding=utf8, table: [t_member] } ], password: 123123, presql: [ truncate t_member ], session: [ set session sql_mode='ansi' ], username: root, writemode: insert } } } ], setting: { speed: { channel: 5 } } }} 3)验证
[root@mysql-1 ~]# python /usr/local/datax/bin/datax.py install.json 输出:
2021-12-15 1615.120 [job-0] info jobcontainer - perftrace not enable!2021-12-15 1615.120 [job-0] info standalonejobcontainercommunicator - total 2999999 records, 107666651 bytes | speed 2.57mb/s, 74999 records/s | error 0 records, 0 bytes | all task waitwritertime 82.173s | all task waitreadertime 75.722s | percentage 100.00%2021-12-15 1615.124 [job-0] info jobcontainer - 任务启动时刻 : 2021-12-15 1632任务结束时刻 : 2021-12-15 1615任务总计耗时 : 42s任务平均流量 : 2.57mb/s记录写入速度 : 74999rec/s读出记录总数 : 2999999读写失败总数 : 0 你们可以在目的数据库进行查看,是否同步完成。
上面的方式相当于是完全同步,但是当数据量较大时,同步的时候被中断,是件很痛苦的事情; 所以在有些情况下,增量同步还是蛮重要的。 5.使用 datax 进行增量同步 使用 datax 进行全量同步和增量同步的唯一区别就是:增量同步需要使用 where 进行条件筛选。 (即,同步筛选后的 sql)
1)编写 json 文件:
[root@mysql-1 ~]# vim where.json{ job: { content: [ { reader: { name: mysqlreader, parameter: { username: root, password: 123123, column: [*], splitpk: id, where: id 1888 and id <= 2888 # 通过条件筛选来进行增量同步同时需要将我上面的 presql 删除(因为我上面做的操作时 truncate 表)
图片
检测心脏病患者的低成本生物传感器
OPPO启动引力计划将以用户为中心带来5G+万物互融的世界
uln2003资料,ULN2003中文资料详解
分析加密监管行业的现状及未来趋势
智能机器人如何帮助老年人独立生活
阿里又开源一款数据同步工具DataX,稳定又高效,好用到爆!
无源音箱怎么配功放_无源音箱怎么改成有源音箱
双11哪款笔记本值得买华为MateBookX2021不容错过
松下AW-UE160摄像机与SRT协议的兼容性
嵌入式组合控制直线一级倒立摆系统
莱迪思发ECP5 FPGA产品系列 适用于众多应用
电子可靠性技术:最坏情况分析方法
Mavic卖得太好 大疆首度回应延迟发货是因订单太多
第四季度苹果成为全球最大的智能手机制造商
基于stm32的mcu和pc的usb通讯技术
浅析空中航母的挑战有哪些
眼球追踪技术是VR下一个突破口?
苹果关闭iOS/iPadOS 13.2.3验证通道
碳罐电磁阀多久换一次_怎么判断碳罐是否堵塞
什么是字符串