背景
最近碰到了一个数据同步的业务场景,客户要求生产环境的某些特定数据定时同步到指定的数据池中,并对数据池中的表名称有特殊要求,必须以t_xxxx_tablename的格式命名,其中xxxx为单位编号,tablename可以是应用中的表名称(也就是说在从正式环境同步到数据池后表名称需要加个前缀)。数据不需要实时同步,定时同步即可。
能想到的方案之一是编码实现:针对需要同步的表,编写代码从原数据源获取数据,写入到目标数据源的指定表中,目标数据源的表名称当然可以根据用户需求随意指定。
但是毕竟需要编码,即使需要同步的表不多,也还是有工作量的,而且编码的时候需要控制原数据的增删改,比较繁琐。所以编码实现一定不是最佳方案。
方案二是ETL工具,ETL工具天然就是为解决这类需求而生的,虽然从来没用过任何一款ETL工具,但是感觉学习成本应该不会太大。
ETL工具选择
百度了下,选择了Etlcloud,应该是谷云科技(广州)有限责任公司旗下的产品,号称社区版终生免费,找到了他的官网,文档也比较完善,安装部署文档写的很详细:
https://www.etlcloud.cn/restcloud/view/page/helpDocument.html?id=64671836bd12a45a27ada704
下载部署
etlcloud官网提供了社区版的免费下载:
不过虽然是免费的,但还是要求登录后才能下载,而且安装部署启动之后,要求必须有SN(需要在官网生成)才能使用,有短期临时SN(6个月有效期)和长期有效SN的区别,长期有效的SN要求用户注册3个月以上才能申请。
安装过程其实比较简单,但是需要注意以下几点:
- 对JDK版本应该是有要求的,最开始我用了JDK17,系统启动、用户登录都没有问题,但是SN录入之后提交不了,后台报错,搞得我差一点就要放弃了,最后想着换一下JDK试试,换成JDK8就OK了。
- 按照安装文档的要求,安装了mongodb4.2,etlcloud的安装文档很贴心的提供了mongoDB的安装教程,但是确实,mongodb也是我首次安装使用,也碰到了一点小小的问题。
- etlcloud主应用其实是tomcat应用,很简单,几乎不需要修改啥,按照安装文档操作就可以了,注意需要指定环境变量JAVA_HOME。以及,如果安装mongodb后设置的用户名、密码和官网举例的不一样的话,需要修改一下tomcat的配置文件,匹配mongodb的用户名密码就可以了。
mongodb的安装配置
其实mongodb的安装配置也很简单,按照官网的安装说明操作就可以:
https://etlcloud.cn/restcloud/view/page/helpDocument.html?id=6563ef397f90446d6352d072&type=8
不过需要说明一下的是,安装文档的 1.6 配置并安装 Mongodb 服务 部分,4.2版本的mongodb不需要自己再创建配置文件,bin目录下就有一个:
打开该文件修改一下对应的数据库文件存储路径就可以:
# Where and how to store data.
storage:
dbPath: D:\MongoDB\Server\4.2\data
journal:
enabled: true
然后在注册为服务的时候指定该配置文件即可:
D:\mongodb\bin\mongod.exe --config "D:\MongoDB\Server\4.2\bin\mongod.cfg" --install
install之后打开windows任务管理器看一下,有启动的mongodb服务就表明安装成功了。
之后根据安装文档的说明创建mongodb用户,也就是安装文档的2.2.4部分(放在了linux安装部署mongodb部分,但是windows下安装也是需要执行的),通过mongodb的shell脚本客户端mongo.exe完成。
安装文档 《1.7 进入MongoDB 后台管理 Shell界面》 调出shell界面之后,执行 《2.2.4 创建Mongo用户》,db.createUser脚本敲进去之后需要双击回车键执行脚本(我是mongodb小白,折腾了好一会儿才发现)。
启动应用
完成JDK的安装以及JAVA_HOME环境配置,以及完成mongodb的安装之后,启动eltcloud的tomcat服务反而很简单,按照安装手册的说明操作就可以。
etlcloud服务默认是在8080端口,访问服务:
用户名admin,默认密码是pass,登录之后就要求输入SN,从官网获取SN输入之后,就可以正常使用了。
配置数据源
开工第一步就是配置数据源,首页 数据源管理,添加两个数据源:
一个source,一个desination,数据源的设置非常简单,指定ip:port以及用户名密码就OK,设置完之后先做一下链接测试,没问题之后,保存数据源。
创建同步流程
其实同步流程的配置也很简单,第一个测试:只同步一张表的数据。
我们尝试从源数据库中同步sys_user表的数据到目标数据库中,目标数据库中可以不建表,让etlcloud在同步的过程中自动创建。
系统首页选“离线数据集成”,离线数据集成是针对实时数据集成而言的,比如我们每天晚上2点同步一次数据,就可以通过离线数据集成实现。
第一步创建应用,很简单。
创建应用之后,点击该应用进入应用详情页面:
点击左侧数据集成流程 - 所有数据流程,之后新增流程:
注意:使用定时自动调度的话,需要选择调度策略,系统提供了几个简单的调度策略,如果不能满足的话,可以通过首页平台配置 - 定时任务设置 - 定时策略管理 新增调度策略(通过cron表达式)。
我配置的是每10分钟跑一次,你当然可以配置每天凌晨2点跑一次,cron表达式还是很强大的。
流程设计
新增流程之后,通过流程设计功能进行具体的ETL配置:
第一步:先从左侧菜单拖入一个库表输入组件,一个库表输出组件,并选中上方的 流程线,将流程图按上图所示连接好。
第二步:配置库表输入节点,其实配置很简单,按照操作提示一步步配置即可:
第三部:配置库表输出节点,指定目标表的名称:
注意目标表的结构也不需要自己创建,可以选择从其他节点导入,选择第一步的库表输入节点,选择原表的结构导入即可,注意原表最好有主键字段,目标表中将该主键设置为目标表的关键字段,猜测该关键字段是数据迁移过程中新增、删除字段的依据:
配置完成之后,保存流程即可。
跑流程、测试
流程配置完成之后,在流程首页立即调度该流程:
之后可以在任务监控中跟踪任务调度情况:
流程执行成功之后,到目标表中查看数据同步情况:
- 全量数据:首次同步之后,发现原表中的所有数据都已经同步到目标表中。
- 新增数据:在原表中新增一条数据,目标表能正确同步。
- 修改数据:修改原表中的一条数据,目标表能正确同步。
- 删除数据:删除一条数据,目标表能正确同步。
OK!单表数据传输可以用etlcloud轻松实现,其实etlcloud功能非常强大,文档相对来说也很健全,非常适合初学者上手。