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

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

上篇介绍了基于kettle的数据同步工程的搭建,entrypoint.kjb就是整个工程执行的入口。

为了进一步降低操作成本,让整个数据同步过程更稳定、安全,需要进行更高层面的抽象,做成一个简单易用的系统。

以下是应用截图:

除了选择数据源和数据库之外,还加入了授权码,意味着授权范围内的用户才能使用该系统。

因为是内部使用,授权用户还没实现后台管理,直接往应用数据库里添加,所选择的数据源和数据库都是通过配置文件生成的。

文末会附上GitHub上的源码地址,有需要的读者,可以进行二次开发改造。

一、数据库设计

数据库名称:kettle,目前有两张表:

1、授权用户表。表内记录的用户即可使用数据同步系统

CREATE TABLE `authorized_user` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID,自增',`user` varchar(128) NOT NULL COMMENT '用户名,全局唯一',`token` varchar(20) NOT NULL COMMENT '用户的授权码,全局唯一',`status` char(1) NOT NULL DEFAULT 'A' COMMENT '授权用户状态:A-已授权,R-未授权',`gmt_create` datetime NOT NULL COMMENT '创建时间',`gmt_modify` datetime NOT NULL COMMENT '最后修改时间',PRIMARY KEY (`id`),UNIQUE KEY `unique_index_token` (`token`) USING BTREE,UNIQUE KEY `unique_index_user` (`user`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='授权用户表' 

2、同步记录表。记录用户的数据同步操作

