MySQL 8 半同步复制

在 MySQL 主从复制架构中,传统异步复制虽能满足大部分场景的性能需求,但存在 “主库提交事务后,从库未同步就宕机导致数据丢失” 的风险。而 MySQL 8 半同步复制 通过 “主库等待从库确认接收事务” 的机制,在性能与数据一致性间取得平衡,成为对数据可靠性有要求的业务(如电商订单、金融交易)的优选方案。本文将基于 MySQL 8 特性,从概念解析、环境准备、部署配置到监控运维,提供一套可落地的半同步复制实践方案。

一、半同步复制核心概念:到底 “半” 在哪里?

要理解半同步复制,需先明确其与传统异步复制的核心差异 ——事务提交的 “确认机制”:
 
  • 异步复制:主库执行事务并写入 binlog 后,立即向客户端返回 “提交成功”,无需等待从库获取 binlog;从库通过 IO 线程异步拉取主库 binlog,存在 “主库宕机时,未同步的 binlog 丢失” 风险。
  • 半同步复制:主库提交事务后,需等待至少一个从库确认 “已接收并写入中继日志(relay log)”,才向客户端返回 “成功”;若超过指定超时时间(默认 10 秒)仍未收到确认,自动降级为异步复制,避免业务阻塞。
 
简言之,半同步复制的 “半” 体现在:主库无需等待从库执行事务(仅需确认接收),既保障了数据不丢失,又避免了全同步复制(需等待从库执行完成)的性能损耗。

二、环境准备:半同步复制的前提条件

在部署半同步复制前,需确保满足以下硬性要求(参考文档核心条件):
 
  1. 支持动态加载插件
     
    半同步复制通过插件实现,需确认 MySQL 开启动态加载功能。执行以下命令验证,返回值为 YES 即符合要求:
     
    SHOW VARIABLES LIKE '%have_dynamic_loading%';
    
     
     
    (MySQL 二进制发行版默认支持动态加载,无需额外配置)
  2. 主从复制已正常运行
     
    半同步是在传统主从复制基础上的增强,需先完成主从复制搭建(如 GTID 配置、从库 CHANGE MASTER TO 配置),确保从库能正常同步主库数据。
  3. 仅支持默认复制通道(single channel)
     
    MySQL 半同步复制暂不支持多复制通道(multiple replication channels),需确保未配置额外通道(默认仅使用 default 通道)。
  4. MySQL 版本一致性
     
    主从库需均为 MySQL 8 版本,且建议版本一致(避免因版本差异导致插件兼容性问题);若使用 MySQL 8.0.26 及以上版本,需注意插件名称已更新(下文详细说明)。

三、核心步骤:半同步复制部署与开启

半同步复制的部署核心是 “安装插件→开启功能→持久化配置”,需分别在主库(Source) 和从库(Replica) 操作,且需区分 MySQL 8.0.26 前后的插件名称差异。

1. 插件安装:区分版本选择正确插件

MySQL 8.0.26 引入了 “源库(Source)” 和 “副本库(Replica)” 的新术语,替代了传统的 “主库(Master)” 和 “从库(Slave)”,对应的半同步插件名称也随之更新,新旧插件不可同时使用。

场景 1:MySQL 8.0.26 及以上版本(新插件)

  • 主库(Source)安装插件:
     
    -- 安装源库半同步插件
    INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so'; -- Linux
    -- INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.dll'; -- Windows
    
     
     
  • 从库(Replica)安装插件:
     
    -- 安装副本库半同步插件
    INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so'; -- Linux
    -- INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.dll'; -- Windows
    
     
     

场景 2:MySQL 8.0.25 及以下版本(旧插件)

  • 主库(Master)安装插件:
     
    INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; -- Linux
    
     
     
  • 从库(Slave)安装插件:
     
    INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; -- Linux
    
     
     

验证插件安装成功

