同步复制是什么
同步复制要求写操作在主备两侧都确认后才向应用返回成功,因此故障切换时数据基本不丢,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 |
同步复制组件故障时如果不降级为异步,可能阻塞主库写入;『写全阻塞』与『退化为异步』要明确取舍,并把退化动作纳入演练。
半同步只保证日志被备侧接收,不保证已应用:切换时仍要以备侧实际执行到的位点为准,必要时先在切换前确认延迟与位点状态。