Skip to content

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: 可以采取以下措施:

  • 使用自增主键
  • 避免在多个主库上修改同一数据
  • 使用全局唯一标识符
  • 配置合理的冲突检测机制
  • 建立数据冲突解决流程