1. 概述
2. 什么是待同步量
待同步就是就是没有写入数据库,正准备写的数据,可能正常写入,可能写入失败。
3. 待同步量显示为负数,且一直不消失
问题描述:
管道任务待同步量为负数。如下图所示:
原因分析:
FDL 使用 Kafka 作为数据同步的中间件,暂存来源数据库中的数据。
管道增量同步阶段读取到数据后,会把数据发送到 Kafka。Kafka 为了提高吞吐量,默认的发送机制是按批发送,异步发送。即通过 Kafka 的生产者发送数据时,调用完发送方法之后,Kafka 不会立刻把数据发送出去,而是先把数据放在内存的缓存中,等待一定时间或者缓存的数据达到一定数据量之后,按批发送出去,从而提高吞吐量。
既然是异步发送,FDL 如何知道数据发送成功了?Kafka 会在数据发送成功时为每条消息执行一次回调方法,在这个回调方法中,FDL 可以把发送成功的数据记作「已读取」的数据。
当 FDL 被 kill -9 杀掉,FDL 服务器突然断电,Kafka 服务器突然断电等情况,有可能已经成功发送了 100 条数据到 Kafka,但是回调方法只执行到第 50 条 FDL 就挂了,这个时候,实际发送成功的数据是100,但是 FDL 记录的「已读取」数据是 50 ,下次任务重启的时候,写入端会正常写入和记录这 100 条数据,但是 FDL 这边只记录了 50 条「已读取」,已读取减去已写入,待同步就变成了 -50。
「待同步数据量」=已读取数据量-已写入数据量-脏数据量
解决方案:
用户若需要对 tomcat 或者 kafka 重启,需要提前暂停管道任务后,再进行重启。若不规范操作,可能会导致待同步量为负数。
其他说明:
还有其他原因可能导致该现象:
1)重新同步的时候,如果源端数据变化比较频繁,可能导致待同步负数。
2)任务在停止状态下点击脏数据重跑,重新同步完成后可能造成待同步负数。
3)等等。
用户可联系技术支持进行排查解决。
4. 待同步量显示为正数,且一直不消失
原因分析:
因为记录「已读取」和「数据实际发送到Kafka」的顺序有问题。
在发送的数据被 Kafka 确认收到之前就记录了「已读取」,这样,暂停任务时,中断了向 Kafka 的发送,就可能会导致记录的「已读取」比实际发送到 Kafka 的数据多。
比如,记录了已发送 1000 条,但是实际上只发送到了 Kafka 500 条数据,还有 500 条数据是在 FDL 的缓存中还没发出去,停止任务时被舍弃了。任务下次启动的时候,写入端最多消费 500 条数据,最多记录已写入为 500 条,这时前端显示的待同步数量为已读取数量减去已写入数量,为 500,一直消不掉。
解决方案:
记录「已读取」的时间修改一下,等数据被 Kafka 确认收到之后,再记录「已读取」数量。
其他说明:
该现象还有其他原因:
用户可联系技术支持进行排查解决。
1)比如写入端写入速度较慢,读取速度远大于写入速度时,也会出现这种现象。
2)增量同步数据量非常大,超过了目前 Kafka 设置的单表缓存最大值(10GB)且消费速度远远落后于数据产生速度,可能导致因为先进先出原因导致已读取大于已写入。
3)源表没有主键,在管道的目标表中指定了一个逻辑主键,但是该逻辑主键不能保证数据唯一性。在全量同步阶段会因为清表重写情况下主键冲突数不会记录的问题,导致全量同步之后已读取和已写入数据对不上。
4)用户在数据管道前端点击脏数据重跑的时候,数据管道正处于增量同步的初始化阶段,此时重新同步操作访问了一些还没有完成初始化的变量,重新同步操作在持有锁的情况下报错,导致持有的锁没有释放,从而导致了后续的死锁。
5)等等。
若为第三种原因,可参考以下方法查找具体是哪些值存在重复值,以及有多少重复值,便于修正来源库的数据。
多表的情况下定位到是哪张表存在待同步数(若仅有一张表,可忽略此步骤)。
1)查看 FineDB 中管道任务执行记录表fine_dp_pipeline_execute,根据任务ID(TASK_ID)找到执行记录表中对应数据。
进入对应管道任务页面,F12,查看请求,找到任务ID。
2)任务ID即对应表中的TASK_ID字段,运行 SQL:SELECT task_id,table_full_name,to_sync_record_count FROM fine_dp_pipeline_execute WHERE task_id = '501ac652-ee4b-4257-9a21-044978ef9da8'得出待同步数都在表 type_test_common_copy 中。
3)在来源库中,根据目标库设置的主键查找是否存在重复值。
SELECT char1,COUNT(char1) FROM type_test_common_copy GROUP BY char1 HAVING COUNT(char1) > 1
可查到具体是哪些值存在重复值,以及有多少重复值。
注:修正来源库的数据后,待同步的数量不会变更,只有新建管道任务,或者重新同步(只有当存在脏数据时,才可以触发重新同步)。