Skip to content

MySQL 半同步与异步复制

复制的基本概念

MySQL 复制是一种数据同步机制,允许将一个 MySQL 实例(主库)的数据复制到一个或多个 MySQL 实例(从库)。复制是 MySQL 高可用性、扩展性和灾难恢复的基础。

异步复制的原理与实现

1. 异步复制的工作原理

异步复制是 MySQL 默认的复制模式,其工作流程如下:

  1. 主库执行写操作,将数据更新记录到二进制日志(binlog)
  2. 主库向客户端返回写操作结果,无需等待从库确认
  3. 从库的 I/O 线程读取主库的 binlog 并写入到本地的中继日志(relay log)
  4. 从库的 SQL 线程读取中继日志,并重放其中的 SQL 语句,更新从库数据

2. 异步复制的优缺点

优点

  • 性能好,主库无需等待从库确认,写入延迟低
  • 配置简单,默认启用
  • 对网络延迟不敏感

缺点

  • 数据一致性风险,主库崩溃可能导致从库丢失数据
  • 无法保证从库的数据完整性

3. 异步复制的配置

异步复制是 MySQL 的默认复制模式,无需额外配置。基本配置步骤如下:

  1. 在主库上启用二进制日志:

    ini
    [mysqld]
    log-bin=mysql-bin
    server-id=1
  2. 在从库上配置复制:

    ini
    [mysqld]
    server-id=2
    relay-log=mysql-relay-bin
  3. 在从库上设置主库信息:

    sql
    CHANGE MASTER TO
      MASTER_HOST='master_host',
      MASTER_USER='repl_user',
      MASTER_PASSWORD='repl_password',
      MASTER_LOG_FILE='mysql-bin.000001',
      MASTER_LOG_POS=4;
  4. 启动从库复制进程:

    sql
    START SLAVE;

半同步复制的原理与实现

1. 半同步复制的工作原理

半同步复制是 MySQL 5.5 引入的一种增强型复制模式,其工作流程如下:

  1. 主库执行写操作,将数据更新记录到二进制日志
  2. 主库等待至少一个从库确认已收到并写入中继日志
  3. 从库的 I/O 线程读取主库的 binlog 并写入到本地的中继日志
  4. 从库的 I/O 线程向主库发送确认消息
  5. 主库收到确认后,向客户端返回写操作结果
  6. 从库的 SQL 线程读取中继日志,并重放其中的 SQL 语句

2. 半同步复制的优缺点

优点

  • 数据一致性更高,主库崩溃时从库丢失数据的风险较低
  • 可以配置等待多个从库确认,进一步提高数据安全性
  • 支持超时机制,避免主库因从库问题而阻塞

缺点

  • 主库写入延迟增加,受网络延迟影响较大
  • 配置相对复杂,需要安装插件
  • 性能比异步复制差

3. 半同步复制的配置

配置半同步复制需要以下步骤:

  1. 在主库和从库上安装半同步复制插件:

    sql
    -- 主库
    INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
    
    -- 从库
    INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
  2. 在主库和从库上启用半同步复制:

    sql
    -- 主库
    SET GLOBAL rpl_semi_sync_master_enabled = 1;
    SET GLOBAL rpl_semi_sync_master_timeout = 10000; -- 10秒超时
    
    -- 从库
    SET GLOBAL rpl_semi_sync_slave_enabled = 1;
  3. 重启从库的 I/O 线程:

    sql
    STOP SLAVE IO_THREAD;
    START SLAVE IO_THREAD;
  4. 验证半同步复制状态:

    sql
    -- 主库
    SHOW GLOBAL STATUS LIKE 'Rpl_semi_sync_master_status';
    
    -- 从库
    SHOW GLOBAL STATUS LIKE 'Rpl_semi_sync_slave_status';

半同步与异步复制的比较

特性异步复制半同步复制
数据一致性较低较高
主库写入延迟
网络依赖性
配置复杂度简单复杂
性能一般
主库崩溃数据丢失风险
默认启用

半同步复制的高级特性

1. 等待确认的从库数量

可以配置主库等待多少个从库确认,进一步提高数据安全性:

sql
-- MySQL 5.7+ 支持
SET GLOBAL rpl_semi_sync_master_wait_for_slave_count = 2;

2. 超时机制

配置主库等待从库确认的超时时间,避免主库因从库问题而长时间阻塞:

