外观
MySQL 同步与异步复制
异步复制
原理与工作流程
- 主库将binlog事件写入binlog文件
- 主库向从库发送binlog事件
- 从库接收并写入中继日志
- 从库应用中继日志中的事件
- 从库更新自己的数据
特点
- 主库无需等待从库确认
- 主库性能较高
- 可能存在数据不一致风险
- 复制延迟较大
配置方法
ini
# 主库配置
server-id = 1
log_bin = mysql-bin
binlog_format = ROW
# 从库配置
server-id = 2
relay_log = mysql-relay-bin
read_only = 1
# 从库连接主库
CHANGE MASTER TO
MASTER_HOST = 'master_host',
MASTER_USER = 'repl',
MASTER_PASSWORD = 'password',
MASTER_LOG_FILE = 'mysql-bin.000001',
MASTER_LOG_POS = 4;
START SLAVE;适用场景
- 对数据一致性要求不高的场景
- 读多写少的应用
- 性能要求较高的场景
- 地理分布式部署
同步复制
原理与工作流程
- 主库将binlog事件写入binlog文件
- 主库向从库发送binlog事件
- 从库接收并写入中继日志
- 从库应用中继日志中的事件
- 从库向主库发送确认
- 主库收到确认后才提交事务
特点
- 数据一致性高
- 主库需要等待从库确认
- 主库性能较低
- 复制延迟较小
- 高可用性较好
配置方法
ini
# 主库配置
server-id = 1
log_bin = mysql-bin
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1
# 从库配置
server-id = 2
relay_log = mysql-relay-bin
read_only = 1
# 从库连接主库(使用同步复制)
CHANGE MASTER TO
MASTER_HOST = 'master_host',
MASTER_USER = 'repl',
MASTER_PASSWORD = 'password',
MASTER_LOG_FILE = 'mysql-bin.000001',
MASTER_LOG_POS = 4,
MASTER_HEARTBEAT_PERIOD = 1;
START SLAVE;适用场景
- 对数据一致性要求高的场景
- 金融、交易等核心业务
- 关键业务系统
- 对可靠性要求高的场景
半同步复制
原理与工作流程
- 主库将binlog事件写入binlog文件
- 主库向从库发送binlog事件
- 从库接收并写入中继日志
- 从库向主库发送确认(仅需写入中继日志,无需应用)
- 主库收到确认后才提交事务
特点
- 平衡性能和一致性
- 主库只需等待从库写入中继日志
- 性能优于同步复制
- 一致性优于异步复制
- 支持超时机制
配置方法
ini
# 主库配置
server-id = 1
log_bin = mysql-bin
plugin_load = 'rpl_semi_sync_master=semisync_master.so'
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 10000 # 10秒
# 从库配置
server-id = 2
relay_log = mysql-relay-bin
plugin_load = 'rpl_semi_sync_slave=semisync_slave.so'
rpl_semi_sync_slave_enabled = 1
# 从库连接主库
CHANGE MASTER TO
MASTER_HOST = 'master_host',
MASTER_USER = 'repl',
MASTER_PASSWORD = 'password',
MASTER_LOG_FILE = 'mysql-bin.000001',
MASTER_LOG_POS = 4;
START SLAVE;监控与管理
bash
# 查看半同步复制状态
SHOW GLOBAL STATUS LIKE 'Rpl_semi_sync%';
# 查看半同步复制配置
SHOW GLOBAL VARIABLES LIKE 'rpl_semi_sync%';
# 临时禁用半同步复制
SET GLOBAL rpl_semi_sync_master_enabled = 0;
# 重新启用半同步复制
SET GLOBAL rpl_semi_sync_master_enabled = 1;增强半同步复制
原理与工作流程
- 基于半同步复制
- 增加了确认机制
- 支持多从库确认
- 提供更高的可靠性
配置方法
ini
# 主库配置
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 10000
rpl_semi_sync_master_wait_for_slave_count = 1 # 至少等待1个从库
rpl_semi_sync_master_wait_no_slave = ON
# 从库配置
rpl_semi_sync_slave_enabled = 1适用场景
- 对数据一致性和可靠性要求较高的场景
- 核心业务系统
- 金融交易系统
- 关键数据存储
复制模式对比
性能对比
| 复制模式 | 主库性能 | 复制延迟 | 网络要求 |
|---|---|---|---|
| 异步复制 | 最高 | 较大 | 较低 |
| 半同步复制 | 中等 | 较小 | 中等 |
| 同步复制 | 最低 | 最小 | 较高 |
可靠性对比
| 复制模式 | 数据一致性 | 故障恢复 | 可靠性 |
|---|---|---|---|
| 异步复制 | 较低 | 可能丢失数据 | 较低 |
| 半同步复制 | 较高 | 基本不丢失数据 | 较高 |
| 同步复制 | 最高 | 不丢失数据 | 最高 |
配置复杂度对比
| 复制模式 | 配置难度 | 维护成本 | 适用规模 |
|---|---|---|---|
| 异步复制 | 简单 | 低 | 大规模 |
| 半同步复制 | 中等 | 中等 | 中大规模 |
| 同步复制 | 复杂 | 高 | 小规模 |
复制拓扑结构
一主一从
- 最简单的复制结构
- 配置简单,易于维护
- 适合小型应用
- 存在单点故障
一主多从
- 一个主库,多个从库
- 提高读性能
- 分散负载
- 增加系统可靠性
级联复制
- 主库 → 中间从库 → 从库
- 减轻主库复制压力
- 适合大规模部署
- 复制延迟可能增加
双主复制
- 两个主库,互为主从
- 提高可用性
- 避免单点故障
- 需要解决冲突问题
环形复制
- 多个节点组成环
- 每个节点既是主库又是从库
- 复杂部署
- 容易出现复制延迟累积
复制监控与管理
复制状态监控
bash
# 查看从库状态
SHOW SLAVE STATUS\G
# 查看主库状态
SHOW MASTER STATUS;
# 查看复制连接状态
SHOW PROCESSLIST;
# 查看复制延迟
SHOW GLOBAL STATUS LIKE 'Seconds_Behind_Master';复制故障排查
- 网络连接问题
- 权限问题
- 二进制日志问题
- 中继日志问题
- 数据冲突问题
复制性能优化
- 调整
sync_binlog参数 - 优化网络配置
- 使用
ROW格式二进制日志 - 合理设置
innodb_flush_log_at_trx_commit - 考虑使用多线程复制
不同版本的复制特性
MySQL 5.6
- 引入半同步复制
- 支持多线程复制(基于库)
- 增强复制监控
MySQL 5.7
- 增强半同步复制
- 支持多线程复制(基于表)
- 引入复制检查点
- 改进复制故障恢复
MySQL 8.0
- 支持多线程复制(基于行)
- 引入异步连接故障转移
- 增强复制安全性
- 改进复制性能
MariaDB
- 增强半同步复制
- 支持并行复制
- 引入复制监控增强
- 改进复制冲突检测
最佳实践
配置建议
- 生产环境建议使用半同步复制
- 合理设置半同步复制超时
- 启用复制压缩减少网络传输
- 配置复制延迟监控
部署建议
- 确保主从服务器硬件配置相近
- 使用专用网络进行复制
- 定期备份主库和从库
- 测试复制故障转移
维护建议
- 定期检查复制状态
- 监控复制延迟
- 定期清理二进制日志
- 避免在从库上执行写入操作
故障处理
- 建立复制故障处理流程
- 定期演练故障转移
- 准备回滚方案
- 记录故障处理过程
常见问题(FAQ)
Q1: 半同步复制超时后会自动切换到异步复制吗?
A1: 是的,当半同步复制超时时,MySQL会自动切换到异步复制模式,以确保主库不会被阻塞。当从库恢复正常后,会自动切回半同步复制模式。
Q2: 如何选择合适的复制模式?
A2: 选择复制模式应考虑以下因素:
- 数据一致性要求
- 性能要求
- 网络环境
- 系统规模
- 维护成本
Q3: 复制延迟较大时如何优化?
A3: 可以采取以下措施:
- 使用更快的网络
- 调整复制参数
- 启用多线程复制
- 优化从库配置
- 减少主库写入压力
Q4: 主库故障后如何快速切换到从库?
A4: 可以按照以下步骤:
- 确认主库故障
- 检查从库状态和复制延迟
- 提升从库为主库
- 重新配置其他从库连接新主库
- 应用程序切换到新主库
Q5: 如何解决复制冲突问题?
A5: 可以采取以下措施:
- 使用自增主键
- 避免在多个主库上修改同一数据
- 使用全局唯一标识符
- 配置合理的冲突检测机制
- 建立数据冲突解决流程
