前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

一、数据传输-同步原理

1、整体流程

源库 -> Input(生产者)-》 Scheduler(队列)-》Output(消费者)-》目标库

| 信息 | 说明 | | ——————- | ———————————————————— | | Input(生产者) | ` Input 用来适配各种数据源(MySQLPGMongo) | | Scheduler(队列) | Scheduler 用来对 Input 生成的数据流调度,发送至指定的队列 | | Output(消费者) | Output 读取队列中的将数据并写入目标端,比如 Kafka, MySQL` |

2、详细流程

1)全量阶段 Input

多线程并发去源库批量获取数据,全量阶段的时候需要记录 binlog 位点,用于增量阶段:

⬤ 并发的粒度:表级别

⬤ 单次获取 1w 行数据

⬤ 根据主键/唯一键记录获取数据的位置;若没有主键,执行整表查询

2)增量阶段 Input

单线程从源库 Dump Binlog

  • Write_rowsDelete_rowsUpdate_rows
  • 解析 Binlog,结合源库表结构,构造 msg,提交给 Scheduler

3)Scheduler

根据 msg 的库、表、主键 hash,将 msg 路由至指定的队列

4)Output

从对应的 执行队列中 获取 msg,根据 msg 的情况进行合并操作:

⬤ 对于单表连续批量的 insert msg,会合成一条SQL:insert into table values (),(),();

⬤ 全量阶段,为批量的 Insert数据,所以合并率较高;

⬤ 增量阶段,不同表的 insertupdatedelete操作混合在一起,整体合并率较低(单线程操作,保证顺序)

ContactAuthor