Mysql 会认为拥有同一个 SlaveId 的 connection 都来自同一个从库,因而在两个具有相同 SlaveId 的 canal instance 对同一个 Mysql Master 发起 dump 请求时,必定会有一个 instance 会失败 && 反复重试。
这个错误在 Mysql 中报出来的是 1236,但是并不能通过查找 binlog 异常来解决。 这种情况下,只能重新生成新的 SlaveId。例如这样:
canal.parse: MysqlEventParser.java
@Override
protected void processDumpError(Throwable e) {
if (e instanceof IOException) {
String message = e.getMessage();
if (StringUtils.contains(message, "errno = 1236")) {
// 1236 errorCode 代表 ER_MASTER_FATAL_ERROR_READING_BINLOG
// 但也有可能是 slaveId 冲突, 在这里作预先补救
if (StringUtils.contains(message, "errmsg = A slave with the same server_uuid/server_id as this slave has connected to the master")) {
// 重新生成 slaveId
long new_slave_id = new Random().nextLong();
logger.warn("SlaveId Conflict is detected: Old slave id = [{}], new slave id = [{}]", this.slaveId, new_slave_id);
this.slaveId = new_slave_id;
return;
}
dumpErrorCount++;
}
}
super.processDumpError(e);
}
可能能够减少一点手工改配置的工作?
原提问者GitHub用户ForaLake
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。