You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

原主库恢复后无法以从库身份加入MaxScale集群的问题

问题:MariaDB原主库重启后复制报Server ID冲突错误

环境与现象

  • 架构:Docker Compose部署Tomcat API + MaxScale + 3节点MariaDB(1主2从,Server ID分别为3001/3002/3003)
  • 主从复制已配置,MaxScale可正常识别集群状态
  • 异常场景:关闭原主库(3001)后,从库成功晋升为新主;但重启原主库时,触发以下复制错误:
db   | 2023-07-07  6:58:11 5 [ERROR] Slave I/O: Fatal error: The slave I/O thread stops because master and slave have equal MariaDB server ids;
these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
Internal MariaDB error code: 1593
  • 对比现象:晋升后的新主库关闭重启后,可正常以从库身份重新加入集群

根因分析

原主库重启后,复制配置仍指向自身:

  1. 原主库db的Docker配置中挂载了initSlaves.sql,该脚本执行CHANGE MASTER TO MASTER_HOST='db'(db是原主库自己的容器名)
  2. Docker MariaDB的docker-entrypoint-initdb.d脚本仅在首次创建容器时执行,后续重启不会重置配置;原主库的master.info文件已保存了指向自身的复制配置
  3. 重启后,原主库尝试作为从库连接自己,导致Server ID(3001)与主库Server ID完全一致,触发复制冲突

新主库重启正常的原因:它原本是从库,指向原主库;晋升为主后,复制配置被MaxScale重置,重启时不会出现自连接的情况

解决方案

方案1:修正初始化配置(彻底解决)

  1. 移除原主库db的initSlaves.sql挂载,主库无需配置为从库:
    修改Docker Compose中db服务的volumes段:
    volumes:
      - ./Database/init.sql:/docker-entrypoint-initdb.d/init.sql
      # 删除以下行:主库不需要执行从库初始化脚本
      # - ./Database/initSlaves.sql:/docker-entrypoint-initdb.d/initSlaves.sql
    
  2. 清理现有容器与数据卷(重置集群状态):
    docker-compose down -v
    docker-compose up --build
    

方案2:手动修复已运行的原主库

若不想重新部署,可直接进入原主库容器重置复制配置:

  1. 进入原主库容器:
    docker exec -it db mysql -uroot -p123456
    
  2. 停止从库线程并清空复制配置:
    STOP SLAVE;
    RESET SLAVE ALL;
    
  3. 将原主库配置为新主库的从库(替换db2为实际晋升后的主库容器名):
    CHANGE MASTER TO
      MASTER_HOST='db2',
      MASTER_USER='repluser',
      MASTER_PASSWORD='123456',
      MASTER_PORT=3306,
      MASTER_CONNECT_RETRY=10;
    START SLAVE;
    

方案3:配置MaxScale自动管理集群(推荐)

在MaxScale配置文件my-maxscale.cnf中开启自动故障转移与自动重加入功能,让MaxScale自动处理主从切换后的复制配置更新:

[mariadbmon]
type=monitor
module=mariadbmon
servers=db,db2,db3
user=maxscale
password=maxscale
monitor_interval=2000
auto_failover=1
auto_rejoin=1  # 开启自动将下线节点重新加入集群

配置完成后,原主库重启后会被MaxScale自动识别并配置为新主库的从库,无需手动干预


内容的提问来源于stack exchange,提问作者Paulo Barbosa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 17:07:30