安装后,通过以下命令检查插件状态,PLUGIN_STATUS 为 ACTIVE 即表示安装成功:
SELECT PLUGIN_NAME, PLUGIN_STATUS 
FROM INFORMATION_SCHEMA.PLUGINS 
WHERE PLUGIN_NAME LIKE '%semi%';
 
 
(示例输出:rpl_semi_sync_source | ACTIVE

2. 开启半同步复制:临时生效与持久化

插件安装后默认处于 “未启用” 状态,需通过全局变量开启,且需分 “临时生效(重启失效)” 和 “持久化(配置文件)” 两步操作。

步骤 1:临时开启(全局变量设置)

  • MySQL 8.0.26+ 版本:
    -- 主库(Source)开启半同步
    SET GLOBAL rpl_semi_sync_source_enabled = 1;
    -- 从库(Replica)开启半同步
    SET GLOBAL rpl_semi_sync_replica_enabled = 1;
    
     
     
  • MySQL 8.0.25- 版本:
    -- 主库(Master)开启半同步
    SET GLOBAL rpl_semi_sync_master_enabled = 1;
    -- 从库(Slave)开启半同步
    SET GLOBAL rpl_semi_sync_slave_enabled = 1;
    
     
     

步骤 2:重启从库 IO 线程(关键!)

若主从复制已在运行,仅开启变量无法切换为半同步,需重启从库的 IO 线程(负责拉取主库 binlog),触发半同步机制:
 
  • MySQL 8.0.22+ 版本(新命令):
    STOP REPLICA IO_THREAD; -- 停止 IO 线程
    START REPLICA IO_THREAD; -- 启动 IO 线程
    
     
     
  • MySQL 8.0.21- 版本(旧命令):
    STOP SLAVE IO_THREAD;
    START SLAVE IO_THREAD;
    
     
     

步骤 3:持久化配置(避免重启失效)

临时开启的配置会在 MySQL 重启后丢失,需写入主从库的配置文件(如 /etc/my.cnf 或 my.ini):
 
  • MySQL 8.0.26+ 主库配置:
    [mysqld]
    # 持久化开启半同步(源库)
    rpl_semi_sync_source_enabled = 1
    # 可选:设置超时时间(毫秒,默认 10000)
    rpl_semi_sync_source_timeout = 5000 
    
     
     
  • MySQL 8.0.26+ 从库配置:
    [mysqld]
    # 持久化开启半同步(副本库)
    rpl_semi_sync_replica_enabled = 1
    
     
     
  • MySQL 8.0.25- 主从库配置:
    # 主库(Master)
    [mysqld]
    rpl_semi_sync_master_enabled = 1
    rpl_semi_sync_master_timeout = 5000
    
    # 从库(Slave)
    [mysqld]
    rpl_semi_sync_slave_enabled = 1
    
     
配置后重启 MySQL 服务,验证变量是否生效:
 
-- 8.0.26+ 主库验证
SHOW GLOBAL VARIABLES LIKE 'rpl_semi_sync_source_enabled'; -- 应返回 1
 

四、关键参数配置:掌控半同步复制行为

半同步复制的核心逻辑可通过系统变量调整,以下是必须理解的 4 个关键参数(仍区分版本术语):
 
参数(8.0.26+)对应旧参数(8.0.25-)作用说明默认值
rpl_semi_sync_source_enabled rpl_semi_sync_master_enabled 主库是否开启半同步复制(1 = 开启,0 = 关闭) 0
rpl_semi_sync_source_timeout rpl_semi_sync_master_timeout 主库等待从库确认的超时时间(毫秒),超时后自动降级为异步复制 10000
rpl_semi_sync_source_wait_for_replica_count rpl_semi_sync_master_wait_for_slave_count 主库需等待确认的从库数量(0 = 无需等待,1 = 至少 1 个从库) 0
rpl_semi_sync_source_wait_point rpl_semi_sync_master_wait_point 主库等待从库确认的 “时间节点”,决定数据一致性级别 after_sync

重点参数详解:wait_point 的两种模式

rpl_semi_sync_source_wait_point 是影响数据一致性的核心参数,支持 after_sync 和 after_commit 两种模式,需根据业务场景选择:
 
  1. after_sync(默认,推荐)
    • 流程:主库将事务写入 binlog → 同步到从库 → 等待从库确认接收 → 主库提交事务到存储引擎 → 返回客户端 “成功”。
    • 优势:所有客户端看到的 “已提交事务” 均已同步到从库,主库宕机后故障转移到从库,无数据丢失(从库已拥有所有已提交事务)。
    • 适用场景:金融、电商等对数据一致性要求极高的业务。
  2. after_commit
    • 流程:主库写入 binlog → 提交事务到存储引擎 → 等待从库确认接收 → 返回客户端 “成功”。
    • 风险:主库提交后、从库确认前,其他客户端已能看到该事务;若此时主库宕机且从库未同步,故障转移后会出现 “数据不一致”(从库缺失该事务)。
    • 适用场景:对一致性要求较低,但需减少主库提交延迟的场景(如日志存储)。

五、监控与状态验证:确保半同步正常运行

部署后需通过状态变量监控半同步复制的运行状态,及时发现异常(如超时降级、确认失败)。执行以下命令查看关键状态:
 
-- 8.0.26+ 版本查看半同步状态变量
SHOW GLOBAL STATUS LIKE 'Rpl_semi_sync%';
 
 
核心状态变量含义解析:
 
状态变量(8.0.26+)对应旧变量(8.0.25-)含义说明
Rpl_semi_sync_source_status Rpl_semi_sync_master_status 主库当前半同步状态(1 = 运行中,0 = 已降级为异步)
Rpl_semi_sync_source_yes_tx Rpl_semi_sync_master_yes_tx 从库成功确认的事务总数(数值持续增加表示正常)
Rpl_semi_sync_source_no_tx Rpl_semi_sync_master_no_tx 从库未确认的事务总数(数值增加表示存在超时或从库异常)
Rpl_semi_sync_source_clients Rpl_semi_sync_master_clients 已连接主库的半同步从库数量(需至少为 1,否则主库无法触发半同步)
Rpl_semi_sync_replica_status Rpl_semi_sync_slave_status 从库当前半同步状态(1 = 运行中,0 = 未启用)

验证半同步效果的实操步骤

  1. 在主库执行一条插入语句:
     
    CREATE DATABASE IF NOT EXISTS semi_sync_test;
    USE semi_sync_test;
    CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20));
    INSERT INTO t1 (name) VALUES ('test_semi_sync');
    
     
     
  2. 查看主库状态变量,确认 Rpl_semi_sync_source_yes_tx 数值增加(表示从库已确认):
    SHOW GLOBAL STATUS LIKE 'Rpl_semi_sync_source_yes_tx'; -- 数值应 +1
    
     
     
  3. 在从库查询 t1 表,确认数据已同步:
    USE semi_sync_test;
    SELECT * FROM t1; -- 应返回 (1, 'test_semi_sync')
    
     
     