CREATE TABLE `sync_record` (`sync` varchar(20) NOT NULL COMMENT '同步记录主键',`ipv4` varchar(15) NOT NULL COMMENT 'ip地址',`from_db` varchar(100) NOT NULL COMMENT '源数据',`to_db` varchar(100) NOT NULL COMMENT '目标数据',`user` varchar(128) NOT NULL COMMENT '用户名',`token` varchar(20) NOT NULL COMMENT '用户的授权码',`status` char(1) NOT NULL DEFAULT 'P' COMMENT '同步状态:P-正在执行,S-成功,F-失败',`gmt_create` datetime NOT NULL COMMENT '同步创建时间',`gmt_modify` datetime NOT NULL COMMENT '最后修改时间',PRIMARY KEY (`sync`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='同步记录表'; 

二、程序设计

因为系统做得比较简单实用,没有什么特别设计之处。笔者重点说三点:

1、数据源及其参数配置

在application.yml配置文件中,有这么一段配置:

env:entry-point: kettle/entrypoint.kjbdatabases:- taxi-user- taxi-account- taxi-trade- taxi-coupon- taxi-bi- taxi-system- taxi-credits- taxi-finance- taxi-notification- taxi-gatewayfrom-dbs:- PROD- TEST- LOCALto-dbs:- LOCAL- TESTdb-settings:- name: LOCALhost: *****port: 3306user: *****password: *****- name: TESThost: *****port: 3306user: *****password: *****- name: PRODhost: *****port: 3306user: *****password: ***** 

利用了springboot的@ConfigurationProperties的注解。

@Setter
@Getter
@ConfigurationProperties(prefix = "env")
public class EnvConfig {private List<String> databases;private List<String> fromDbs;private List<String> toDbs;private List<DBSetting> dbSettings;public DBSetting getDBConfig(String name) {if (StringUtils.isBlank(name)) return null;return dbSettings.stream().filter(dbSetting -> dbSetting.getName().equalsIgnoreCase(name)).findFirst().orElse(null);}
} 

当中的DBSetting的定义如下所示:

@Setter
@Getter
@NoArgsConstructor
public class DBSetting {private String name;private String host;private String port = "3306";private String user = "root";private String password;public DBSetting(String host, String user, String password) {this.host = host;this.user = user;this.password = password;}
} 

通过客户端传来的参数,即可定位到对应的参数设置。

2、集成kettle的API 因为kettle相关的jar包放在了自己搭建的nexus私服上,所以如果使用的是maven管理jar包的话,需要在settings.xml配置文件中做一点修改:

<mirror>
	<id>nexus</id>	<url>公司内部的nexus的URL</url> 
	<mirrorOf>*,!pentaho-releases</mirrorOf> 
</mirror> 

其中的mirrorOf节点加上了!pentaho-releases,表示排除pentaho-releases。

然后,在springboot工程中的pom.xml中指定pentaho-releases的url。

<repositories><repository><id>pentaho-releases</id><url>https://nexus.pentaho.org/content/groups/omni/</url></repository>
</repositories> 

接下来是核心的对接代码,具体可以参照工程源码。

JobMeta jobMeta = getJobMeta(new ClassPathResource(envConfig.getEntryPoint()));
Job job = new Job(null, jobMeta);
//设置Variable
job.setVariable("sync", sync);
job.setVariable("TO_HOST", toDbSetting.getHost());
job.setVariable("TO_DB", form.getDb());
job.setVariable("TO_USER", toDbSetting.getUser());
job.setVariable("TO_PASSWORD", toDbSetting.getPassword());
job.setVariable("TO_PORT", toDbSetting.getPort());

job.setVariable("FROM_HOST", fromDbSetting.getHost());
job.setVariable("FROM_DB", form.getDb());
job.setVariable("FROM_USER", fromDbSetting.getUser());
job.setVariable("FROM_PASSWORD", fromDbSetting.getPassword());
job.setVariable("FROM_PORT", fromDbSetting.getPort());
job.start();//开始执行Job
job.waitUntilFinished();//等待Job完成 

3、异步执行作业

因为一个Job的执行时间可能会很长,这个主要是看数据量的多少,所以一个request的来回可能会导致TIMEOUT,所以需要改为异步的模式。

其核心的思想是:启动新的线程,客户端定时轮询执行结果。

三、总结

笔者分两篇文章介绍了如何利用kettle进行数据同步,并实现一个简易的系统,降低操作成本和出错率。

就介绍到这了,如有疑问,可以留言。

欢迎fork我的工程代码(github.com/liu-weihao/…)。

…](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fliu-weihao%2Fkettle “https://github.com/liu-weihao/kettle”))。

## 网络安全工程师(白帽子)企业级学习路线

第一阶段:安全基础(入门)

img

第二阶段:Web渗透(初级网安工程师)

img

第三阶段:进阶部分(中级网络安全工程师)

img

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

学习资源分享

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kettle是一种用于数据集成和转换的开源工具,可以实现不同数据源之间的数据同步。根据引用\[1\]中的解决方案,可以使用Kettle的一些组件来实现数据同步。首先,需要使用输入组件来输入最新的数据和目标。如果两个的字段数据类型不一致,还需要添加字段选择组件进行转换。然后,对两个进行排序操作,以便进行合并。接下来,使用合并记录组件根据ID进行合并。最后,使用数据同步组件实现数据的更新、插入和删除操作。点击运行即可实现数据同步。 另外,根据引用\[2\]中的定时清空目的数据源的方法,可以定期清空目的数据源,然后将源数据源的数据全盘拷贝到目的数据源。这种方法适用于数据量不大、实时性要求不高的场景。优点是不会对业务系统产生影响,开发和部署都比较简单,但效率较低。 总结起来,根据不同的需求和场景,可以选择不同的数据同步方式。其中,前四种方式需要业务有主键,而对于没有触发器和日志的小型数据源,如txt文本、Excel文件和Access数据库,则只能使用后三种方式。对于大型数据源,一般优先选择日志方式,如Oracle Asynchronized CDC,如果无法通过日志实现,则可以考虑使用第1、3、4种方式。\[2\] 以MySQL数据库Oracle数据库的定时同步为例,可以按照以下步骤进行操作:首先安装MySQL数据库Oracle数据库,并下载Kettle工具。然后打开Kettle软件,根据需求清楚数据抽取需求,将MySQL数据库Oracle数据库进行对应,根据Oracle的需求编写SQL语句,在MySQL中抽取相应的数据Oracle。可以选择全量抽取或增量抽取,并设置定时任务来实现定时同步。\[3\] #### 引用[.reference_title] - *1* [kettle-数据同步](https://blog.csdn.net/qq_38882855/article/details/121930512)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [kettle数据同步的五种方案](https://blog.csdn.net/u011331383/article/details/10625701)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [利用kettle实现数据库之间的数据同步](https://blog.csdn.net/dream_girl5/article/details/120782397)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值