记flink sql cdc消费kafka数据,sink到pg表数据漏数排查[原因分析]
flink sql
insert into t3
select
cast(t1.a as varchar(100)) || cast(t1.b as varchar(100)) as id, -- 组合主键id
t1.a
,t1.b
,t2.c
,sum(d)
from t1
join t2 on t2.id = t1.id
group by t1.a,t1.b,t2.c
现象与环境描述
1、flink 版本:1.12.2 、1.13.2
2、debezium 采集pg数据到kafka , flink 读取kafk数据[模式:upsert-kafka]
3、任务并行度为1
问题描述
1、sink 到 pg 表 , pg 表某些id数据丢失
2、t2.c 字段值发生变更;如:'aa' 变更为 'bb'
3、sink 到 kafka 分区不不变[可能会分发到其他分区,需要验证flink sink 到kafka的数据分发逻辑是按照group by 还是按照主键字段分发分区] , 大佬们知道的也可以在评论下方讲解一下哈
问题验证步骤如下
1、增加 sink 到kafka , 用来与sink到pg做对比
2、在更新t2.c字段值前,kafka 存在一条记录,假设offset是100, 分区为1
3、更新t2.c字段值后,kafka 接收到 一条 insert 和 null 的数据,假设offset分别是:101,102 , 分区 1
kafka上数据看下图
根据以上三点可以判断修改t2.c字段值会导致数据乱序, pg 表先进行insert 再 delete ,进而使update对应的记录回撤[delete] , 而不是先delete再insert ,如此就导致了pg表漏数