同步复制

写操作在主备两侧都确认后才返回成功:RPO 接近 0,但跨站点往返时延会直接叠加到写延迟,适合同城低时延链路。

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

同步复制是什么

同步复制要求写操作在主备两侧都确认后才向应用返回成功,因此故障切换时数据基本不丢,RPO 接近 0。代价是跨站点的往返时延会直接叠加到每一次写事务上。严格意义上的全同步在两站点距离较远时几乎不可用,工程上更常见的是半同步:主库等待至少一个从库确认收到日志,超时后退化为异步以免阻塞写入。

基本信息

适用平台MySQL 半同步复制、存储阵列同步远程复制、部分分布式数据库的多副本强一致模式
收益故障切换时数据基本不丢,RPO≈0
代价写延迟升高;备侧不可用或链路抖动时需要有明确的降级或阻塞策略
典型参数MySQL 8.0.26 起插件名为 rpl_semi_sync_source / rpl_semi_sync_replica,超时后自动退化为异步

典型使用场景

  • 同城双机房核心库:距离几十公里内,时延可控,可承受同步开销
  • 关键交易数据:业务明确要求切换不丢数据,宁可接受更高写入延迟
  • 存储层双活:阵列同步远程复制,保证两端卷数据一致
  • 金融与账务系统:配合审计要求,切换后数据不可出现缺口
  • 窗口期使用:仅在大促、月末结算等关键时段临时启用更严格的同步策略

MySQL 半同步语义参考

MySQL 半同步语义参考
# 8.0.26 及以上:插件名与变量已改为 source / replica 命名
INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so';
SET GLOBAL rpl_semi_sync_source_enabled = ON;
# 从库侧开启 ack:主库等待至少一个从库确认收到日志
INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so';
SET GLOBAL rpl_semi_sync_replica_enabled = ON;
# 超时设置:等待超过该时长后退化为异步,避免写事务长时间卡住
SET GLOBAL rpl_semi_sync_source_timeout = 1000;
# 观察是否仍有从库在确认
SHOW STATUS LIKE 'Rpl_semi_sync_source_status';

同步语义对照

模式确认时机RPO 与写延迟
全同步主备都完成落盘与应用RPO≈0,写延迟叠加完整往返时延
半同步备侧确认收到日志即返回RPO 接近 0,延迟开销小于全同步
异步主侧提交即返回写延迟最低,故障时可能丢部分数据
超时退化等待超时后按异步继续兼顾可用性,但退化期间 RPO 不再为 0
同步复制组件故障时如果不降级为异步,可能阻塞主库写入;『写全阻塞』与『退化为异步』要明确取舍,并把退化动作纳入演练。
半同步只保证日志被备侧接收,不保证已应用:切换时仍要以备侧实际执行到的位点为准,必要时先在切换前确认延迟与位点状态。

易错点

  • 忽略跨站时延对事务响应的影响:核心链路吞吐下降,压测与上线表现差异明显
  • 备侧故障时无限等待确认:把主库写入拖死,故障从备侧扩散到主链路
  • 把半同步当作零丢失承诺:日志已接收但未应用,切换仍会丢失部分事务
  • 未演练退化路径:超时退化是自动发生的,运维却不清楚当前实际一致性级别

数据来源与参考

  • MySQL 8.0 Reference Manual(Semisynchronous Replication)
  • 存储复制技术文档(同步远程复制)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