非常好的主题 👍 — “MySQL 8 半同步复制(Semi-Synchronous Replication)详解” 是数据库高可用与数据一致性中的重要知识点。
下面给你一份系统讲解,从原理、配置到性能优化,全面梳理 MySQL 8 半同步复制 的实现机制与最佳实践。
🧩 MySQL 8 半同步复制(Semi-Synchronous Replication)详解
一、什么是半同步复制?
半同步复制(Semi-Synchronous Replication)
是 MySQL 在 异步复制 和 全同步复制 之间的一种折中方案。
📘 概念简述:
- 在传统 异步复制(Asynchronous Replication) 中,主库(Primary) 执行完事务并提交后就立即返回成功,不等待从库(Replica) 的确认。
- ✅ 优点:性能好
- ❌ 缺点:主库宕机可能导致数据丢失(从库未同步)
- 在 半同步复制 中: 主库在提交事务后,至少等待一个从库确认已接收到 binlog(写入 relay log),才向客户端返回成功。
二、半同步复制的工作原理 🔧
🧠 核心机制:
- 客户端在主库执行
COMMIT
; - 主库写入 binlog;
- 主库通过 dump thread 发送 binlog 给从库;
- 从库接收并写入 relay log;
- 从库通过 acknowledgement(ACK) 告知主库已接收;
- 主库收到至少一个 ACK 后才返回提交成功。
📈 对比示意图:
类型 | 主库等待从库确认? | 数据安全性 | 性能 |
---|---|---|---|
异步复制 | ❌ 不等待 | 较差 | ✅ 快 |
半同步复制 | ✅ 至少一个ACK | 中等(无丢失风险) | ⚖️ 稍慢 |
全同步复制 | ✅ 所有ACK | 最安全 | ❌ 慢 |
三、MySQL 8 半同步复制的改进(相对 5.7)
MySQL 8 对半同步复制做了多项增强:
特性 | MySQL 5.7 | MySQL 8.0 |
---|---|---|
插件名称 | rpl_semi_sync_master / slave | rpl_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 模式是生产环境最推荐的复制方式。
发表回复