MySQL 8 半同步复制
在 MySQL 主从复制架构中,传统异步复制虽能满足大部分场景的性能需求,但存在 “主库提交事务后,从库未同步就宕机导致数据丢失” 的风险。而 MySQL 8 半同步复制 通过 “主库等待从库确认接收事务” 的机制,在性能与数据一致性间取得平衡,成为对数据可靠性有要求的业务(如电商订单、金融交易)的优选方案。本文将基于 MySQL 8 特性,从概念解析、环境准备、部署配置到监控运维,提供一套可落地的半同步复制实践方案。
一、半同步复制核心概念:到底 “半” 在哪里?
要理解半同步复制,需先明确其与传统异步复制的核心差异 ——事务提交的 “确认机制”:
- 异步复制:主库执行事务并写入 binlog 后,立即向客户端返回 “提交成功”,无需等待从库获取 binlog;从库通过 IO 线程异步拉取主库 binlog,存在 “主库宕机时,未同步的 binlog 丢失” 风险。
- 半同步复制:主库提交事务后,需等待至少一个从库确认 “已接收并写入中继日志(relay log)”,才向客户端返回 “成功”;若超过指定超时时间(默认 10 秒)仍未收到确认,自动降级为异步复制,避免业务阻塞。
简言之,半同步复制的 “半” 体现在:主库无需等待从库执行事务(仅需确认接收),既保障了数据不丢失,又避免了全同步复制(需等待从库执行完成)的性能损耗。
二、环境准备:半同步复制的前提条件
在部署半同步复制前,需确保满足以下硬性要求(参考文档核心条件):
-
支持动态加载插件半同步复制通过插件实现,需确认 MySQL 开启动态加载功能。执行以下命令验证,返回值为
YES即符合要求:SHOW VARIABLES LIKE '%have_dynamic_loading%';(MySQL 二进制发行版默认支持动态加载,无需额外配置) -
主从复制已正常运行半同步是在传统主从复制基础上的增强,需先完成主从复制搭建(如 GTID 配置、从库 CHANGE MASTER TO 配置),确保从库能正常同步主库数据。
-
仅支持默认复制通道(single channel)MySQL 半同步复制暂不支持多复制通道(multiple replication channels),需确保未配置额外通道(默认仅使用
default通道)。 -
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 两种模式,需根据业务场景选择:-
after_sync(默认,推荐)- 流程:主库将事务写入 binlog → 同步到从库 → 等待从库确认接收 → 主库提交事务到存储引擎 → 返回客户端 “成功”。
- 优势:所有客户端看到的 “已提交事务” 均已同步到从库,主库宕机后故障转移到从库,无数据丢失(从库已拥有所有已提交事务)。
- 适用场景:金融、电商等对数据一致性要求极高的业务。
-
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 = 未启用) |
验证半同步效果的实操步骤
- 在主库执行一条插入语句:
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'); - 查看主库状态变量,确认
Rpl_semi_sync_source_yes_tx数值增加(表示从库已确认):SHOW GLOBAL STATUS LIKE 'Rpl_semi_sync_source_yes_tx'; -- 数值应 +1 - 在从库查询
t1表,确认数据已同步:USE semi_sync_test; SELECT * FROM t1; -- 应返回 (1, 'test_semi_sync')
六、常见问题与注意事项
-
新旧插件不可同时安装若在 8.0.26+ 版本中同时安装
rpl_semi_sync_source和rpl_semi_sync_master,会报 “插件已存在” 错误,需先卸载旧插件(UNINSTALL PLUGIN 插件名)再安装新插件。 -
超时后自动降级为异步当主库等待从库确认超过
rpl_semi_sync_source_timeout时,会自动切换为异步复制,此时Rpl_semi_sync_source_status变为 0;需排查从库 IO 线程是否正常(SHOW REPLICA STATUS)、网络是否通畅。 -
故障转移后的处理若主库宕机,需将半同步从库提升为新主库;新主库需重新配置半同步插件(作为源库),其他从库需重新指向新主库并开启半同步,避免新架构回退为异步。
-
性能优化建议从 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),运维成本低。
适用场景:电商订单、金融交易、支付系统等对数据一致性要求高,且能接受毫秒级提交延迟的业务;不适用场景:超高性能要求(如每秒数十万事务)、无需数据一致性的日志存储场景。
浙公网安备 33010602011771号