数据抓取
数据抓取通过对源库日志的解析,实时获取源库的变化数据,在内部实现上主要包括日志拉取、日志解析、事务整合和数据落盘几个步骤。
日志拉取
DRS采用Oracle的Logminer接口获取实时的redo日志,当redo归档后,DRS会读取归档日志文件。为了防止源库的归档日志被不确定性删除,DRS会启动日志拉取的线程(可以多线程并发)把日志拉取到本地,然后进行后续的解析。
日志解析
Oracle Logminer接口获取到的数据需要进一步解析才能获取到实际的变化内容,DRS的日志解析线程对返回的数据进行过滤、拼接、元数据映射、转换等操作形成一条完整的变更记录对象。
事务整合
日志解析是按照源库变化数据的顺序进行解析,解析后的每条记录的事务是交叉混合在一起的,必须对每条记录按照事务id进行整合才能形成一个完整的事务。另一方面对于Oracle RAC的场景,还需要对不同节点的事务进行排序,避免事务乱序的情况发生。
落盘文件
经过了事务整合后,形成了一个按照源库业务提交顺序的序列,DRS会按照这个顺序把这些数据写入到磁盘文件。落盘的数据包含了源库每一条变化数据的全部信息,包含表信息、列信息、事务信息、数据信息和其他额外信息(如时间戳、rowid等),根据这些信息后面的组件便可以把每一条变化数据还原成对象的SQL。
数据回放
数据回放就是将数据抓取到的数据在目标库进行执行的过程,但它和数据的抓取是解耦的。它读取DRS的落盘文件,解析出每条变化的数据,根据文件中记录的元数据信息重构出对应的SQL语句,在目标库执行。
在数据回放之前,DRS提供了过滤和转换的功能,可以对同步的数据进行过滤,可配置过滤条件,如只同步id < 10000的数据,也可以对同步数据的表名、schema名或列名进行映射等。
异常处理和回放性能是两个重要的考量点,DRS通过配置数据冲突策略来处理回放中的异常数据,通过并发机制来提高装载的性能。
冲突策略
所谓的冲突是指在数据回放的时候出现了数据类报错(如主键冲突、update和delete无法找到记录等),这些报错一版都是由于两边的数据不一致造成的。DRS对这类错误采用了三种处理策略,分别是覆盖、忽略和等待。
覆盖:当出现冲突时,用抓取到的数据覆盖掉目标库的数据
忽略:数据冲突后,直接跳过错误记录,继续执行
等待:数据冲突后,等待人工处理
并发机制
DRS的并发机制采用记录级别的并发,最大化的提升数据装载的性能。
首先从DRS的落盘文件中读取增量数据,按顺序放入一个队列中,并行分析引擎会从队列中获取每一条数据,并根据其主键信息判断是否存在数据冲突,对于没有冲突的数据说明可以并行去执行,则把这些数据分散到多个线程队列中,当线程队列中的数据量达到设定的阈值时,这批数据会作为一个事务在目标库执行。对于有冲突的数据,则把这条数据放到冲突队列,等待线程把上一批数据执行完成后,再次进入并行分析引擎判断是否存在冲突。
Ps:该内容根据《GaussDB(for openGauss)数据迁移之DRS》技术直播整理完成,错过直播的小伙伴们,欢迎点击此处回顾精彩内容哦~