你想知道的迁移之道都在这里了 有转移之道( 三 )


增量同步的技术架构
DRS的增量同步架构主要分为3个部分 , 分别是数据抓取、落盘文件和数据回放 。

你想知道的迁移之道都在这里了 有转移之道

文章插图
  • 数据抓取
数据抓取通过对源库日志的解析 , 实时获取源库的变化数据 , 在内部实现上主要包括日志拉取、日志解析、事务整合和数据落盘几个步骤 。
    • 日志拉取
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的落盘文件中读取增量数据 , 按顺序放入一个队列中 , 并行分析引擎会从队列中获取每一条数据 , 并根据其主键信息判断是否存在数据冲突 , 对于没有冲突的数据说明可以并行去执行 , 则把这些数据分散到多个线程队列中 , 当线程队列中的数据量达到设定的阈值时 , 这批数据会作为一个事务在目标库执行 。对于有冲突的数据 , 则把这条数据放到冲突队列 , 等待线程把上一批数据执行完成后 , 再次进入并行分析引擎判断是否存在冲突 。
(原文地址:http://www.99cwb.com/3214.html)