我用的Canal版本是 1.0.22。
我们在分析MySQL replication时可能出现的LOST_EVENTS。我查看了一下源码,感觉Canal不支持LOST_EVENTS的处理,而是在读取到这个event后,在将其转换成Entry时给丢掉了。请问Canal是特意设计成这样的行为的吗,或是我们理解有误?
我们分析的如下代码:
在LogDecoder.java中, INCIDENT_EVENT 是会被读取到的。
case LogEvent.INCIDENT_EVENT: { IncidentLogEvent event = new IncidentLogEvent(header, buffer, descriptionEvent); /* updating position in context */ logPosition.position = header.getLogPos(); return event; }
但是在 LogEventConvert.java 中的 parse 方法,并没有处理这个INCIDENT_EVENT。
public Entry parse(LogEvent logEvent) throws CanalParseException { if (logEvent == null || logEvent instanceof UnknownLogEvent) { return null; }
int eventType = logEvent.getHeader().getType();
switch (eventType) {
...... ( 这里没有 case LogEvent.INCIDENT_EVENT)
}
是不是 Canal 认为,即使读取到这个事件,consumer拿到也无能为力,所以就主动丢弃了? 如果能主动报一个告警会不会有帮助?
原提问者GitHub用户stone-cheng
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
当时刻意没加,canal的设计是尽可能抽取DML/DDL/DCL的部分内容,并没有全处理所有mysql事件
原回答者GitHub用户agapple