Skip to content
清晨的一缕阳光
返回

MySQL 主从复制模式

核心概念

MySQL 提供多种复制模式,适用于不同的业务场景。

复制模式对比

模式数据安全性性能延迟适用场景
异步复制最优较小日志备份、数据分析
半同步复制良好核心业务、读写分离
全同步复制较差较大金融级数据一致性
并行复制-提升从库性能高延迟场景

异步复制

工作原理

异步复制流程:
1. 主库写 binlog
2. 主库提交事务
3. 主库返回客户端(不等待从库)
4. 从库异步拉取 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. 返回客户端

特点:

配置示例

-- 主库配置
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;

参考资料


分享这篇文章到:

上一篇文章
Sentinel 基础
下一篇文章
Spring Boot Spring Security 6 核心