KFS增量解析原理-Logminer
关键字:
KFS,增量解析,Oracle,Logminer
概述
KFS源端的工作流分为两个阶段:binlog-to-q和q-to-kufl。binlog-to-q阶段,KFS从源端的数据库日志中抽取增量数据,经过extractor模块解析封装后,以DBMSEvent的形式在内存队列queue中暂存,此阶段的主要工作是将数据库的元组信息抽取转化为DBMSEvent,我们称此阶段为“解析”阶段。对于不同的数据库,我们增量抽取解析方式不同,Oracle提供了一个对外接口-Logminer,用户可以使用该接口来获取指定范围内的增量数据,本来将简要介绍KFS通过Logminer获取Oracle的增量数据。
增量解析
增量抽取与解析是KFS进行数据同步所要进行的第一个动作,抽取解析过程因为数据源的不同会导致实现方式的不同,目前KFS支持抽取众多源日志,例如Oracle的Redo、MySQL的Binlog、KES V8的WAL、SQL Server的WAL,对于不同的数据库,我们增量抽取解析方式不同,
Logminer
对于Oracle数据库,所有对用户数据和数据字典的改变都记录在Oracle的Redo Log中,因此,Redo Log包含了所有进行恢复操作所需要的信息。但是原始Redo Log文件不易于阅读,因此,Oracle从8i开始提供了一个分析工具-Logminer,使用该工具可以获取Redo Log文件中的具体内容,KFS实现了通过Logminer获取Oracle的增量数据。
KFS增量解析流程-Logminer
KFS通过Logminer获取Oracle增量数据时的运行线程共有3个,如图所示
三个线程,分别是OracleLogminerReaderExtractor、OracleLogminerReaderThread、OracleLogminerParserThread,OracleLogminerReaderExtractor线程启动后,它会判断OracleLogminerReaderThread线程的状态,如果未启动,则将其启动;OracleLogminerReaderThread线程会判断OracleLogminerParserThread线程的状态,如果未启动,则将其启动,OracleLogmienrReaderThread会启动Logminer,不断查询Oracle的变更记录并将SQL放入ReaderThread和ParserThread的通信队列中;OracleLogminerParserThread会不断从SQL队列中取出具体的对象进行解析,解析后封装为DBMSEvent(在KFS流水线中流转的一种数据结构)并放入ReaderExactor和ParserThread的通信队列中,ReaderExactor从队列中取出对象后,进行下一阶段的操作。