管道任务待同步数问题排查

  • 文档创建者:Wendy123456
  • 历史版本:3
  • 最近更新:Wendy123456 于 2024-05-06
  • 1. 概述

    本文为您介绍管道任务「待同步数」相关问题。

    注:待同步数」更多介绍请参见:统计日志

    读取总量=待同步量+输出总量+脏数据量

    2.png

    2. 什么是待同步量

    待同步就是就是没有写入数据库,正准备写的数据,可能正常写入,可能写入失败。

    3. 待同步量显示为负数,且一直不消失

    问题描述:

    管道任务待同步量为负数。如下图所示:

    3.png

    原因分析:

    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。

    4.png

    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 中。

    6.png

    3)在来源库中,根据目标库设置的主键查找是否存在重复值。

    SELECT char1,COUNT(char1) FROM type_test_common_copy GROUP BY char1 HAVING COUNT(char1) > 1

    7.png

    可查到具体是哪些值存在重复值,以及有多少重复值。

    注:修正来源库的数据后,待同步的数量不会变更,只有新建管道任务,或者重新同步(只有当存在脏数据时,才可以触发重新同步)。


    附件列表


    主题: 数据开发-定时任务
    • 有帮助
    • 没帮助
    • 只是浏览
    • 评价文档,奖励 1 ~ 100 随机 F 豆!