【MySQL】基于位点的架构切换实战:一主两从↔级联
在 MySQL 主从复制架构中,基于位点的切换是保障数据一致性的核心方案,适用于 “一主两从” 与 “级联架构”(主→从 1→从 2)的灵活转换。本文将详细拆解切换原理、分步操作流程及验证方法,帮助你快速落地实践。
核心原理
架构切换的关键在于精准记录和对齐 Binlog 位点:通过同步所有从库到同一数据节点,再重新配置复制关系,确保切换前后数据无丢失、无不一致。核心原则是 “先对齐位点,再切换主库”。
环境说明
| 角色 | IP 地址 | 核心作用 |
|---|---|---|
| 主库 | 192.168.184.151 | 核心写节点,同步日志到从库 |
| 从库 1 | 192.168.184.152 | 级联架构中的中间转发节点 |
| 从库 2 | 192.168.184.153 | 二级从库,灵活切换主库 |
| 复制账号 | repl/Uid_dQc63 | 所有从库的复制授权账号 |
一、一主两从 → 级联架构(主→从 1→从 2)
应用场景
当主库压力过大时,将从库 2 的同步源从主库改为从库 1,减少主库的复制连接数,降低 IO 压力。
步骤 1:统一数据位点(关键前置操作)
- 停止从库 2 复制:避免切换期间数据偏移
-- 从库2(192.168.184.153)执行
stop slave;
- 记录从库 1 的主库同步位点:确保从库 2 对齐该节点
-- 从库1(192.168.184.152)执行
stop slave;
-- 记录核心参数(主库的Binlog文件和位置)
show slave status\G;
-- 需记录:
-- Relay_Master_Log_File: mysql-bin.000013(从库1同步到的主库Binlog)
-- Exec_Master_Log_Pos: 729(对应主库的Binlog位置)

- 恢复从库 1 复制:避免影响其同步主库
-- 从库1执行
start slave;
- 从库 2 同步到目标位点:与从库 1 对齐主库数据
-- 从库2执行,同步到主库的指定位点后自动停止
start slave UNTIL MASTER_LOG_FILE="mysql-bin.000013", MASTER_LOG_POS=729;
- 验证状态:
show slave status\G中Slave_SQL_Running: No为正常(已同步到目标位点)

步骤 2:从库 2 切换主库为从库 1
- 获取从库 1 的当前 Binlog 位点:作为从库 2 的新同步起点
-- 从库1执行
show master status\G;
-- 示例输出(需记录):
-- File: mysql-bin.000014(从库1的Binlog文件)
-- Position: 738(从库1的Binlog位置)

- 重新配置从库 2 的复制关系
-- 从库2执行
stop slave;
-- 切换主库为从库1
CHANGE MASTER TO
MASTER_HOST='192.168.184.152', -- 新主库IP(从库1)
MASTER_USER='repl',
MASTER_PASSWORD='Uid_dQc63',
MASTER_LOG_FILE='mysql-bin.000014', -- 从库1的Binlog文件
MASTER_LOG_POS=738; -- 从库1的Binlog位置
-- 启动复制
start slave;

步骤 3:验证级联架构
- 基础状态验证:从库 2 执行
show slave status\G,需满足:Slave_IO_Running: YesSlave_SQL_Running: Yes

- 数据同步测试:主库插入数据,从库 1 和从库 2 均需同步成功:
-- 主库执行插入操作
use maria;
insert into repl_test select 222;
-- 从库1和从库2分别查询,均需返回222
select * from repl_test;

二、级联架构 → 一主两从(主→从 1、主→从 2)
应用场景
级联架构中从库 1 故障或需恢复主库直接同步时,将从库 2 的同步源改回主库。
步骤 1:记录关键位点(确保数据一致)
- 从库 1 记录主库同步位点:
-- 从库1执行
stop slave;
-- 记录主库的同步位点(与自身Binlog位点对齐)
show master status\G; -- 示例:mysql-bin.000014, 1078
show slave status\G; -- 验证一致性:
-- Relay_Master_Log_File=mysql-bin.000013(主库Binlog)
-- Exec_Master_Log_Pos=1067(主库Binlog位置)

2. 从库 2 记录从库 1 的同步位点:
-- 从库2执行
show slave status\G;
-- 需确认:Relay_Master_Log_File和Exec_Master_Log_Pos与从库1的Binlog文件和Binlog位置一致

3. 恢复从库 1 复制:
-- 从库1执行
start slave;
步骤 2:从库 2 切换主库为主库
从库 2 重新配置复制关系(主库改为主库):
-- 从库2执行
stop slave;
-- 重新配置主库为原主库(192.168.184.151)
CHANGE MASTER TO
MASTER_HOST='192.168.184.151',
MASTER_USER='repl',
MASTER_PASSWORD='Uid_dQc63',
MASTER_LOG_FILE='mysql-bin.000013', -- 主库的Binlog文件(从库1记录的)
MASTER_LOG_POS=1067; -- 主库的Binlog位置(从库1记录的)
-- 启动复制
start slave;

步骤 3:验证一主两从架构
- 状态验证:从库 2 执行
show slave status\G,确保 IO 和 SQL 线程均为 Yes。

- 数据同步测试:主库插入数据,验证从库 1 和从库 2 均能正常同步。

避坑指南
- 位点必须精准:Binlog 文件名和位置错误会导致数据不一致,建议多次核对。
- 操作顺序不可乱:必须先停止相关从库复制,再记录位点,避免位点漂移。
- 同步状态检查:切换后务必验证
Slave_IO_Running和Slave_SQL_Running状态,以及数据一致性。 - 权限提前确认:复制账号需具备
REPLICATION SLAVE权限,避免连接失败。
总结
基于位点的 MySQL 架构切换核心是 “位点对齐 + 关系重配”,通过严格的步骤控制可实现零数据丢失切换。无论是降低主库压力的级联架构,还是恢复高效同步的一主两从架构,都需牢记 “先对齐数据,再切换主库” 的原则,确保架构迁移稳定可靠。



