记录一次flink消费kafka数据进行oracle数据同步问题

背景

oracle数据同步项目。在同步过程中偶发插入或者更新数据后数据立即会进行删除。导致同步失败;

基本技术架构

oracle触发器

进行数据的增删改查时将数据变更情况写入一张日志表

flume

采集日志表。使用sql插件

kafka

信息中间件

flink

进行流处理,使用侧输出流

问题

数据同步的逻辑是:

1.在kafka中获取到数据后使用测输出流进行分发
2.使用duutils进行数据连接管理 但是不是使用连接池来进行管理 只是使用queryrunneer进行数据库的增上改查 因为数据库连接池是由连接池进行管理连接的 自动管理过程中可能造成事务上的错误 所以自建连接来进行数据的增删改
3.每个事件中如果标识为delete的话会进行delete from …
而update以及insert 先用merge into 语句进行分流 再查询是否有相同数据 将相同数据进行排序 将除了第一条外的所有数据进行更改(改变同步标识。字段为1的话oracle触发器就会排除此条数据到日志表中,防止同步数据的无限循环)再删除上面更新的数据

问题描述

数据更新后可能会发生一个事件执行一条sql后插入了两条数据。那么这样的话就会造成删除操作
这种问题可能是网络或者其他问题 会造成这种哦仍然发生 具体原理不知

解决问题以及一些知识点

解决

在触发器中判断delete之前的标识 从源头停止删除后的继续同步
之前delete未进行标识判断

一些知识点

flink的并行度与kafka分区数量的对应关系:
查看源码可知 kafka的分区数会除以flink的并行度进行决定某个分区被哪个进程(消费者)消费。将并行度调整为和kafka分区数量一致 保持最好的性能
而生产者多个线程共享一个缓冲区进行发送数据

你可能感兴趣的:(记录)