searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

开源数据库同步工具otter源码浅析

2024-11-08 09:21:23
2
0

整体架构图

 

 

项目目录

 

 

 

setl分析

整体Uml类图

 

增量同步接口调用逻辑图

 

Select

详细流程分析(基于内存和canal

 

调度模型

1. 正常运行调度流程

假如并行度为3

----------------------------------------------------------->时间轴

| ProcessSelect

--> 1

  --> 2

       -->3

           --> 1

| ProcessTermin

 ---> 1 ack

      ----> 2ack

             ---> 3ack

a. ProcessSelect拿到数据后,丢入pool池进行异步处理,并通知ProcessTermin顺序接收termin信号

b. 同一时间在s/e/t/l流水线上的数据受并行度控制,满了就会阻塞ProcessSelect,避免取过多的数据,只会多取一份,等待其中一个s/e/t/l完成

c. ProcessTermin接受到termin信号

i. 会严格按照发出去的batchId/processId进行对比,发现不匹配,发起rollback操作.

ii. 会根据terminType判断这一批数据是否处理成功,如果发现不成功,发起rollback操作

 

2. 异常调度流程

假如并行度为3

|-->1 --> 2 -->3(ing)

a. 当第1份数据,ProcessTermin发现需要rollback,此时需要回滚2,3份数据的批次. (可能第2,3份数据还未提交到s/e/t/l调度中)

i. 如果2批次数据已经提交,等待2批次termin信号的返回,此时需要阻塞ProcessSelect,避免再取新数据

ii. 如果第2批次数据未提交,直接rollback数据,不再进入s/e/t/l调度流程

b. 当所有批次都已经处理完成,再通知ProcessSelect启动 (注意:这里会避免rollbackget并发操作,会造成数据不一致)

 

3. 热备机制

a. Select主线程会一直监听mainstem的信号,一旦抢占成功,则启动ProcessSelect/ProcessTermin线程

b. ProcessSelect/ProcessTermin在处理过程中,会检查一下当前节点是否为抢占mainstem成功的节点,如果发现不是,立马停止,继续监听mainstem

c. ProcessSelect进行get数据之前,会等到ProcessTermin会读取未被处理过termin信号,对上一次的selector进行ack/rollback处理

  i. 注意:ProcessSelect进行get数据时,需要保证batch/termin/get操作状态保持一致,必须都处于同一个数据点上

 

细节解析

1、select是如何保证同步?

select始终只有一个子线程来拉数据,不像etl会同时创建多个线程。单线程肯定是同步的

 

2、select如何控制并发度?

使用阻塞队列,初始化的时候在阻塞队列创建固定并发度数量的资源:

 

后续都通过load线程来进行生产/消费

 

 

 

 

Extract

执行步骤

 

 

Transform

执行步骤

1

 

 

 

 

 

 

 

 

0条评论
0 / 1000
宋****祥
4文章数
0粉丝数
宋****祥
4 文章 | 0 粉丝
原创

开源数据库同步工具otter源码浅析

2024-11-08 09:21:23
2
0

整体架构图

 

 

项目目录

 

 

 

setl分析

整体Uml类图

 

增量同步接口调用逻辑图

 

Select

详细流程分析(基于内存和canal

 

调度模型

1. 正常运行调度流程

假如并行度为3

----------------------------------------------------------->时间轴

| ProcessSelect

--> 1

  --> 2

       -->3

           --> 1

| ProcessTermin

 ---> 1 ack

      ----> 2ack

             ---> 3ack

a. ProcessSelect拿到数据后,丢入pool池进行异步处理,并通知ProcessTermin顺序接收termin信号

b. 同一时间在s/e/t/l流水线上的数据受并行度控制,满了就会阻塞ProcessSelect,避免取过多的数据,只会多取一份,等待其中一个s/e/t/l完成

c. ProcessTermin接受到termin信号

i. 会严格按照发出去的batchId/processId进行对比,发现不匹配,发起rollback操作.

ii. 会根据terminType判断这一批数据是否处理成功,如果发现不成功,发起rollback操作

 

2. 异常调度流程

假如并行度为3

|-->1 --> 2 -->3(ing)

a. 当第1份数据,ProcessTermin发现需要rollback,此时需要回滚2,3份数据的批次. (可能第2,3份数据还未提交到s/e/t/l调度中)

i. 如果2批次数据已经提交,等待2批次termin信号的返回,此时需要阻塞ProcessSelect,避免再取新数据

ii. 如果第2批次数据未提交,直接rollback数据,不再进入s/e/t/l调度流程

b. 当所有批次都已经处理完成,再通知ProcessSelect启动 (注意:这里会避免rollbackget并发操作,会造成数据不一致)

 

3. 热备机制

a. Select主线程会一直监听mainstem的信号,一旦抢占成功,则启动ProcessSelect/ProcessTermin线程

b. ProcessSelect/ProcessTermin在处理过程中,会检查一下当前节点是否为抢占mainstem成功的节点,如果发现不是,立马停止,继续监听mainstem

c. ProcessSelect进行get数据之前,会等到ProcessTermin会读取未被处理过termin信号,对上一次的selector进行ack/rollback处理

  i. 注意:ProcessSelect进行get数据时,需要保证batch/termin/get操作状态保持一致,必须都处于同一个数据点上

 

细节解析

1、select是如何保证同步?

select始终只有一个子线程来拉数据,不像etl会同时创建多个线程。单线程肯定是同步的

 

2、select如何控制并发度?

使用阻塞队列,初始化的时候在阻塞队列创建固定并发度数量的资源:

 

后续都通过load线程来进行生产/消费

 

 

 

 

Extract

执行步骤

 

 

Transform

执行步骤

1

 

 

 

 

 

 

 

 

文章来自个人专栏
数据迁移同步
2 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0