一、MySQL 主从复制概述

MySQL 主从复制(Replication)是保障数据库 高可用、读写分离、数据冗余与灾备 的核心机制。 它的本质是:主库记录日志 → 从库拉取日志 → 从库重放日志,最终实现数据同步。

1.1 应用场景

  • 读写分离:主库写、从库读,缓解单点压力
  • 异地容灾:主库崩溃时,从库快速接管
  • 数据备份:从库承担备份任务,减轻主库负担
  • 数据分析:从库专门用于报表和数据分析
  • 版本升级:通过主从复制实现平滑升级

1.2 MySQL 版本演进对比

特性MySQL 5.6MySQL 5.7MySQL 8.0
GTID基础支持完善稳定增强功能
多线程复制基于库基于事务组基于写集合
Crash Safe部分支持完全支持增强稳定性
在线DDL有限支持大幅改进Instant DDL
Clone插件
Redo Log传统架构优化改进重新设计
复制过滤基础功能增强功能更灵活

二、MySQL 5.7 主从复制核心特性

2.1 GTID(全局事务标识符)

MySQL 5.7 中 GTID 已经非常成熟稳定,是生产环境的首选:

GTID 优势:

  • 自动故障转移:无需手动指定 binlog 位置
  • 一致性保证:每个事务都有全局唯一标识
  • 简化运维:主从切换、级联复制更简单

GTID 格式:

server_uuid:transaction_id
例如:3E11FA47-71CA-11E1-9E33-C80AA9429562:23

关键配置:

# 主库和从库都需要
gtid_mode = ON
enforce_gtid_consistency = ON
log_bin = mysql-bin
log_slave_updates = ON

2.2 多线程复制(MTS)

MySQL 5.7 引入基于事务组的并行复制:

slave_parallel_type 选项:

  • DATABASE:基于库级别并行(5.6兼容)
  • LOGICAL_CLOCK:基于事务组并行(5.7推荐)

配置示例:

# 从库配置
slave_parallel_workers = 8
slave_parallel_type = LOGICAL_CLOCK
slave_preserve_commit_order = ON

2.3 Crash Safe 复制

MySQL 5.7 实现了完整的 crash-safe 复制:

# 关键参数
relay_log_recovery = ON
sync_master_info = 1
sync_relay_log = 1
sync_relay_log_info = 1
master_info_repository = TABLE
relay_log_info_repository = TABLE

三、MySQL 8.0 革命性改进

3.1 Clone 插件

MySQL 8.0 引入的 Clone 插件彻底改变了主从搭建方式:

传统方式 vs Clone 方式:

# 传统方式(耗时且复杂)
mysqldump --master-data=2 --single-transaction --all-databases > backup.sql
# 传输文件、导入数据、配置复制...

# Clone 方式(简单高效)
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
CLONE INSTANCE FROM 'user@master_host:3306' IDENTIFIED BY 'password';
START SLAVE;

Clone 优势:

  • 快速搭建:直接克隆整个实例
  • 自动配置:无需手动设置 GTID 位置
  • 增量同步:支持增量克隆

3.2 基于写集合的并行复制

MySQL 8.0 进一步优化并行复制:

# 8.0 推荐配置
slave_parallel_workers = 16
slave_parallel_type = LOGICAL_CLOCK
binlog_transaction_dependency_tracking = WRITESET
transaction_write_set_extraction = XXHASH64

3.3 Redo Log 重新设计

MySQL 8.0 重新设计了 Redo Log 架构:

改进点:

  • 动态调整:支持在线调整 redo log 大小
  • 性能提升:更高的并发写入性能
  • 恢复速度:更快的崩溃恢复
-- 8.0 动态调整 redo log
ALTER INSTANCE RESIZE INNODB REDO LOG TO 2048M;

四、主从复制的工作原理

主从复制流程分为三步:

  1. 主库写 binlog

    • 事务提交时,主库将数据变更写入 二进制日志(binlog)
  2. 从库 I/O 线程获取日志

    • 从库向主库请求 binlog。
    • 主库通过 Binlog Dump 线程 推送给从库。
    • 从库的 I/O 线程 接收后保存到 relay log(中继日志)
  3. 从库 SQL 线程重放日志

    • 从库 SQL 线程读取 relay log 并执行,完成数据同步。

一句话总结: 👉 binlog(主库) → relay log(从库) → SQL 线程执行(从库应用)


三、复制涉及的日志

  • Binlog(二进制日志,主库)

    • 记录所有变更操作。
    • 复制和数据恢复的基础。
    • 推荐格式:ROW + binlog_row_image=MINIMAL
  • Relay Log(中继日志,从库)

    • I/O 线程接收主库 binlog 的副本。
    • SQL 线程依赖它重放。
  • Error Log(错误日志)

    • 记录复制中断、网络错误等关键信息。
  • General Log & Slow Query Log

    • 用于调试和优化,不参与复制。

四、复制线程的分工

  • 主库 Binlog Dump 线程:负责向从库发送 binlog。
  • 从库 I/O 线程:拉取并保存 binlog → relay log。
  • 从库 SQL 线程:读取 relay log 并执行。
  • 多线程复制(MySQL 5.7+):支持多个 SQL 线程并发执行,加速同步。

