开发者社区> 问答> 正文

关于 SlaveId 碰撞问题

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

展开
收起
绿子直子 2023-05-09 15:38:05 108 0
1 条回答
写回答
取消 提交回答
  • 最新的版本已经设置了slave_uuid

    原回答者GitHub用户agapple

    2023-05-10 10:42:49
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载