DataX以及增量同步

目录

  • 第一部分:DataX
    • 一、DataX基本知识
    • 二、DataX应用
    • 三、DataX安装测试
    • 四、DataX性能调优
    • 五、DataX源码编译问题整理
    • 六、datax增量同步
  • 第二部分:增量同步
    • 一、数据库增量同步数据思路
    • 二、数据同步工具 Otter
      • 1. Canal
      • 2. Otter能解决什么问题
    • 三、Otter与Datax区别
    • 四、SymmetricDS
    • 五、Otter和SymmetricDS
  • 参考

第一部分:DataX

DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台。

一、DataX基本知识

Alibaba DataX调研使用
https://blog.csdn.net/aWDac/article/details/80822233
[推荐]DataX实战应用
https://blog.csdn.net/u010429286/article/details/82356121
DataX使用指南
参考URL: https://yq.aliyun.com/articles/71063

DataX是由Alibaba开源的一款异构数据同步工具,可以在常见的各种数据源之间进行同步,并仅依赖Java环境,具有轻量、插件式、方便等优点,可以快速完成同步任务。一般公司的数据同步任务,基本可以满足。

DataX是一个高可用的数据同步工具,稳定性强,速度快,上手快。

参考DataX的官方说明
User Guide
https://github.com/alibaba/DataX/blob/master/userGuid.md
DataX-Introduction
https://github.com/alibaba/DataX/blob/master/introduction.md
插件开发宝典
https://github.com/alibaba/DataX/blob/master/dataxPluginDev.md

运行原理介绍:

  1. DataX完成单个数据同步的作业,我们称之为Job,DataX接受到一个Job之后,将启动一个进程来完成整个作业同步过程。DataX Job模块是单个作业的中枢管理节点,承担了数据清理、子任务切分(将单一作业计算转化为多个子Task)、TaskGroup管理等功能。
  2. DataXJob启动后,会根据不同的源端切分策略,将Job切分成多个小的Task(子任务),以便于并发执行。Task便是DataX作业的最小单元,每一个Task都会负责一部分数据的同步工作。
  3. 切分多个Task之后,DataX Job会调用Scheduler模块,根据配置的并发数据量,将拆分成的Task重新组合,组装成TaskGroup(任务组)。每一个TaskGroup负责以一定的并发(可在json配置文件中配置)运行完毕分配好的所有Task,默认单个任务组的并发数量为5。
  4. 每一个Task都由TaskGroup负责启动,Task启动后,会固定启动Reader—>Channel—>Writer的线程来完成任务同步工作。
  5. DataX作业运行起来之后, Job监控并等待多个TaskGroup模块任务完成,等待所有TaskGroup任务完成后Job成功退出。否则,异常退出。

工作流程大概就是用Reader模块从源数据库读数据,在Storage模块里将Reader模块读到的数据交换给Write模块,Write模块将数据写进目的数据库。

DoubleQueue
设立两块空间,一个存储源数据,一个存储目标数据。在开始,空间A和空间B都是空的,loading 任务从源数据库向A空间加载数据,A空间满后再向B空间加载数据,同时dumping任务将A空间数据转储到目的数据库。A空间清空后,交换AB两者的任务,即A空间的任务换成loading,B空间的任务换成dumping。不断重复上述操作。

二、DataX应用

[推荐]DataX实战应用
https://blog.csdn.net/u010429286/article/details/82356121
基于datax的数据同步平台
参考URL: http://www.cnblogs.com/huangxiaoxue/p/9392817.html
ETL工具–DataX3.0实战
参考URL: http://blog.51cto.com/daisywei/1903085

DataX插件分为Reader和Writer两类。Reader负责从数据源端读取数据到Storage(交换空间),Writer负责将Storage中的数据写入到数据目的端。Storage可以适配不同种类的Reader和Writer,从而实现数据同步.

