利用Kettle进行数据同步(上)

版权声明: 本文为博主原创文章,未经博主容许不得转载。关注公众号技术汇(ID: jishuhui_2015) 可联系到做者。数据库

写这篇文章,是源于公司内部的一个常见需求:将生产环境的数据同步到测试环境,以便更方便的进行测试和bug定位。安全

起初是用的Navicat Premium这款DB管理软件,功能很是强大了,足以知足开发人员的平常工做需求,也包括上述的数据同步需求。工具

随着公司业务日臻完善,对于数据的安全性提出了更为严格的要求。学习

实际上,是不容许将任何环境的数据同步至生产环境的,便是生产环境的数据是错误的。Navicat Premium有数据传输这一功能,可以将一个数据库传输并覆盖到另一个数据库,没有任何限制。测试

此外,为了不开发人员直接接触到生产数据库,笔者将高权限的帐号都收回了,只授予其只读权限,保留了数据查看的能力。如果如此,那么数据同步的工做压力就指向了笔者。ui

为了寻求更为方便、稳定的方式去完成这个数据同步的工做,笔者把思路聚焦在了ETL工具上了。设计

若是仅仅是为了完成数据同步的功能需求,把ETL的概念拿出来未免显得有些班门弄斧了。考虑到之后还会有数据处理方面的需求,研究一款ETL工具势在必行(在写此篇文章的时候,就出现了一个导出Excel的功能需求)。3d

理论上,平常内部的ETL需求均可以经过“代码 + 脚本”的方式实现。可是,在笔者看来都是无心义的重复造轮子,耗时耗力,若是能掌握一款ETL工具,无疑能减轻很多的工做量。orm

固然,市面上的ETL工具也不在少数,国内外的企业都有成品,可是本着开源免费,强大好用的原则,最终就只剩下kettle了。cdn

使用kettle以前,仍是须要有一些基础知识背景。说直白点,若是给不懂技术的PM使用,都将会以一句“mmp”结束。全面学习kettle是没有必要的,可是应该知道它能有哪些功能,大体能完成哪些工做,以便从此充分利用之。推荐阅读这篇文章。 ETL的过程就是一条工做流,如下是这次要实现的数据同步流程:

数据同步流程

客户端填充两方数据库的设置信息,如:host、user、password、database等,这些设置信息都将以variable的形式存在于kettle中。

由于指定的database中可能有多张表,因此在kettle内部中,循环的执行获取数据,清空表,提交数据的流程。

固然,流程之间仍是有些细节的,下面将讲解如何用kettle搭建数据库同步的工程。

此工程中的做业(Job)和转换(Transformation)有嵌套关系,本着“自顶向下的设计,自底向上的实现”的原则,咱们先将几个子流程都配置好,再进行相关的串联。

新建一个转换,保存命名为“提交数据.ktr”。

准备两个数据库链接,主对象树->右键DB链接->新建。

DB-FROM

DB-TO

能够看到,已经预留了DB相关的variable,使用${variable}的形式。

特别说明:密码也是按照了这种形式填写,kettle也能识别这是一个variable

由于其余做业和转换都用到了这两个DB链接,能够将其设置成共享

共享DB链接

新建Transformation,保存命名为“数据同步.ktr”。

提交数据流程
T1:清空表。核心对象->脚本->执行SQL脚本。要清空的表名使用variable代替了,勾选“变量替换”的CheckBox。
清空表
T2:获取表数据。核心对象->输入->表输入。获取表里的所有数据,选择数据来源,表名使用variable代替了,勾选“替换SQL语句的替换”的CheckBox。
获取表数据
T3:提交数据。核心对象->输入->表输出。选择数据库链接,目标表使用variable代替,提交记录数量指的是一次commit的数据量,视实际的数据量状况而定,默认是1000条,而且建议勾选“使用批量插入”。
提交数据

由于须要确保清空表的操做先完成,因此作了一步阻塞。也就是不完成了T1:清空表的步骤,就不会进行T3:提交数据的步骤。

核心对象->流程->阻塞数据直到步骤都完成。

阻塞数据
再按住shift键,将各个步骤链接起来,提交数据的Transformation就完成了。

接下来是获取表名的Transformation:

获取表名
新建Transformation,保存命名为“ 获取全量表名.ktr”。

T1:获取表名,核心对象->输入->获取表名,选择数据库链接,勾选“包含表”便可,名称字段能够自定义,这里设置的是table_name。

获取表名

T2:选择字段,核心对象->转换->字段选择。主要是指定须要的字段,显然咱们须要table_name字段,也能够自定义更名,这里更名成tablename。

选择字段
T3:复制记录到结果,核心对象->做业->复制记录到结果。主要是做为下一个步骤的输入。
复制结果

再按住shift键,将各个步骤链接起来,获取表名的Transformation就完成了。

接下来是一个中间的转换过程,就是取出表名,而后设置到指定的变量中,以便提交数据的时候获取${TABLENAME}。

新建转换,保存命名为“获取变量.ktr”。

T1:获取表名变量值,核心对象->做业->从结果获取记录,指定要获取的字段名称是tablename,就是上述获取表名更名成的tablename。

获取表名变量值
T2:设置变量值,核心对象->做业->设置变量,设置TABLENAME变量,选择变量做用范围“Valid in the root job”。
设置变量值
至此,全部的Transformation都完成了,须要经过Job来链接Transformation了。

新建Job,保存命名为“获取变量-数据同步.kjb”,分别在核心对象中添加一个START,和两个转换,两个转换分别对应了上述已经准备好的“获取变量.ktr”和“数据同步.ktr”,链接起来便可。

获取变量-数据同步

接下来是最后一个Job,新建Job,保存命名为“entrypoint.kjb”。添加一个START,一个转换,一个做业和一个成功结束节点。

entrypoint
获取全量表名返回的结果是一个列表,因此“ 获取变量-数据同步”做业须要循环执行。在设置做业的时候,勾选“ 执行每个输入行”。
执行每个输入行

至此,整个数据同步的工程已经搭建好了,便可运行entrypoint.kjb。在运行的时候,须要设置数据库的相关参数。

执行做业

作到这一步,仍是不够的,每次执行做业还须要输入这么多参数,还有可能会出现失误。

kettle的强大之处就是还提供了Java API,能够基于此,作更高层次的抽象,使操做成本进一步下降。

下篇将讲解如何实现一个基于kettle的数据同步系统。

关注咱们
相关文章
相关标签/搜索