首页/数据/数据库速查/半同步复制(Semi-Sync)
主从复制与高可用53 条

半同步复制(Semi-Sync)

半同步保证「至少一个从库确认收到」事务才提交:降低故障丢失窗口;用 rpl_semi_sync_source/replica 插件,超时自动降级异步。

数据库速查数据更新于 2026-10-13

半同步的语义边界

默认的异步复制下,主库提交事务后就返回成功,此时若主库宕机,尚未传出的变更会丢。半同步复制要求主库至少收到一个从库的确认才向客户端提交成功,把故障丢失窗口压缩到一个事务以内。它保证的是从库已收到,不保证从库已落盘或已重放,因此仍不是零丢失方案。

基本信息

适用平台MySQL 5.7 / 8.0,通过 semisync 插件实现
插件名8.0 为 rpl_semi_sync_source 与 rpl_semi_sync_replica(旧名为 master/slave)
超时参数rpl_semi_sync_source_timeout,单位毫秒
超时行为自动降级为异步,并关闭半同步状态标志
拓扑要求至少两个候选从库,避免单点退化

典型使用场景

  • 对数据丢失敏感的业务,要求主库故障时最多丢一个未确认事务
  • 同城双机房:用近端从库做半同步确认,远端做异步
  • 切换演练前提高数据安全等级,降低切换时的数据损失
  • 希望提升复制可靠性但不引入组复制的运维复杂度
  • 订单、支付类核心库的复制链路加固

安装与启用

安装与启用
-- 源端(主库)
INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so';
SET GLOBAL rpl_semi_sync_source_enabled = 1;
-- 从库端
INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so';
SET GLOBAL rpl_semi_sync_replica_enabled = 1;
-- 确认状态:Rpl_semi_sync_source_status 为 ON 表示生效
SHOW STATUS LIKE 'Rpl_semi_sync%';

关键参数

关键参数
[mysqld]
rpl_semi_sync_source_enabled = 1
rpl_semi_sync_source_timeout = 1000                  # 毫秒,超时后降级并告警
rpl_semi_sync_source_wait_for_replica_count = 1      # 至少 N 个从库确认
rpl_semi_sync_source_wait_point = AFTER_SYNC         # 默认值,先等确认再提交
# 从库侧
rpl_semi_sync_replica_enabled = 1

状态与参数速查

项含义关注点
Rpl_semi_sync_source_status半同步当前是否生效显示 OFF 说明已降级为异步
no_times 类计数超时降级发生的次数持续增长说明从库响应慢或掉线
wait_point等待确认的时机AFTER_SYNC 是默认与推荐值
wait_for_replica_count需要确认的从库个数设大更安全但更容易触发降级
source_timeout等待确认的毫秒上限过小会频繁降级,过大则失去收益
半同步只保证事务已被从库接收,不保证从库已经提交或写入磁盘;真正追求零丢失要考虑组复制(MGR)或共享存储类方案。
只有一个从库时启用半同步,从库一断主库就退化成异步,反而让人以为仍受保护:至少配置两个候选从库,并把降级事件接入告警。

易错点

  • 只装插件不设 enabled=1:状态长期为 OFF,以为自己是半同步其实仍在异步复制
  • 从库降级无监控:超时后悄悄退回异步,业务方误判仍有保护,故障时才暴露丢失窗口
  • 单从库拓扑启用半同步:从库一停全链路退化为异步,配置两个候选从库才能兜住
  • 把超时设得过小:网络稍有抖动就频繁降级并告警,失去半同步本来的收益

数据来源与参考

  • MySQL 8.0 Reference Manual: Semisynchronous Replication

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