六、常见问题与注意事项

  1. 新旧插件不可同时安装
     
    若在 8.0.26+ 版本中同时安装 rpl_semi_sync_source 和 rpl_semi_sync_master,会报 “插件已存在” 错误,需先卸载旧插件(UNINSTALL PLUGIN 插件名)再安装新插件。
  2. 超时后自动降级为异步
     
    当主库等待从库确认超过 rpl_semi_sync_source_timeout 时,会自动切换为异步复制,此时 Rpl_semi_sync_source_status 变为 0;需排查从库 IO 线程是否正常(SHOW REPLICA STATUS)、网络是否通畅。
  3. 故障转移后的处理
     
    若主库宕机,需将半同步从库提升为新主库;新主库需重新配置半同步插件(作为源库),其他从库需重新指向新主库并开启半同步,避免新架构回退为异步。
  4. 性能优化建议
     
    从 MySQL 8.0.23 开始,可开启以下两个变量提升半同步性能:
    -- 减少锁竞争,优化多从库场景性能
    SET GLOBAL replication_optimize_for_static_plugin_config = 1;
    -- 限制回调,降低主库资源消耗
    SET GLOBAL replication_sender_observe_commit_only = 1;
    
     
     

七、总结:半同步复制的适用场景与价值

MySQL 8 半同步复制通过 “确认接收” 机制,解决了异步复制的数据丢失风险,同时避免了全同步复制的性能瓶颈,其核心价值在于:
 
  • 数据可靠性:默认 after_sync 模式下,主库已提交事务均已同步到从库,故障转移无数据丢失;
  • 灵活性:超时降级机制确保业务不阻塞,参数可按需调整(如超时时间、等待从库数量);
  • 低门槛:基于插件实现,无需额外部署第三方工具(如 MHA),运维成本低。
 
适用场景:电商订单、金融交易、支付系统等对数据一致性要求高,且能接受毫秒级提交延迟的业务;不适用场景:超高性能要求(如每秒数十万事务)、无需数据一致性的日志存储场景。

posted on 2025-09-30 15:13  数据派  阅读(28)  评论(0)    收藏  举报