目前DataX版本已经提供的Reader插件如下:
1、 hdfsreader : 支持从hdfs文件系统获取数据。
2、mysqlreader: 支持从mysql数据库获取数据。
3、 sqlserverreader: 支持从sqlserver数据库获取数据。
4、 oraclereader : 支持从oracle数据库获取数据。
5、 streamreader: 支持从stream流获取数据(常用于测试)
6、httpreader : 支持从http URL获取数据。

提供的Writer插件如下:

1、 hdfswriter :支持向hdbf写入数据。
2、 mysqlwriter :支持向mysql写入数据。
3、 sqlserverwriter:支持向sqlserver写入数据。
4、 oraclewriter :支持向oracle写入数据。
5、 streamwriter :支持向stream流写入数据。(常用于测试)

DataX 3.0每一种读插件都有一种或多种切分策略,都能将作业合理切分成多个Task并行执行,单机多线程执行模型可以让DataX速度随并发成线性增长。 在源端和目的端性能都足够的情况下,单个作业一定可以打满网卡。

更多实际应用结合DataX Transformer在数据同步、传输过程中,存在用户对于数据传输进行特殊定制化的需求场景,包括裁剪列、转换列等工作,可以借助ETL的T过程实现(Transformer)。DataX包含了完成的E(Extract)、T(Transformer)、L(Load)支持。

三、DataX安装测试

tar zxvf datax.tar.gz
chmod -R 755 datax

cd datax/bin
#会给你返回json模板格式
python datax.py -r mysqlreader -w mysqlwriter
#python datax.py ../job/job.json

其中,job.json是自带的一个例子配置文件,没什么具体用途。

四、DataX性能调优

DataX使用指南——ODPS to ODPS
参考URL: https://yq.aliyun.com/articles/71063

DataX调优要分成几个部分,任务机指运行Datax任务所在的机器。

  • 网络本身的带宽等硬件因素造成的影响;
  • DataX本身的参数;
  • 从源端到任务机;
  • 从任务机到目的端;
    即当觉得DataX传输速度慢时,需要从上述四个方面着手开始排查。

五、DataX源码编译问题整理

DataX源码打包编译采坑记
参考URL: https://blog.csdn.net/qq_32447301/article/details/82909326

编译根pom报错整理

  1. 报错Could not resolve dependencies for project com.alibaba.datax:odpsreader:jar:0.0.1-SNAPSHOT
    这个依赖应该是阿里内部jar,外部仓库无法加载这个jar
    搜索关键字 com.aliyun.odps
    pom替换为
    如下:换一下版本 :0.20.7-public
		
			com.aliyun.odps
			odps-sdk-core
			0.20.7-public
		

注意这里使用odps-sdk-core关键字搜到2个pom: reader、writer都需要改。

  1. 报错Could not find artifact com.aliyun.openservices:tablestore-streamclient:jar:1.0.0-SNAPSHOT
    修改pom 关键字tablestore-streamclient
    此处把1.0.0-SNAPSHOT改成1.0.0
        
            com.aliyun.openservices
            tablestore-streamclient
            1.0.0
        

六、datax增量同步

参考URL: https://www.codercto.com/a/45069.html

Datax需要解决的另一个难题在于增量更新。

首先需要说明, Datax本身在大部分reader插件中提供了where配置项,用于做增量更新。例如mysqlerader md文件说明如下:

* **where**

	* 描述:筛选条件,MysqlReader根据指定的column、table、where条件拼接SQL,并根据这个SQL进行数据抽取。在实际业务场景中,往往会选择当天的数据进行同步,可以将where条件指定为gmt_create > $bizdate 。注意:不可以将where条件指定为limit 10,limit不是SQL的合法where子句。
where条件可以有效地进行业务增量同步。如果不填写where语句,包括不提供where的key或者value,DataX均视作同步全量数据。 * 必选:否
* 默认值:无
* **querySql** * 描述:在有些业务场景下,where这一配置项不足以描述所筛选的条件,用户可以通过该配置型来自定义筛选SQL。当用户配置了这一项之后,DataX系统就会忽略table,column这些配置型,直接使用这个配置项的内容对数据进行筛选,例如需要进行多表join后同步数据,使用select a,b from table_a join table_b on table_a.id = table_b.id
`当用户配置querySql时,MysqlReader直接忽略table、column、where条件的配置`,querySql优先级大于table、column、where选项。 * 必选:否
* 默认值:无