sql
SET GLOBAL rpl_semi_sync_master_timeout = 5000; -- 5秒超时

3. 动态切换

半同步复制支持动态切换到异步复制,当从库确认超时后,主库会自动切换到异步复制模式,确保主库的可用性:

sql
-- 查看当前复制模式
SHOW GLOBAL STATUS LIKE 'Rpl_semi_sync_master_status';

复制模式的选择建议

1. 考虑因素

  • 数据一致性要求
  • 性能要求
  • 网络环境
  • 业务场景

2. 适用场景

异步复制

  • 读密集型应用
  • 对数据一致性要求不高的场景
  • 网络延迟较高的环境
  • 追求极致写入性能的场景

半同步复制

  • 对数据一致性要求较高的场景
  • 金融、电商等核心业务
  • 网络延迟较低的环境
  • 主库崩溃容忍度低的场景

复制监控与故障处理

1. 监控指标

  • 主从延迟(Seconds_Behind_Master)
  • 半同步复制状态(Rpl_semi_sync_master_status)
  • 等待确认的时间(Rpl_semi_sync_master_yes_tx)
  • 超时切换到异步的次数(Rpl_semi_sync_master_no_tx)

2. 常见故障及处理

从库延迟过高

  • 检查网络连接
  • 优化从库配置,启用并行复制
  • 拆分大事务
  • 考虑使用多线程复制

半同步复制频繁超时

  • 检查网络延迟
  • 调整超时时间
  • 优化从库性能
  • 考虑降级为异步复制

从库 I/O 线程停止

  • 检查主从网络连接
  • 检查主库二进制日志是否存在
  • 检查复制用户权限
  • 重启 I/O 线程

最佳实践

1. 配置建议

  • 对于核心业务,建议使用半同步复制
  • 合理设置半同步复制超时时间,平衡一致性和可用性
  • 启用并行复制,提高从库的复制速度
  • 定期监控复制状态,及时发现问题

2. 架构设计

  • 考虑使用混合复制模式,部分从库使用半同步,部分使用异步
  • 结合监控系统,实现复制模式的自动切换
  • 考虑使用多主架构,进一步提高可用性

3. 性能优化

  • 优化主库二进制日志格式,使用 ROW 格式
  • 调整从库的 relay_log_recovery 参数,提高从库的可靠性
  • 考虑使用级联复制,减少主库的复制压力

常见问题(FAQ)

Q1: 半同步复制一定能保证数据一致性吗?

A1: 半同步复制不能完全保证数据一致性,但可以显著降低数据丢失的风险。当主库崩溃时,半同步复制可以保证至少有一个从库的数据与主库一致。

Q2: 如何在半同步复制和异步复制之间切换?

A2: 可以通过动态修改系统变量来切换复制模式:

sql
-- 切换到半同步复制
SET GLOBAL rpl_semi_sync_master_enabled = 1;

-- 切换到异步复制
SET GLOBAL rpl_semi_sync_master_enabled = 0;

Q3: 半同步复制对主库性能有多大影响?

A3: 半同步复制对主库性能的影响取决于网络延迟和从库的响应速度。在网络延迟较低的环境中,影响较小;在网络延迟较高的环境中,影响较大。

Q4: 如何配置半同步复制等待多个从库确认?

A4: 在 MySQL 5.7+ 中,可以通过以下参数配置:

sql
SET GLOBAL rpl_semi_sync_master_wait_for_slave_count = 2;

Q5: 半同步复制超时后会发生什么?

A5: 当半同步复制超时时,主库会自动切换到异步复制模式,继续处理写操作,确保主库的可用性。

Q6: 如何监控半同步复制的状态?

A6: 可以使用以下命令监控半同步复制的状态:

sql
-- 主库
SHOW GLOBAL STATUS LIKE 'Rpl_semi_sync_master%';

-- 从库
SHOW GLOBAL STATUS LIKE 'Rpl_semi_sync_slave%';

Q7: 半同步复制支持哪些 MySQL 版本?

A7: 半同步复制从 MySQL 5.5 开始支持,在 MySQL 5.7 和 8.0 中得到了进一步增强。

Q8: 如何选择合适的复制模式?

A8: 选择复制模式时需要考虑数据一致性要求、性能要求、网络环境和业务场景。对于核心业务,建议使用半同步复制;对于读密集型应用或网络延迟较高的环境,可以考虑使用异步复制。