一、MySQL 复制概述
1. 什么是 MySQL 复制?
MySQL 复制是官方提供的主从数据同步方案,用于将一个 MySQL 实例(源/主库)的数据同步到一个或多个 MySQL 实例(副本/从库)。这是数据库最广泛使用的容灾方案。
关键特点:
- 默认采用异步复制方式
- 副本不需要永久连接即可从源接收更新
- 支持复制所有数据库、指定数据库或特定表
注意:旧版本 MySQL 中,源称为"Master",副本称为"Slave";MySQL 8.0 开始统一使用"Source"和"Replica"。
2. 复制的优势
| 优势 | 说明 |
|---|---|
| 高可用 | 通过配置多个副本或级联复制,实现跨主机数据复制,提高系统可用性 |
| 性能扩展 | 将读请求分发至副本节点,提升整体读写性能 |
| 异地灾备 | 将副本部署到异地机房,实现异地数据备份和灾备 |
| 交易分离 | 将低频、大运算量交易发送至副本节点执行,避免与高频交易竞争资源 |
3. 复制的缺点
| 缺点 | 说明 |
|---|---|
| 无故障自动转移 | 容易造成单点故障 |
| 主从延迟问题 | 从库数据可能滞后于主库,导致最终一致性问题 |
| 从库过多负担 | 从库数量增加会增加主库负载和网络带宽压力 |
二、MySQL 复制的同步类型
1. 异步复制(默认)
工作原理:
- 主库收到客户端提交事务请求后,先写入 Binlog,再提交事务,更新存储引擎
- 主库将 Binlog 推送给从库的 I/O 线程,从库将 Binlog 写入中继日志( relay log)
- 从库的 SQL 线程读取并回放中继日志,更新存储引擎数据
特点:
- 事务提交和复制在不同线程执行,互不等待
- 性能最高,但可能存在主从延迟
- 如果主节点宕机,可能会丢失数据
2. 半同步复制
工作原理:
- 主库在收到客户端请求后,必须等待至少一个从节点完成数据同步响应后才返回
- 从节点需要写入 relay-log 并完成刷盘后才会向主节点响应
关键参数:
rpl_semi_sync_source_wait_for_replica_count(8.0.26+):至少等待几个从节点响应rpl_semi_sync_source_wait_point(8.0.26+):主库执行事务线程等待复制的时机(AFTER_SYNC 或 AFTER_COMMIT)
特点:
- 提高了数据可靠性,主节点宕机时数据已复制至至少一台从节点
- 性能比异步复制低,因为需要等待从节点响应
- 从节点响应超时时,主节点会退化为异步复制
3. 基于 GTID 的复制
GTID 原理:
- GTID = source_id:transaction_id
- source_id 是源服务器的唯一 UUID
- transaction_id 是事务在源上提交的顺序号
GTID 优势:
- 无需手动指定 Binlog 位点,自动定位复制位置
- 消除复制异常时需要找位点的复杂性
- 更安全,避免重复执行导致数据混乱
- 更简单的实现 failover,无需找位点
GTID 工作流程:
- 从库指定主库,建立连接
- 从库将自身 GTID 集合发送给主库
- 主库计算差集,从差集的第一个 GTID 开始发送 Binlog
- 从库 I/O 线程接收 Binlog,写入 relay log
- 从库 SQL 线程解析并执行 relay log
三、MySQL 主从复制配置实战
1. 基于 Binlog 位点的主从复制
配置步骤:
- 主库配置 :
- 设置
server-id(唯一) - 启用 Binlog:
log-bin=mysql-bin - 创建复制用户:
CREATE USER 'replicator'@'%' IDENTIFIED BY 'password'; - 授权:
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%'; - 获取主库状态:
SHOW MASTER STATUS;
- 设置
- 从库配置 :
- 设置
server-id(唯一) - 启用 Binlog:
log-bin=mysql-bin(必须) - 配置主库信息:
CHANGE MASTER TO MASTER_HOST='主库IP', MASTER_PORT=3306, MASTER_USER='replicator', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1234; - 启动复制:
START SLAVE;
- 设置
- 验证 :
SHOW SLAVE STATUS\\G:检查Slave_IO_Running和Slave_SQL_Running是否为 Yes
2. 基于 GTID 的主从复制
配置步骤:
-
主从库均配置 :
gtid_mode=ON enforce_gtid_consistency=ON -
主库配置 :
- 创建复制用户(同上)
- 获取主库状态:
SHOW MASTER STATUS;
-
从库配置 :
sqlCHANGE REPLICATION SOURCE TO SOURCE_HOST='主库IP', SOURCE_PORT=3306, SOURCE_USER='replicator', SOURCE_PASSWORD='password', SOURCE_AUTO_POSITION=1; -
启动复制 :
sqlSTART REPLICA; -
验证 :
SHOW REPLICA STATUS\\G:检查Replica_IO_Running和Replica_SQL_Running是否为 YesAuto_Position应为 1
3. 组复制(Group Replication)
组复制概述:
- 基于 Paxos 协议的分布式状态复制
- 支持单主模式和多主模式
- 实现高可用,只要集群中大多数主机可用,服务就可用
单主模式特点:
- 组中只有一个主服务器(PRIMARY),其他成员为 SECONDARY
- 主服务器接受读写请求,其他成员只读
- 自动选举主节点
多主模式特点:
- 所有成员都可接受写请求
- 通过冲突解决机制保证数据一致性
- 需要启用
group_replication_enforce_update_everywhere_checks=ON
组复制配置步骤:
-
每个节点配置 :
gtid_mode=ON enforce_gtid_consistency=ON log-bin=mysql-bin plugin_load_add="group_replication.so" group_replication_group_name="UUID" # 三个节点必须一致 group_replication_local_address="节点名:33061" group_replication_group_seeds="节点1:33061,节点2:33061,节点3:33061" group_replication_start_on_boot=off -
创建复制用户 :
sqlCREATE USER 'replicator'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%'; GRANT CONNECTION_ADMIN ON *.* TO 'replicator'@'%'; GRANT BACKUP_ADMIN ON *.* TO 'replicator'@'%'; GRANT GROUP_REPLICATION_STREAM ON *.* TO 'replicator'@'%'; -
单主模式引导 :
sqlSET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF; -
其他节点加入 :
sqlSTART GROUP_REPLICATION; -
验证 :
sqlSELECT MEMBER_HOST, MEMBER_ROLE FROM performance_schema.replication_group_members;
四、复制故障处理与优化
1. 常见复制故障处理
**1) 复制中断(Slave_SQL_Running: No)**:
- 查看错误:
SHOW SLAVE STATUS\\G - 常见错误:1062(唯一键冲突)、1032(删除数据找不到行)
- 解决方案:
-
跳过特定错误:
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE; -
通过 GTID 跳过错误事务:
sqlSET @@SESSION.GTID_NEXT='错误GTID'; BEGIN; COMMIT; SET SESSION GTID_NEXT=AUTOMATIC; START SLAVE;
-
2) 主从数据不一致:
- 检查 GTID 集合:
SHOW SLAVE STATUS\\G中的Retrieved_Gtid_Set和Executed_Gtid_Set - 修复方法:
- 从主库导出数据,导入从库
- 跳过错误 GTID,从最新点开始同步
2. 复制性能优化
| 优化点 | 说明 | 实现方式 |
|---|---|---|
| 网络优化 | 减少主从网络延迟 | 将主从部署在同一机房,使用高速网络 |
| Binlog 优化 | 减少 Binlog 写入开销 | sync_binlog=1(安全)或 sync_binlog=100(性能) |
| 从库优化 | 提升从库处理能力 | 增加从库数量,使用读写分离 |
| 半同步优化 | 降低半同步对性能的影响 | 适当减少 rpl_semi_sync_source_wait_for_replica_count |
| GTID 优化 | 简化复制配置 | 优先使用 GTID 复制方式 |
五、MySQL 8.0 主从复制最佳实践
1. 配置建议
| 项目 | 建议值 | 说明 |
|---|---|---|
innodb_flush_log_at_trx_commit |
1 | 保证数据安全 |
sync_binlog |
1 | 保证 Binlog 安全 |
rpl_semi_sync_source_wait_for_replica_count |
1 | 保证高可用,同时不影响性能 |
group_replication_single_primary_mode |
ON | 单主模式,简单易用 |
group_replication_enforce_update_everywhere_checks |
OFF | 仅在多主模式下启用 |
2. 高可用架构设计
方案 1:单主 + 多从
- 主库(写入)
- 从库 1、2、3(读取)
- 通过负载均衡分发读请求
- 从库宕机后,自动切换至其他从库
方案 2:组复制(单主模式)
- 3 节点组复制集群
- 一个主节点,两个从节点
- 自动故障转移,无需手动干预
- 适合对高可用要求高的场景
方案 3:组复制(多主模式)
- 3 节点组复制集群
- 所有节点都可写入
- 适合需要多活架构的场景
- 需要处理写冲突
六、总结
MySQL 8.0 主从复制是数据库高可用和性能扩展的核心技术,其发展经历了从异步复制到半同步复制,再到基于 GTID 的复制和组复制的演进。
核心价值:
- 异步复制:性能高,但存在数据丢失风险
- 半同步复制:平衡了性能和数据可靠性
- GTID 复制:简化了复制配置和故障恢复
- 组复制:实现了高可用和自动故障转移
最佳实践:
- 优先使用 GTID 复制,简化配置
- 在生产环境推荐使用半同步复制
- 对高可用要求高的场景,采用组复制
- 配置合理的监控和告警,及时发现复制问题
适用场景:
- 电商:读写分离,提升并发处理能力
- 社交网络:提供快速读取服务
- 金融系统:确保数据安全性和高可用性
- 大型网站:实现异地灾备和负载均衡
通过深入理解 MySQL 8.0 主从复制的原理和实践,我们可以设计出更加健壮、高可用的数据库架构,满足现代应用对数据一致性和系统可用性的严格要求。