原主库恢复后无法以从库身份加入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
- 对比现象:晋升后的新主库关闭重启后,可正常以从库身份重新加入集群
根因分析
原主库重启后,复制配置仍指向自身:
- 原主库
db的Docker配置中挂载了initSlaves.sql,该脚本执行CHANGE MASTER TO MASTER_HOST='db'(db是原主库自己的容器名) - Docker MariaDB的
docker-entrypoint-initdb.d脚本仅在首次创建容器时执行,后续重启不会重置配置;原主库的master.info文件已保存了指向自身的复制配置 - 重启后,原主库尝试作为从库连接自己,导致Server ID(3001)与主库Server ID完全一致,触发复制冲突
新主库重启正常的原因:它原本是从库,指向原主库;晋升为主后,复制配置被MaxScale重置,重启时不会出现自连接的情况
解决方案
方案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 - 清理现有容器与数据卷(重置集群状态):
docker-compose down -v docker-compose up --build
方案2:手动修复已运行的原主库
若不想重新部署,可直接进入原主库容器重置复制配置:
- 进入原主库容器:
docker exec -it db mysql -uroot -p123456 - 停止从库线程并清空复制配置:
STOP SLAVE; RESET SLAVE ALL; - 将原主库配置为新主库的从库(替换
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
相关产品推荐
相关产品推荐

