半同步复制

主库等待至少一个备库确认收到日志再返回(无需应用完成):在可靠性与时延之间取折中,是 MySQL 等数据库的常见选项。

备份与容灾速查数据更新于 2026-10-13

半同步复制

介于异步与全同步之间的复制模式:主库提交时等待至少一个备库确认『已收到日志』,收到确认就返回客户端,不必等备库应用完成。这样在保证数据不丢的前提下,把等待时间压到网络往返量级。等待超时会自动退化为异步,可用性保住了,但退化期间存在数据丢失窗口,这一点必须被监控覆盖。

基本信息

适用平台MySQL(插件 rpl_semi_sync_source/replica)、MariaDB 半同步插件
语义备库确认收到日志即返回,不等应用完成
关键参数超时时间(毫秒)、等待副本数
退化行为超过超时时间未收到确认则转为异步,写不再阻塞

典型使用场景

  • 核心交易库要求数据不丢,同时不能接受全同步带来的高延迟
  • 同城双机房部署:专线时延低,半同步带来的额外延迟可接受
  • 规避异步复制的数据丢失:主库故障切换时尽量减少未同步事务
  • 作为过渡方案:从异步升级到更强一致性前的中间状态
  • 跨机房主备的日常运行模式,配合监控确认从未长时间退化

MySQL 半同步关键参数

MySQL 半同步关键参数
# 主库:安装并启用插件后设置
rpl_semi_sync_source_enabled = ON
rpl_semi_sync_source_timeout = 1000                          # 毫秒,超时退化为异步
rpl_semi_sync_source_wait_for_replica_count = 1              # 至少等待几个副本确认
# 备库
rpl_semi_sync_replica_enabled = ON
# 运行期核对状态(MySQL 8.0 变量名)
# SHOW VARIABLES LIKE 'rpl_semi_sync%';
# SHOW STATUS LIKE 'Rpl_semi_sync_source_status';            # ON 表示当前仍是半同步

状态读法

指标含义异常表现
plugin status插件是否启用未启用时参数设置无效,实际仍是异步
Rpl_semi_sync_source_status当前是否处于半同步长期 OFF 说明已退化并持续丢数据风险
超时计数退化发生次数频繁增长说明副本慢或网络抖动
等待副本数每次提交等待的副本数量大于拓扑实际副本数时会次次等到超时
超时退化保证了可用性,但也意味着『退化为异步的那段时间』存在数据丢失窗口。监控必须同时覆盖插件状态与退化计数,只报警『复制断了』是不够的。

易错点

  • 超时退化后没有告警:系统长期以异步模式运行而无人知晓
  • 等待副本数大于拓扑中的实际副本数:每次提交都等到超时,写性能骤降
  • 插件未真正加载却只看参数:参数显示 ON,实际复制仍是异步
  • 把『确认收到』理解为『数据已落盘可查』:备库故障时仍可能丢失已确认但未应用的日志

数据来源与参考

  • MySQL 8.0 Reference Manual(Semisynchronous Replication 配置)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