先说个真实场景。上个月我帮一个客户做架构改造,他们原本是标准的一主两从架构——主库承担写入,两个从库各自拉主库的 binlog 做复制,一个用于实时报表,一个用于备份。后来随着业务量上来,主库的 dump 线程压力明显增加,而且其中一个从库要单独拉出去给大数据团队做数据源,需要尽可能减少对主库的复制链路挤占。当时我们就决定把架构从“一主两从”改成“主库 → 从库A → 从库B”的级联复制。
改完不到两周,另一个同事又找我说,级联链路中继节点磁盘告警,想临时把从库B重新挂回主库,也就是从级联切回一主两从。这一来一回,正好把“基于位点的架构切换”这个操作完整踩了一遍。
这篇文章就把这两次切换的完整过程、背后的位点原理、以及我在操作中踩过的坑,一次性讲清楚。不管你是刚接触 MySQL 主从复制,还是已经维护过一段时间主从环境,这篇文章都值得收藏,尤其是那些准备在现网环境做架构调整的同学,能帮你少走不少弯路。
1. 为什么要在“一主两从”和“级联”之间来回切
1.1 两类架构的核心差异
先看两张拓扑图对应的复制关系。
一主两从,是最常见的复制架构:
code复制主库(Master) ----→ 从库A(Slave A)
----→ 从库B(Slave B)
两个从库各自独立连接主库,分别从主库拉取 binlog,主库需要为每个从库各开一个 dump 线程。从库之间彼此独立,互不影响。
级联架构则多了一个层级关系,我这次使用的是单级级联:
code复制主库(Master) ----→ 中继从库(Relay Slave)
----→ 二级从库(Secondary Slave)
主库只面对一个从库(中继从库),中继从库继续把从主库接收到的 binlog 转发给二级从库。这个过程中,中继从库既要执行 SQL 线程应用日志,又要作为二级从库的 master 继续传输日志,因此它会成为新的日志源,本身会开启 log_slave_updates 来确保中继日志继续向下游传递。
两者的核心差异,我用一张表来对比:
| 对比维度 | 一主两从 | 级联复制 |
|---|---|---|
| 主库 dump 线程数 | 2 个 | 1 个 |
| 主库 IO 压力 | 相对较高 | 相对较低 |
| 从库获取日志路径 | 直接连主库,路径短 | 经过中继节点,路径长 |
| 整体延迟 | 路径短,延迟通常更低 | 每多一级,延迟线性增加 |
| 对中继节点的依赖 | 不依赖其他从库 | 中继节点故障会影响下游 |
| 运维复杂度 | 低,各节点独立 | 中继节点需要额外关注 |
| 适用场景 | 从库数量少、主库压力可接受 | 从库数量多、跨机房、需要分担主库压力 |
1.2 正向切换的常见动机
我在帮客户做这次切换前,他们其实已经就这个问题讨论了很久。最终促使他们下决心的因素有三个:
第一个因素,主库 dump 线程压力。 他们原本只有两个从库,主库压力虽然存在但还能接受。但随着报表团队在从库A上跑越来越多的复杂查询,从库A经常出现短暂延迟,从库B(备份节点)反而没有影响。这说明从库A的查询负载已经影响了日志消费和应用速度。把从库B挪到从库A下面后,主库只需要给从库A一个人喂日志,dump 线程的压力直接减半。
第二个因素,跨机房规划。 客户的从库B其实在另一个机房,专线带宽并不稳定。之前从库B直接连主库,一旦专线抖动,复制就中断。改成级联后,从库B只需要和从库A所在的同一机房通信,减少了跨机房链路的脆弱性。
第三个因素,备份链隔离。 从库B是备份节点,每天凌晨要跑全量备份。备份期间如果直接从主库拉日志,主库的 dump 线程会受到备份 IO 的影响。挂在从库A下面后,备份的流量完全隔离在从库A的出口方向上,主库完全不受影响。
1.3 反向切换的常见动机
有人说,既然级联能减少主库压力,为什么不一直用级联?答案很简单:级联带来了新问题。
第一个问题,延迟放大。 从库B的复制延迟,是“主库 → 从库A”的延迟加上“从库A → 从库B”的延迟。在主库正常情况下这个延迟很小,但一旦从库A上有大查询或者备份任务,从库B的延迟就会成倍上涨。
第二个问题,中继节点成为单点。 有一次从库A的磁盘接近写满,导致中继日志无法及时清理,从库A的复制进度停滞。结果从库B紧跟着延迟告警。正常情况下,一主两从中一个从库故障不会影响另一个,但级联架构下,中继节点故障会直接拉胯所有下游从库。
第三个问题,应急恢复路径变长。 如果主库出现意外需要切换,级联架构下的故障转移流程比一主两从复杂不少。所以很多团队在平时使用级联分担压力,遇到大促或者变更窗口,反而会临时把级联解开,切回一主两从,让每个从库都保持最短复制路径。
明白了这个背景,下面进入真正的技术环节——基于位点的切换具体怎么做。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动手前必须搞懂的位点基础
2.1 什么是“位点”
MySQL 主从复制的核心是 binlog。主库的每一个写操作都会按顺序写入 binlog 文件,每个事务对应一个起始偏移量。这个“binlog 文件名 + 文件内偏移量”就构成一个位点(position),它是复制能够精确衔接的唯一标识。
举个例子,mysql-bin.000012 这个 binlo
