开发者社区> 问答> 正文

GTID确认位点信息同时开启MQ同步数据到队列,ZK中未记录cursor节点

环境信息

canal version 1.1.4 mysql version

问题描述

说明: 下文中 tx = transaction

1、如果设置了 canal.instance.filter.transaction.entry = true, 则EntryEventSink在doSink时,会根据tx begin与end之间间隔的时间是否小于配置值,将某些tx的binlog过滤掉。(此行为导致tx end被大量过滤,tx begin被保存到了MemoryEventStoreWithBuffer中。

2、Canal在每一次客户端拉取数据时,会在返回的数据中查找可以用于作为ACK标志位的binlog数据,并存储在MetaManager中。默认使用tx begin、end或ddl。但如果使用GTID记录位点信息时,tx begin不可以作为ACK标志位。

3、Canal客户端做ACK时,根据batchId在对应的MetaManager中查找此batch对应的可以作为ACK的binlog信息,会返回一个ACK属性为null的CanalServerWithEmbbeded在发现ACK为null的时候,会直接放弃记录ACK的行为。

4、CanalMQStarter启动时,如果filterTransactionEntry属性为true(此属性默认值也为true),则直接将canal.instance.filter.transaction.entry = true设置到了System.Properties中。Canal启动时默认的bast-instance.xml中,将systemPropertiesModeName设置为了SYSTEM_PROPERTIES_MODE_OVERRIDE

5、基于上述4个条件,一旦1.1.4版本使用GTID确认位点信息,且使用了内置的MQ发送机制,则ZK只会记录DDL语句的binlog位点信息,tx end信息不会被记录

感觉这个操作是因为,canal希望为MQ接收方提供不用处理TX的binlog。如果是这个目的,那么应该在发送数据到队列时将TX binlog过滤掉才对,而不应该直接写道System.Properties中

原提问者GitHub用户ABRUZI

展开
收起
山海行 2023-04-27 11:20:39 93 0
1 条回答
写回答
取消 提交回答
  • 这个问题已经修复过,可以下载最新版本

    原回答者GitHub用户agapple

    2023-04-27 21:03:38
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
RocketMQ Client-GO 介绍 立即下载
RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载
基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载