有一些场景,where配置满足不了,使用querySql配置:
如在数据清洗过程中,我们通常需要去join一些维度表以便过滤脏数据。所以,我们更多时候会使用querySql配置项:
不过由于每次数据同步的增量条件是不同的,可以通过自己编写代码来动态修改job任务,以便达到增量更新。

第二部分:增量同步

一、数据库增量同步数据思路

[推荐]浅谈增量数据的四种抽取模式
参考URL: https://blog.csdn.net/mochou111/article/details/80995156
什么是数据抽取 --全量抽取、增量抽取
参考URL: https://blog.csdn.net/yangtongli2012/article/details/51725408

  • 基于全量对比得出增量数据
    增量数据即DML操作,无非I(INSERT),D(DELETE),U(UPDATE)三种,故可以拿昨天的全量数据与今天的全量数据进行对比得出昨天的增量,具体方法是通过关联表的主键,唯一键用left join,right join,inner join 等对比出增量数据
    优点:因为是云上merge对比,所以对源库无影响
    缺点:这个操作仅仅适合表有主键,唯一键或者数据量较小的表,不然海量数据中每条数据的每一列都进行逐一比对,很显然这种频繁的I/O操作以及复杂的比对运算会造成很大的性能开销。

  • 基于日志文件读取增量数据
    这种方式可以通过读取数据库的归档日志等得到增量数据,然后在目标库或者文档服务器里进行操作
    优点:可以做到数据无误差传输,有回滚机制,有容灾备份的能力
    缺点:开归档会对源端数据库的磁盘造成压力,增加储存成

  • 基于建触发器生成增量数据
    触发器的概念我们都知道,故我们可以建立IDU三种操作的触发器,并由触发器将变更的数据写到库里的临时表里,然后用ETL工具直接抽取这张临时表即可进行增量上云
    优点:是数据库本身的触发器机制,契合度高,可靠性高,不会存在有增量数据未被捕获到的现象
    缺点:对于源端有较大的影响,需要建立触发器机制,增加运维人员,还要建立临时表,储存临时表,增加储存成本和运维成本

  • 基于时间字段切分增量数据
    此方法依据表的某一时间字段,在etl工具里进行条件设定即可快速抽取增量数据
    优点:数据处理逻辑清楚,速度较快,成本低廉,流程简单
    缺点:此方法要求表的时间字段必须是随表变动而变动的不为空数据,此外由于是直接读取表数据,该方法无法获取删除类型的数据。

总结:

  1. 对于大型数据库,数据变更频率快,表数量多,对数据传输要求有备份,安全,零差数据的采用基于数据库日志的方法
  2. 对于小型数据库,且未开归档,但数据变更频率快的采用基于全量对比的方法
  3. 对于含有标准时间戳字段,且应用环境适合,表数量较少的采用基于时间字段的方法
  4. 至于触发器,由于需要源端运维成本较大,且对源端存储有压力(既然都是对存储有压力为何不用OGG),故很少有客户选择这一种

二、数据同步工具 Otter

数据同步工具otter(二)
参考URL: https://blog.csdn.net/frog4/article/details/81613025
数据同步工具otter(一)谈谈binlog和canal
参考URL: https://blog.csdn.net/frog4/article/details/80280149

基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库. 一个分布式数据库同步系统;

Otter基于数据库增量日志解析,支持mysql/oracle数据库进行

otter是一个基于canal的数据同步平台,含义是水獭,主要的功能就是可以将mysql的数据同步至另外mysql或者oracle,在项目中应用场景主要是多数据中心、BI系统抽取数据、灾备。