五、版本特定配置参数对比

5.1 MySQL 5.7 推荐配置

主库配置(my.cnf):

[mysqld]
# 基础复制配置
server_id = 1
log_bin = mysql-bin
binlog_format = ROW
binlog_row_image = MINIMAL
sync_binlog = 1

# GTID 配置
gtid_mode = ON
enforce_gtid_consistency = ON
log_slave_updates = ON

# 性能优化
binlog_expire_logs_seconds = 604800  # 7天
max_binlog_size = 1G
binlog_cache_size = 4M

从库配置(my.cnf):

[mysqld]
# 基础配置
server_id = 2
read_only = ON
super_read_only = ON

# GTID 配置
gtid_mode = ON
enforce_gtid_consistency = ON
log_slave_updates = ON

# 多线程复制
slave_parallel_workers = 8
slave_parallel_type = LOGICAL_CLOCK
slave_preserve_commit_order = ON

# Crash Safe
relay_log_recovery = ON
sync_master_info = 1
sync_relay_log = 1
sync_relay_log_info = 1
master_info_repository = TABLE
relay_log_info_repository = TABLE

5.2 MySQL 8.0 推荐配置

主库配置(my.cnf):

[mysqld]
# 基础复制配置
server_id = 1
log_bin = mysql-bin
binlog_format = ROW
binlog_row_image = MINIMAL
sync_binlog = 1

# GTID 配置
gtid_mode = ON
enforce_gtid_consistency = ON
log_slave_updates = ON

# 8.0 新特性
binlog_transaction_dependency_tracking = WRITESET
transaction_write_set_extraction = XXHASH64
binlog_expire_logs_seconds = 604800

# Clone 插件支持
plugin_load_add = 'mysql_clone.so'

从库配置(my.cnf):

[mysqld]
# 基础配置
server_id = 2
read_only = ON
super_read_only = ON

# GTID 配置
gtid_mode = ON
enforce_gtid_consistency = ON
log_slave_updates = ON

# 8.0 增强的多线程复制
replica_parallel_workers = 16
replica_parallel_type = LOGICAL_CLOCK
replica_preserve_commit_order = ON

# 新的参数名(8.0+)
relay_log_recovery = ON
sync_source_info = 1
sync_relay_log = 1
sync_relay_log_info = 1

# Clone 插件
plugin_load_add = 'mysql_clone.so'

5.3 关键参数对比表

参数MySQL 5.7MySQL 8.0说明
复制线程配置slave_parallel_*replica_parallel_*8.0 重命名参数
依赖跟踪不支持binlog_transaction_dependency_tracking8.0 新增写集合跟踪
写集合提取不支持transaction_write_set_extraction8.0 新增
Clone 支持不支持plugin_load_add = 'mysql_clone.so'8.0 独有
信息同步sync_master_infosync_source_info8.0 重命名

六、主从复制延迟调优实战方案

1. 主库优化

  • 使用 ROW 格式 + binlog_row_image=MINIMAL
  • 控制事务大小,避免大事务。
  • 合理设置 binlog_expire_logs_seconds

2. 从库优化

  • 开启多线程复制:

    slave_parallel_workers = 8
    slave_parallel_type = LOGICAL_CLOCK
    
  • 打开 crash-safe 参数:

    relay_log_recovery=1
    sync_master_info=1
    sync_relay_log=1
    sync_relay_log_info=1
    
  • 配置 read_only=ONsuper_read_only=ON

3. 网络与架构优化

  • 确保主从在低延迟链路。
  • 使用级联复制,减少主库连接压力。
  • 可选半同步复制插件,提升数据安全性。

4. 运维实践

  • 监控复制延迟(Seconds_Behind_Master、Prometheus+Grafana)。
  • 优化慢查询(pt-query-digest、慢日志分析)。
  • 避免无主键表,减少 ROW 复制开销。
  • 使用在线 DDL 工具(pt-online-schema-change 或 MySQL 8.0 instant alter)。

七、实战案例与故障排查

7.1 MySQL 5.7 GTID 主从搭建实战

步骤1:主库配置

-- 创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

-- 查看GTID状态
SHOW MASTER STATUS;

步骤2:从库配置

-- 配置主从关系(GTID模式)
CHANGE MASTER TO
  MASTER_HOST='192.168.1.100',
  MASTER_USER='repl',
  MASTER_PASSWORD='repl_password',
  MASTER_AUTO_POSITION=1;

-- 启动复制
START SLAVE;

-- 检查状态
SHOW SLAVE STATUS\G

7.2 MySQL 8.0 Clone 快速搭建

主库准备:

-- 安装Clone插件
INSTALL PLUGIN clone SONAME 'mysql_clone.so';

-- 创建Clone用户
CREATE USER 'clone_user'@'%' IDENTIFIED BY 'clone_password';
GRANT BACKUP_ADMIN ON *.* TO 'clone_user'@'%';

从库执行:

