非常好的主题 👍 — “MySQL 8 半同步复制(Semi-Synchronous Replication)详解” 是数据库高可用与数据一致性中的重要知识点。

下面给你一份系统讲解,从原理、配置到性能优化,全面梳理 MySQL 8 半同步复制 的实现机制与最佳实践。


🧩 MySQL 8 半同步复制(Semi-Synchronous Replication)详解


一、什么是半同步复制?

半同步复制(Semi-Synchronous Replication)
是 MySQL 在 异步复制全同步复制 之间的一种折中方案。

📘 概念简述:

  • 在传统 异步复制(Asynchronous Replication) 中,主库(Primary) 执行完事务并提交后就立即返回成功,不等待从库(Replica) 的确认。
    • ✅ 优点:性能好
    • ❌ 缺点:主库宕机可能导致数据丢失(从库未同步)
  • 半同步复制 中: 主库在提交事务后,至少等待一个从库确认已接收到 binlog(写入 relay log),才向客户端返回成功。

二、半同步复制的工作原理 🔧

🧠 核心机制:

  1. 客户端在主库执行 COMMIT
  2. 主库写入 binlog
  3. 主库通过 dump thread 发送 binlog 给从库;
  4. 从库接收并写入 relay log
  5. 从库通过 acknowledgement(ACK) 告知主库已接收;
  6. 主库收到至少一个 ACK 后才返回提交成功。

📈 对比示意图:

类型主库等待从库确认?数据安全性性能
异步复制❌ 不等待较差✅ 快
半同步复制✅ 至少一个ACK中等(无丢失风险)⚖️ 稍慢
全同步复制✅ 所有ACK最安全❌ 慢

三、MySQL 8 半同步复制的改进(相对 5.7)

MySQL 8 对半同步复制做了多项增强:

特性MySQL 5.7MySQL 8.0
插件名称rpl_semi_sync_master / slaverpl_semi_sync_source / replica
确认机制仅等待写入 relay log支持等待事务应用(AFTER_SYNC 模式)
性能较低显著优化(并发与 ACK 机制改进)
自动切换手动开启/关闭支持动态调整

四、两种确认模式(MySQL 8 新特性)

MySQL 8 引入两种模式:

模式说明安全性性能
AFTER_SYNC(默认)主库等待从库确认已写入 relay log✅ 高⚖️ 中
AFTER_COMMIT主库等待从库事务应用完✅✅ 更高❌ 慢

配置示例:

SET GLOBAL rpl_semi_sync_source_wait_point = AFTER_SYNC;


五、半同步复制的配置步骤 🧭

✅ 1️⃣ 主库(Source)配置

编辑 my.cnf

[mysqld]
server-id=1
log-bin=mysql-bin
plugin-load-add=rpl_semi_sync_source=semisync_source.so
rpl_semi_sync_source_enabled=1

登录 MySQL 启动插件:

INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so';
SET GLOBAL rpl_semi_sync_source_enabled = 1;


✅ 2️⃣ 从库(Replica)配置

编辑 my.cnf

[mysqld]
server-id=2
relay-log=relay-bin
plugin-load-add=rpl_semi_sync_replica=semisync_replica.so
rpl_semi_sync_replica_enabled=1

登录 MySQL 启动插件:

INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so';
SET GLOBAL rpl_semi_sync_replica_enabled = 1;


✅ 3️⃣ 建立复制关系

在主库:

CREATE USER 'repl'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

在从库:

CHANGE REPLICATION SOURCE TO
SOURCE_HOST='主库IP',
SOURCE_USER='repl',
SOURCE_PASSWORD='123456',
SOURCE_AUTO_POSITION=1;

START REPLICA;


六、验证半同步复制是否启用

在主库查看状态:

SHOW STATUS LIKE 'Rpl_semi_sync_source_status';

输出应为:

Variable_name                      Value
---------------------------------- -----
Rpl_semi_sync_source_status        ON
Rpl_semi_sync_source_clients       1
Rpl_semi_sync_source_wait_sessions 0

在从库查看:

SHOW STATUS LIKE 'Rpl_semi_sync_replica_status';


七、自动降级与恢复机制 ⚙️

  • 当主库等待 ACK 超过超时时间: rpl_semi_sync_source_timeout = 10000 # 默认10秒 超时后自动切换回 异步复制模式
  • 当从库恢复并重新发送 ACK 时:
    主库自动恢复为半同步模式。

这就是 “自动降级 / 自动恢复” 特性。


八、性能优化建议 🚀

参数作用建议值
rpl_semi_sync_source_enabled启用主库半同步1
rpl_semi_sync_replica_enabled启用从库半同步1
rpl_semi_sync_source_timeout等待ACK超时时间(ms)10000~30000
rpl_semi_sync_source_wait_no_slave是否无从库时等待OFF(推荐)
rpl_semi_sync_source_trace_level调试级别32(可观察日志)

九、常见问题 ❓

问题原因解决方案
主库卡顿、事务提交变慢从库 ACK 延迟或网络抖动调大 timeout,检查网络
无法进入半同步插件未加载或参数配置错误检查 rpl_semi_sync_*_enabled
半同步自动降级从库断开、ACK 超时修复从库后主库会自动恢复

🔟 适用场景与局限性

适用:

  • 对数据一致性要求较高的业务(如金融、交易类系统)
  • 主从架构、延迟低的局域网环境

不适用:

  • 高延迟广域网(ACK 等待时间长)
  • 对性能要求极高、数据丢失可容忍的场景(可用异步复制)

📘 总结

对比项异步复制半同步复制全同步复制
提交延迟最低中等最高
数据安全一般最高
主从一致性最强
性能✅ 快⚖️ 平衡❌ 慢
是否等待从库至少一个所有

一句话总结:

半同步复制是性能与数据安全的最佳折中方案,
MySQL 8 的 AFTER_SYNC 模式是生产环境最推荐的复制方式。