另外也支持双向同步(即A库同步给B库,B库也同步给A库)、文件同步,
在canel的基础上做了一个mysql的同步平台(带WEB管理界面),在界面上,你可以定义相应的映射规则,otter进程就会根据你定义的规则读取binlog,并更新到目标库中去。

github的地址:https://github.com/alibaba/otter

1. Canal

原理如下:

  1. canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
  2. mysql master收到dump请求,开始推送binary log给slave(也就是canal)
  3. canal解析binary log对象(原始为byte流)

2. Otter能解决什么问题

  • 异构库同步
    Otter支持从Mysql同步到Mysql/oracle,我们可以把mysql同步到oracle

  • 单机房同步
    可以作为一主多从同步方案,对于单机房内网来说效率非常高,还可以做为数据库版本升级,数据表迁移,二级索引等这类功能

  • 异地机房同步
    异地机房同步可以说是Otter最大的亮点之一,可以解决国际化问题把数据从国内同步到国外来提供用户使用,在国内场景可以做到数据多机房容灾

  • 双向同步
    双向同步是在数据同步中最难搞的一种场景,Otter可以很好的应对这种场景,Otter有避免回环算法和数据一致性算法两种特性,保证双A机房模式下,数据保证最终一致性

  • 文件同步
    站点镜像,进行数据复制的同时,复制关联的图片,比如复制产品数据,同时复制产品图片

三、Otter与Datax区别

定位不同,datax主要是解决离线全量同步,通过select语句或者dump指令提取数据,然后同步到目标,数据仓库典型用法。

DataX不适合实时数据同步或太频繁的定时同步,因为同步都需要去读取源表,频率过大对源表会造成压力。

canal&otter,主要是解决准实时同步,通过解析数据库日志,然后同步到目标,网站前台的典型用法。

四、SymmetricDS

SymmetricDS是一个文件和数据库同步软件,开源的,支持多主复制,同步时过滤和在异构的网络环境中进行数据转换传输。它支持单向和双向上的多个订阅者,异步的数据复制。

SymmetricDS,利用数据库的触发器捕捉数据库变化来实现数据库同步,可以有两个节点或多个节点,可实现同服务器不同数据库同步或不同服务器数据库同步。

五、Otter和SymmetricDS

两者功能是差不多。

网上的一些描述如下:
otter的第三个版本是基于SymmetricDS 2.x版本发展出来,正是因为有了这层关系,两者才有一些相似。

这次开源的为otter的第四个版本,从2011年开始开发,和SymmetricDS几个不同点:

  1. 数据capture方式:otter4目前支持log-based,otter3和SymmetricDS一样,是基于trigger.
  2. 双向同步冲突处理:otter4目前已经有比较成熟的方案, 而从SymmetricDS 3.x的文档中看,还处于planing中
  3. 调度模型:otter4相比于SymmetricDS,在数据传输的模型上,引入了并行化调度,提升同步tps. 而在SymmetricDS 3.x文档中暂没看到相关的描述,基本还是串行的处理,只不过多了push的功能,这点是otter4没有的

基于log-based的方案,对于数据库的影响相对较少,同时可精确提取具体变更的字段,做到按需同步,而SymmetricDS基于trigger的方式,只能提取到变更的pk,每次同步时基于pk反查源库提取到行记录。从性能上来说,按字段同步传输量和数据库载入上都有很大的优势,从数据冲突上来说,冲突粒度更小了,有利于冲突处理方案的执行。

可以说下,otter3和otter4的性能对比,基本上是一个数量级上的提升,otter3的基于trigger,然后根据pk反查的,处理tps基本只在5001000tps,而基于log-based,基于字段同步的可以达到500010000tps.

SymmetricDS有一个比较大的优势就是支持的数据库的比较多,这也是基于log-based所无法超越的,因为完成一个log-based不是那么简单的,代价很高,也就是最近1,2年才陆续有mysql的log-based出现,而oracle的log-based基本上的价格就是一个oracle的价格。

参考

Otter与你们的Datax有多大区别?
参考URL: https://www.iteye.com/topic/1131759?page=2

你可能感兴趣的:(ETL工具)