-- 安装Clone插件
INSTALL PLUGIN clone SONAME 'mysql_clone.so';

-- 执行克隆
CLONE INSTANCE FROM 'clone_user@192.168.1.100:3306' 
IDENTIFIED BY 'clone_password';

-- 重启后自动配置复制
-- 无需手动设置CHANGE MASTER

7.3 常见故障排查

1. 复制延迟问题

-- 检查延迟
SHOW SLAVE STATUS\G
-- 关注:Seconds_Behind_Master

-- 分析原因
SELECT * FROM performance_schema.replication_applier_status_by_worker;

-- 优化方案
SET GLOBAL slave_parallel_workers = 16;
SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK';

2. GTID 一致性错误

# 错误信息
ERROR 1236: Got fatal error 1236 from master when reading data from binary log

# 解决方案
mysql> RESET MASTER;  # 谨慎操作
mysql> SET GLOBAL gtid_purged='3E11FA47-71CA-11E1-9E33-C80AA9429562:1-100';

3. MySQL 8.0 参数兼容性

-- 5.7 → 8.0 参数映射
-- 旧参数:slave_parallel_workers
-- 新参数:replica_parallel_workers

-- 检查废弃参数
SELECT * FROM performance_schema.variables_info 
WHERE VARIABLE_NAME LIKE '%slave%';

7.4 监控与运维

关键监控指标:

-- 复制状态监控
SELECT 
  CHANNEL_NAME,
  SERVICE_STATE,
  LAST_ERROR_MESSAGE,
  LAST_ERROR_TIMESTAMP
FROM performance_schema.replication_connection_status;

-- 延迟监控
SELECT 
  CHANNEL_NAME,
  COUNT_TRANSACTIONS_IN_QUEUE,
  COUNT_TRANSACTIONS_RETRIES
FROM performance_schema.replication_applier_status_by_coordinator;

自动化脚本示例:

#!/bin/bash
# MySQL复制健康检查脚本

MYSQL_CMD="mysql -u monitor -p'password'"

# 检查复制状态
SLAVE_STATUS=$($MYSQL_CMD -e "SHOW SLAVE STATUS\G" | grep "Slave_IO_Running\|Slave_SQL_Running")

if [[ $SLAVE_STATUS == *"Yes"* ]]; then
    echo "复制正常"
else
    echo "复制异常,请检查"
    # 发送告警
fi

八、版本升级最佳实践

8.1 5.7 → 8.0 升级策略

方案1:传统升级

# 1. 备份数据
mysqldump --all-databases --master-data=2 > backup.sql

# 2. 升级MySQL
yum update mysql-server

# 3. 升级系统表
mysql_upgrade -u root -p

方案2:主从切换升级

# 1. 搭建8.0从库
# 2. 数据同步完成后切换
# 3. 原主库升级为8.0
# 4. 重新建立主从关系

8.2 兼容性注意事项

配置文件调整:

# 5.7 配置
[mysqld]
slave_parallel_workers = 8
slave_parallel_type = LOGICAL_CLOCK

# 8.0 配置(向后兼容)
[mysqld]
replica_parallel_workers = 8
replica_parallel_type = LOGICAL_CLOCK
# 或继续使用旧参数名(会有警告)

九、总结

MySQL 主从复制从5.7到8.0经历了重大演进,核心仍然是 日志传递机制

9.1 技术演进总结

MySQL 5.7 核心改进:

  • GTID 成熟稳定:简化故障转移和运维管理
  • 多线程复制优化:基于事务组的并行复制大幅提升性能
  • Crash Safe 完善:彻底解决复制一致性问题

MySQL 8.0 革命性特性:

  • Clone 插件:彻底改变主从搭建方式,从小时级降到分钟级
  • 写集合并行复制:更细粒度的并行控制,进一步提升性能
  • 参数重命名slave_*replica_*,更好的语义表达

9.2 版本选择建议

场景推荐版本理由
新项目MySQL 8.0最新特性,长期支持
生产环境MySQL 5.7/8.0都已足够稳定
大规模部署MySQL 8.0Clone插件大幅简化运维
高并发写入MySQL 8.0写集合并行复制性能更优

9.3 最佳实践要点

想要复制稳定高效,必须在以下方面下功夫:

技术层面:

  • 版本选择:优先选择MySQL 8.0,享受最新特性
  • 参数优化:合理配置GTID、多线程复制、crash-safe参数
  • 架构设计:合理规划主从拓扑,考虑级联复制和读写分离

运维层面:

  • 监控告警:重点关注复制延迟、错误日志、性能指标
  • 故障处理:熟练掌握GTID故障恢复、主从切换流程
  • 版本升级:制定详细的5.7→8.0升级方案

开发层面:

  • SQL优化:避免大事务、无主键表,优化慢查询
  • 应用设计:合理使用读写分离,处理复制延迟
  • 数据一致性:理解最终一致性,设计容错机制

MySQL主从复制技术已经非常成熟,从5.7到8.0的演进让其更加强大和易用。选择合适的版本,配置正确的参数,建立完善的监控,就能构建稳定高效的MySQL复制架构。