版权声明: 本文为博主原创文章,未经博主容许不得转载。关注公众号技术汇(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相关的variable,使用${variable}的形式。
特别说明:密码也是按照了这种形式填写,kettle也能识别这是一个variable。
由于其余做业和转换都用到了这两个DB链接,能够将其设置成共享。
新建Transformation,保存命名为“数据同步.ktr”。
由于须要确保清空表的操做先完成,因此作了一步阻塞。也就是不完成了T1:清空表的步骤,就不会进行T3:提交数据的步骤。
核心对象->流程->阻塞数据直到步骤都完成。
接下来是获取表名的Transformation:
T1:获取表名,核心对象->输入->获取表名,选择数据库链接,勾选“包含表”便可,名称字段能够自定义,这里设置的是table_name。
T2:选择字段,核心对象->转换->字段选择。主要是指定须要的字段,显然咱们须要table_name字段,也能够自定义更名,这里更名成tablename。
再按住shift键,将各个步骤链接起来,获取表名的Transformation就完成了。
接下来是一个中间的转换过程,就是取出表名,而后设置到指定的变量中,以便提交数据的时候获取${TABLENAME}。
新建转换,保存命名为“获取变量.ktr”。
T1:获取表名变量值,核心对象->做业->从结果获取记录,指定要获取的字段名称是tablename,就是上述获取表名更名成的tablename。
新建Job,保存命名为“获取变量-数据同步.kjb”,分别在核心对象中添加一个START,和两个转换,两个转换分别对应了上述已经准备好的“获取变量.ktr”和“数据同步.ktr”,链接起来便可。
接下来是最后一个Job,新建Job,保存命名为“entrypoint.kjb”。添加一个START,一个转换,一个做业和一个成功结束节点。
至此,整个数据同步的工程已经搭建好了,便可运行entrypoint.kjb。在运行的时候,须要设置数据库的相关参数。
作到这一步,仍是不够的,每次执行做业还须要输入这么多参数,还有可能会出现失误。
kettle的强大之处就是还提供了Java API,能够基于此,作更高层次的抽象,使操做成本进一步下降。
下篇将讲解如何实现一个基于kettle的数据同步系统。