MySQL 8.0Notes

第 23 章:复制实现

zjc 于 2026-01-23 发布

这是《MySQL 8.0 源码与内核实战》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 MySQL 复制基于 Binlog 传播和重放。主库记录逻辑变更,从库接收 relay log 并由 applier 执行。

23.1 链路

Primary
  commit + write binlog
  -> dump thread
     -> network
        -> replica io thread
           -> relay log
              -> sql/applier thread
                 -> apply transactions

23.2 Binlog 格式

格式 特点
STATEMENT 记录 SQL,依赖上下文
ROW 记录行变更,一致性较好
MIXED 按语句选择

8.0 默认 ROW。生产通常优先 ROW,可减少不确定性函数和顺序差异带来的数据漂移。

23.3 GTID

GTID = server_uuid:transaction_id

价值:

  1. 事务全局标识;
  2. 自动定位位点;
  3. failover 更简单;
  4. 重放可判断已执行;
  5. 多源复制更清晰。

查看:

SHOW MASTER STATUS;
SHOW REPLICA STATUS\G
SELECT @@gtid_executed;

23.4 线程模型

线程 职责
Binlog dump 主库发送事件
Replica IO 接收 relay log
SQL thread 协调重放
worker 并行重放事务

并行复制参数:

参数 说明
replica_parallel_workers worker 数
replica_parallel_type 并行粒度
binlog_transaction_dependency_tracking 依赖来源
replica_preserve_commit_order 提交顺序

23.5 一致性

异步复制可能丢失最新事务;半同步复制至少等待从库确认收到 binlog 或事务已提交,具体取决于配置和应答模式。

SHOW VARIABLES LIKE 'rpl_semi_sync_master%';

不同发行版参数名可能变化,需按当前版本确认。

23.6 延迟排查

SHOW REPLICA STATUS\G
SELECT * FROM performance_schema.replication_applier_status_by_worker;
延迟 排查
IO 延迟 网络、binlog 发送、磁盘
SQL 延迟 大事务、单线程、锁
应用侧 冲突、索引缺失
主库写入尖刺 batch、DDL

处理方向是拆小事务、优化重放 SQL、合理并行、控制大 DDL 并持续监控延迟。

23.7 源码入口

文件 职责
sql/rpl_binlog_sender.cc 主库发送
sql/rpl_replica.cc 从库线程
sql/rpl_handler.cc 复制钩子
libbinlogevents/ 事件定义
sql/log_event.cc 事件解析

本章小结

复制核心是 binlog 产生、传输和重放。ROW 与 GTID 是现代生产的基础,延迟治理要区分 IO、SQL 和事务依赖,重点处理大事务、锁和并行度。

思考题

  1. ROW 和 STATEMENT 各有什么风险?
  2. GTID 如何帮助 failover?
  3. 大事务为什么造成复制延迟?
  4. 并行复制的依赖如何产生?
  5. 异步复制和半同步复制的差异是什么?