环境信息
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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。