0. 前言
本文介绍了使用Kettle对一张业务表数据(500万条数据以上)进行实时(10秒)同步,采用了时间戳增量回滚同步的方法。关于ETL和Kettle的入门知识大家可以阅读相关的blog和文档学习。
1. 时间戳增量回滚同步
假定在源数据表中有一个字段会记录数据的新增或修改时间,可以通过它对数据在时间维度上进行排序。通过中间表记录每次更新的时间戳,在下一个同步周期时,通过这个时间戳同步该时间戳以后的增量数据。这是时间戳增量同步。
但是时间戳增量同步不能对源数据库中历史数据的删除操作进行同步,我们可以通过在每次同步时,把时间戳往前回滚一段时间,从而同步一定时间段内的删除操作。这就是时间戳增量回滚同步,这个名字是我自己给取得,意会即可,就是在时间戳增量同步的同时回滚一定的时间段。
说明:
- 源数据表 需要被同步的数据表
- 目标数据表 同步至的数据表
- 中间表 存储时间戳的表
2. 前期准备
在两个数据库中分别创建数据表,并通过脚本在源数据表中插入500万条数据,完成后再以每秒一条的速度插入新数据,模拟生产环境。
源数据表结构如下:
CREATE TABLE `im_message` ( `id` int(11) NOT NULL AUTO_INCREMENT, `sender` varchar(45) COLLATE utf8_bin NOT NULL COMMENT '消息发送者:SYSTEM', `send_time` datetime(6) NOT NULL, `receiver` varchar(45) COLLATE utf8_bin NOT NULL COMMENT '消息接受者', `content` varchar(255) COLLATE utf8_bin NOT NULL COMMENT '消息内容', `is_read` tinyint(4) NOT NULL COMMENT '消息是否被读取:0-未读;非0-已读', `read_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id_UNIQUE` (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='消息表'
3. 作业流程
- 开始组件
- 建时间戳中间表
- 获取中间表的时间戳,并设置为全局变量
- 删除目标表中时间戳及时间戳以后的数据
- 抽取两个数据表的时间戳及时间戳以后的数据进行比对,并根据比对结果进行删除、新增或修改操作
- 更新时间戳
4. 创建作业
作业的最终截图如下&