一、MySQL 主从复制概述
MySQL 主从复制(Replication)是保障数据库 高可用、读写分离、数据冗余与灾备 的核心机制。 它的本质是:主库记录日志 → 从库拉取日志 → 从库重放日志,最终实现数据同步。
1.1 应用场景
- 读写分离:主库写、从库读,缓解单点压力
- 异地容灾:主库崩溃时,从库快速接管
- 数据备份:从库承担备份任务,减轻主库负担
- 数据分析:从库专门用于报表和数据分析
- 版本升级:通过主从复制实现平滑升级
1.2 MySQL 版本演进对比
特性 | MySQL 5.6 | MySQL 5.7 | MySQL 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;
四、主从复制的工作原理
主从复制流程分为三步:
主库写 binlog
- 事务提交时,主库将数据变更写入 二进制日志(binlog)。
从库 I/O 线程获取日志
- 从库向主库请求 binlog。
- 主库通过 Binlog Dump 线程 推送给从库。
- 从库的 I/O 线程 接收后保存到 relay log(中继日志)。
从库 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.7 | MySQL 8.0 | 说明 |
---|---|---|---|
复制线程配置 | slave_parallel_* | replica_parallel_* | 8.0 重命名参数 |
依赖跟踪 | 不支持 | binlog_transaction_dependency_tracking | 8.0 新增写集合跟踪 |
写集合提取 | 不支持 | transaction_write_set_extraction | 8.0 新增 |
Clone 支持 | 不支持 | plugin_load_add = 'mysql_clone.so' | 8.0 独有 |
信息同步 | sync_master_info | sync_source_info | 8.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=ON
、super_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.0 | Clone插件大幅简化运维 |
高并发写入 | MySQL 8.0 | 写集合并行复制性能更优 |
9.3 最佳实践要点
想要复制稳定高效,必须在以下方面下功夫:
技术层面:
- 版本选择:优先选择MySQL 8.0,享受最新特性
- 参数优化:合理配置GTID、多线程复制、crash-safe参数
- 架构设计:合理规划主从拓扑,考虑级联复制和读写分离
运维层面:
- 监控告警:重点关注复制延迟、错误日志、性能指标
- 故障处理:熟练掌握GTID故障恢复、主从切换流程
- 版本升级:制定详细的5.7→8.0升级方案
开发层面:
- SQL优化:避免大事务、无主键表,优化慢查询
- 应用设计:合理使用读写分离,处理复制延迟
- 数据一致性:理解最终一致性,设计容错机制
MySQL主从复制技术已经非常成熟,从5.7到8.0的演进让其更加强大和易用。选择合适的版本,配置正确的参数,建立完善的监控,就能构建稳定高效的MySQL复制架构。