我司目前数据库之间的数据同步都是oracle goldengate(ogg)方案,该方案的特点:
优点:
缺点:
为了解决ogg的上述缺点,研究了新的同步方案:kettle
kettle是通过sql,基于主键、时间戳增量同步数据,不需在数据库服务器上做任何配置,只需在kettle服务器上创建配置JOB即可,有简单直观的CS平台。
今后将以kettle为主,同步数据量很大的表(如单表日同步100万记录以上),会考虑ogg。
版本:pdi8.3
OS:因为linux的界面失真,用起来实在蓝瘦香菇,而且每次启动spoon都很费时,因此用windows平台。
安装过程很简单:
kettle的几个关键组件说明
对表的要求
原理说明
作业:job_sync_t1(oracle->mysql)
转换:trans_get_timestamp
表输入:
select DATE_FORMAT(time_stamp,'%Y-%m-%d %H:%i:%S') time_stamp
from sync_timestamp
where table_name='sync_t1'
设置变量:
转换:trans_sync_data
表输入:
select *
from sync_t1
where update_time >= to_date('${TIME_STAMP}','yyyy-mm-dd hh24:mi:ss')
插入/更新:
kettle job通过kitchen命令执行;每次执行JOB时,kitchen要初始化几百M的内存,耗时10秒以上,一个kitchen进程启动后只能执行1次JOB;如果大量kitchen同时启动,会消耗大量内存,对OS内存配置要求很高。
为了合理化利用资源,将JOB调度按调度频率划分到不同文件,每个文件根据具体同步数据的压力情况安排3-5个job:
1分钟执行1次的JOB:
file1: job_1min_1.bat,包含job1-job3
file2: job_1min_2.bat,包含job4-job6
file3: job_1min_3.bat,包含job7-job9
……
job_1min_1.bat的内容:
e:
cd e:\pdi\data-integration
kitchen /file:e:\mykettle\job1\job.kjb /level:Error
kitchen /file:e:\mykettle\job2\job.kjb /level:Error
kitchen /file:e:\mykettle\job3\job.kjb /level:Error
通过kettle服务器的任务调度定期执行 job_1min_1.bat文件即可。
备注:kettle自身没有防止JOB并发执行的机制(如某JOB执行频率每分钟1次,但一次执行耗时超过1分钟,就会存在并发执行的情况);并发执行时,插入重复数据报错,可以监控到JOB错误,从而优化JOB或调度。
JOB配置日志表,记录JOB执行情况;
创建日志表
CREATE TABLE `sync_log` (
`ID_JOB` bigint(20) NOT NULL,
`JOBNAME` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL,
`STATUS` varchar(20) COLLATE utf8mb4_bin DEFAULT NULL,
`ERRORS` bigint(20) DEFAULT NULL,
`LOGDATE` datetime DEFAULT NULL,
`LOG_FIELD` blob,
`LINES_READ` bigint(20) DEFAULT NULL,
`LINES_WRITTEN` bigint(20) DEFAULT NULL,
`LINES_UPDATED` bigint(20) DEFAULT NULL,
`LINES_INPUT` bigint(20) DEFAULT NULL,
`LINES_OUTPUT` bigint(20) DEFAULT NULL,
`LINES_REJECTED` bigint(20) DEFAULT NULL,
`STARTDATE` datetime DEFAULT NULL,
`DEPDATE` datetime DEFAULT NULL,
`REPLAYDATE` datetime DEFAULT NULL,
`ENDDATE` datetime DEFAULT NULL,
PRIMARY KEY (`ID_JOB`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
job指定日志表:
sync_log
sync_timestamp
通过上述2个表的关联,确认JOB是否正常执行,配置到zabbix监控项。
判断标准:sync_timestamp表记录的table_name,在sync_log中都有最新的成功执行的日志(status=end,error=0,logdate 以上SQL返回值>0即说明JOB执行有异常。 over ~select count(*)-(select count(*) from dbcopy.sync_timestamp) errorjob
from dbcopy.sync_log a, dbcopy.sync_timestamp b
where (a.jobname,a.logdate) in (select jobname,max(logdate)
from dbcopy.sync_log
where errors=0 and status='end'
group by jobname)
and a.jobname=b.table_name
and a.logdate > DATE_SUB(now(),INTERVAL (b.interval_seconds + 60) second)