核心概念
MySQL 提供多种复制模式,适用于不同的业务场景。
复制模式对比
| 模式 | 数据安全性 | 性能 | 延迟 | 适用场景 |
|---|---|---|---|---|
| 异步复制 | 低 | 最优 | 较小 | 日志备份、数据分析 |
| 半同步复制 | 中 | 良好 | 小 | 核心业务、读写分离 |
| 全同步复制 | 高 | 较差 | 较大 | 金融级数据一致性 |
| 并行复制 | - | 提升从库性能 | 小 | 高延迟场景 |
异步复制
工作原理
异步复制流程:
1. 主库写 binlog
2. 主库提交事务
3. 主库返回客户端(不等待从库)
4. 从库异步拉取 binlog 并回放
特点:
- ✅ 主库性能最优,无额外延迟
- ❌ 主库故障可能丢失数据(binlog 未传到从库)
配置示例
# 主库配置
[mysqld]
server_id = 1
log_bin = mysql-bin
binlog_format = ROW
sync_binlog = 1
# 从库配置
[mysqld]
server_id = 2
relay_log = mysql-relay-bin
read_only = 1
-- 主库创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- 从库配置
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
适用场景
1. 日志备份
- 从库作为冷备
- 允许少量数据丢失
2. 数据分析
- 从库执行分析查询
- 不影响主库性能
3. 异地容灾
- 网络延迟大
- 无法使用同步复制
半同步复制
工作原理
半同步复制流程(AFTER_COMMIT):
1. 主库写 binlog
2. 主库发送 binlog 到从库
3. 从库写入 relay log 并返回 ACK
4. 主库收到 ACK 后提交事务
5. 返回客户端
特点:
- ✅ 保证至少一个从库收到 binlog
- ✅ 性能影响较小(约 10-20%)
- ⚠️ 超时后降级为异步复制
配置示例
-- 主库配置
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = ON;
SET GLOBAL rpl_semi_sync_master_timeout = 10000; -- 10 秒超时
SET GLOBAL rpl_semi_sync_master_wait_point = 'AFTER_COMMIT';
-- 从库配置
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = ON;
START SLAVE;
监控:
-- 查看半同步状态
SHOW STATUS LIKE 'Rpl_semi_sync%';
-- 关键指标:
Rpl_semi_sync_master_status: ON
Rpl_semi_sync_slave_status: ON
Rpl_semi_sync_master_timeout: 10000
Rpl_semi_sync_master_yes_tx: 1000 -- 成功半同步事务数
Rpl_semi_sync_master_no_tx: 10 -- 失败半同步事务数
等待点模式
-- AFTER_COMMIT(默认,推荐)
-- 主库写 binlog → 从库收到 → 主库提交 → 返回
SET GLOBAL rpl_semi_sync_master_wait_point = 'AFTER_COMMIT';
-- AFTER_SYNC(更强一致性)
-- 主库写 binlog → 从库收到 → 主库提交 → 从库回放 → 返回
SET GLOBAL rpl_semi_sync_master_wait_point = 'AFTER_SYNC';
适用场景
1. 核心业务系统
- 需要一定的数据安全性
- 可接受轻微性能损失
2. 读写分离架构
- 从库提供读服务
- 需要较新的数据
3. 同城灾备
- 网络延迟低(< 10ms)
- 半同步性能影响小
GTID 复制
GTID 概念
GTID(Global Transaction Identifier) 是全局事务 ID,格式:
GTID = source_id:transaction_id
示例:3E11FA47-71CA-11E1-9E33-C80AA9429562:23
特点:
- 全局唯一
- 事务提交时生成
- 简化复制管理
GTID 优势
1. 简化主从切换
- 无需指定 binlog 文件名和位置
- 自动定位复制位置
2. 避免复制错误
- GTID 保证事务不重复执行
- 自动跳过已执行事务
3. 方便故障恢复
- 自动找到正确的复制源
配置示例
# my.cnf(主从库都需要)
[mysqld]
gtid_mode = ON
enforce_gtid_consistency = ON
log_bin = mysql-bin
server_id = 1 # 主从库不同
-- 主库
-- 开启 GTID 后重启 MySQL
-- 从库配置(使用 GTID 自动定位)
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_AUTO_POSITION = 1; -- 关键参数
START SLAVE;
GTID 注意事项
-- 1. 不支持无键表
-- 表必须有主键或唯一键
-- 2. 不支持 CREATE ... SELECT
CREATE TABLE new_table SELECT * FROM old_table; -- 会报错
-- 3. 不支持临时表
CREATE TEMPORARY TABLE ...; -- 会报错
-- 4. 事务必须满足 GTID 一致性
-- 不能在事务中使用非事务表
并行复制
并行复制原理
MySQL 5.7+ 支持并行复制,提升从库回放速度。
串行复制(MySQL 5.6 及之前):
SQL 线程:事务 1 → 事务 2 → 事务 3 → 事务 4
并行复制(MySQL 5.7+):
Worker 1: 事务 1 → 事务 3
Worker 2: 事务 2 → 事务 4
并行复制策略
-- 1. 基于数据库并行(MySQL 5.6)
# my.cnf
slave_parallel_type = DATABASE
slave_parallel_workers = 4
-- 不同数据库的事务可并行
-- 同一数据库的事务串行
-- 2. 基于组提交并行(MySQL 5.7+,推荐)
# my.cnf
slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = 4
-- 同一组提交的事务可并行
-- 性能提升更明显
-- 3. 基于 WRITESET 并行(MySQL 8.0+)
# my.cnf
slave_parallel_type = WRITESET
slave_parallel_workers = 4
-- 没有写冲突的事务可并行
-- 性能最优
配置示例
[mysqld]
# 从库配置
slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = 8
slave_preserve_commit_order = ON -- 保持提交顺序
-- 查看并行复制状态
SHOW SLAVE STATUS\G
-- 关键指标:
Slave_parallel_type: LOGICAL_CLOCK
Slave_parallel_workers: 8
性能提升
测试数据:100 万事务,主库并发提交
串行复制:耗时 1000s
并行复制(4 worker):耗时 300s
并行复制(8 worker):耗时 200s
性能提升:3-5 倍
多源复制
多源复制概念
MySQL 5.7+ 支持一个从库复制多个主库。
架构:
主库 1 ──┐
主库 2 ──┼─→ 从库(多个复制通道)
主库 3 ──┘
配置示例
-- 配置多个复制通道
CHANGE MASTER TO
MASTER_HOST='master1',
MASTER_USER='repl',
MASTER_PASSWORD='password',
FOR CHANNEL 'channel_1';
CHANGE MASTER TO
MASTER_HOST='master2',
MASTER_USER='repl',
MASTER_PASSWORD='password',
FOR CHANNEL 'channel_2';
-- 启动所有通道
START SLAVE FOR CHANNEL 'channel_1';
START SLAVE FOR CHANNEL 'channel_2';
-- 查看状态
SHOW SLAVE STATUS FOR CHANNEL 'channel_1'\G
SHOW SLAVE STATUS FOR CHANNEL 'channel_2'\G
适用场景
1. 数据汇总
- 多个业务库数据汇总到从库
- 统一数据分析
2. 数据迁移
- 同时从多个源复制
- 合并数据
3. 分库合并
- 多个分库数据合并查询
复制模式选择指南
场景 1:日志备份
需求:
- 数据安全性要求低
- 性能要求高
- 允许数据丢失
推荐:异步复制
场景 2:读写分离
需求:
- 数据一致性要求中
- 从库提供读服务
- 延迟要求小
推荐:半同步复制 + GTID
场景 3:核心业务
需求:
- 数据安全性要求高
- 可接受性能损失
- 低延迟
推荐:半同步复制(AFTER_SYNC)+ 并行复制
场景 4:异地灾备
需求:
- 网络延迟大
- 数据安全性要求中
- 性能要求高
推荐:异步复制 + 延迟复制
场景 5:数据汇总
需求:
- 多个数据源
- 统一查询分析
- 数据合并
推荐:多源复制
最佳实践
配置建议
# 生产环境推荐配置
[mysqld]
# 基础配置
server_id = 1
log_bin = mysql-bin
binlog_format = ROW
sync_binlog = 1
# GTID
gtid_mode = ON
enforce_gtid_consistency = ON
# 半同步
rpl_semi_sync_master_enabled = ON
rpl_semi_sync_master_timeout = 10000
rpl_semi_sync_master_wait_point = 'AFTER_COMMIT'
# 并行复制(从库)
slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = 8
监控指标
-- 1. 复制状态
SHOW SLAVE STATUS\G
-- 2. 延迟监控
SELECT TIMESTAMPDIFF(SECOND, MAX(executed_time), NOW())
FROM mysql.slave_worker_info;
-- 3. 半同步状态
SHOW STATUS LIKE 'Rpl_semi_sync%';
-- 4. 并行复制状态
SELECT * FROM performance_schema.replication_applier_status_by_worker;
参考资料
- MySQL 官方文档 - 复制模式
- 《高性能 MySQL》第 10 章:复制
- MySQL 官方博客:Semi-Synchronous Replication