半同步复制原理
MySQL 的 半同步复制(Semi-Synchronous Replication) 是一种介于 异步复制 与 全同步复制 之间的数据复制机制,旨在提高数据一致性,同时尽量减少对主库性能的影响。

✅ 核心原理(MySQL 8.0/5.7+)
1. 事务提交流程
主库记录日志:客户端提交事务后,主库先将变更写入 Binlog。
等待确认:主库不会立即返回成功,而是等待 至少一个从库 将 Binlog 写入 Relay Log 并返回 ACK 确认。
事务提交返回:主库收到 ACK 后,才正式提交事务并返回成功给客户端。
2. 超时降级机制
如果主库在指定时间内(默认
rpl_semi_sync_master_timeout = 10s)未收到 ACK,则自动降级为异步复制,避免阻塞事务。当从库恢复后,主库会自动重新切换回半同步模式。
✅ 两种确认模式(MySQL 5.7+)
| 模式 | 说明 |
|---|---|
AFTER_SYNC | 推荐模式(默认):主库先同步 Binlog 到从库,再提交事务并返回客户端,数据一致性更强。 |
AFTER_COMMIT | 主库先提交事务,再等待从库 ACK,存在“主库已提交但从库未同步”的风险。 |
✅ 优缺点对比
| 维度 | 半同步复制 | 异步复制 | 全同步复制(组复制) |
|---|---|---|---|
| 数据一致性 | ✅ 高(至少一个从库确认) | ❌ 低(可能丢失数据) | ✅ 最高(所有从库确认) |
| 延迟 | 中等(等待 ACK) | 低(不等待) | 高(等待所有从库) |
| 可用性 | 中等(超时降级) | 高(主库不阻塞) | 低(主库可能阻塞) |
| 配置复杂度 | 中等(需插件+参数) | 低(默认) | 高(组复制) |
✅ 实际配置(主库)
[mysqld]
plugin-load-add = semisync_source.so
rpl_semi_sync_source_enabled = 1
rpl_semi_sync_source_timeout = 5000 # 单位毫秒从库:
[mysqld]
plugin-load-add = semisync_replica.so
rpl_semi_sync_replica_enabled = 1✅ 一句话总结
半同步复制 = 异步复制 + “至少一个从库确认”机制,在性能和数据安全之间取得平衡,是高可用架构中的关键手段。
