主从复制不是简单复制数据文件,而是复制已经提交的变更事件。源库写 binlog,副本拉取后写 relay log,再由 SQL 应用线程重放,这条链路上每一段都有自己的边界。

理解复制,不能只停在“主库写、从库同步”。真正要看的,是 binlog 格式、GTID、relay log、应用线程和切换边界如何共同决定延迟、一致性和恢复能力。

先把机制边界说清楚

MySQL 复制的核心是把源库已经提交的变更记录到 binlog,再由副本拉取并写入 relay log,最后由 SQL 应用线程在副本上重放。它复制的是变更事件,不是简单复制数据文件。

整体路径

主从复制:binlog 怎么变成从库数据

上面这张图先看粗线条:宏观上,复制链路有三段:源库事务提交时写 binlog;副本 I/O 线程从源库读取 binlog 并落到 relay log;副本 SQL 线程或多线程 applier 按顺序应用事件。任何一段慢下来,都会表现为复制延迟或断链。

底层流程

主从复制:binlog 怎么变成从库数据:执行路径

底层拆解先看数据结构。「主从复制」至少涉及下面几类结构:

  • binlog:源库提交后的逻辑变更日志,也是复制的源头。
  • relay log:副本本地保存的待应用日志。
  • GTID:全局事务标识,用来描述事务复制进度和断点。
  • applier worker:副本上真正执行复制事件的线程。

再看完整执行流程:

  1. 源库事务提交,按一致性要求写入 binlog。
  2. dump 线程把 binlog 事件发送给副本。
  3. 副本 I/O 线程接收事件并写入 relay log。
  4. SQL coordinator 分发事件给应用线程。
  5. 副本重放事件,更新复制元数据和 GTID 集合。

取舍与边界

版本差异上,MySQL 5.7 已经具备较成熟的 GTID 和多线程复制能力。MySQL 8.0 在复制元数据表、并行复制、崩溃恢复、源/副本术语和可观测性上继续增强,但异步复制的基本语义仍然是先提交源库,再由副本追赶。

主从复制的短板是它默认不提供强一致读。源库提交成功不代表副本马上可见;大事务、DDL、网络抖动、从库慢 SQL 都可能拉开差距。切主时如果没有明确的 GTID 边界和数据校验,还可能把隐性不一致带到新拓扑。

典型问题:用机制化例子排查

读写分离问题要先承认复制是异步链路。写入在主库提交,不等于副本已经重放完成;一致性敏感的读请求,必须有主库读、等待位点或降级策略。

可以落到这些动作:

  • 按一致性要求划分读请求,写后读、支付状态和库存确认优先走主库或等待复制位点。
  • 启用 GTID 管理复制拓扑,降低断点续传和故障切换复杂度。
  • 复制链路同时监控 IO 线程、SQL 应用线程和 relay log 积压。
  • 大事务和 DDL 避免直接冲击复制链路,必要时拆批或低峰执行。

收束:复制不是透明缓存

主从复制不是一个透明缓存层,而是一条异步日志回放链路。架构上要先定义一致性边界,再谈读写分离收益。


关于十三Tech

我是十三,All in AI Agent 方向的架构师,专注 AI 工程实践。

我相信 AI 是程序员的最佳搭档,也希望帮助每一位开发者更好地驾驭 AI。

如果你想继续跟完这套「图解 MySQL」,欢迎关注公众号 「十三Tech」。后续会继续按机制、图解和实战排查这条线更新。

十三Tech公众号二维码