MySQL 主从复制原理是什么?主从延迟从哪来、怎么治理?

结论先行:主从复制本质是“主库把 binlog 传给从库并重放”。主库写 binlog 后由 dump 线程推送给从库,从库 IO 线程收下写入 relay log,SQL 线程再重放。延迟主要来自 SQL 线程重放跟不上主库写入,常见诱因是大事务、单线程重放、从库自身有查询压力。

一、复制链路三线程

线程位置职责
dump 线程主库读 binlog 推送给从库
IO 线程从库收 binlog 写入 relay log
SQL 线程从库读 relay log 在从库重放
主库 binlog --(dump)--> 从库 relay log --(SQL 线程)--> 从库数据

二、同步模式对比

模式主库提交是否需要从库确认数据风险性能
异步不需要主库宕机可能丢 binlog最好
半同步至少一个从库确认收到基本不丢略降
组复制多数派确认不丢,多写受限最低

三、延迟为什么产生

  • 大事务:一次改百万行,重放耗时远大于生成耗时。
  • 单线程重放:默认一个 SQL 线程,写入并行的主库很快就甩开从库。
  • 从库压力:从库还承担读流量或备份,与重放抢 CPU/IO。
  • 其它:DDL 长时间持锁、主从硬件差异、网络抖动影响 IO 线程。

四、治理手段

  • 开启并行复制:slave_parallel_workers > 1,按库/按事务粒度并行重放。
  • 拆分大事务:批量 UPDATE/DELETE,控制单事务影响行数。
  • 从库专职:读流量分散到多个从库,备份避开高峰。
  • 监控告警:盯 Seconds_Behind_Master 与两个线程状态。
SHOW SLAVE STATUS\G
-- 关注:Slave_IO_Running / Slave_SQL_Running / Seconds_Behind_Master

常见追问与记忆点

  • 追问:Seconds_Behind_Master 可信吗?它是估算值,时钟偏差或长事务下会失真,要配合 binlog 位点判断。
  • 追问:主库宕机后从库怎么接管?选延迟最小、数据最全的从库提升为主库,应用切换连接。
  • 记忆点:一主推 binlog,两线程接力重放;延迟 = 重放跟不上写入,靠并行复制 + 拆大事务 + 监控。
笔记加载中…