异步复制

主侧写成功即返回,变更随后传到备侧:写性能不受跨站时延影响,但故障时可能丢失尚未复制完的数据,RPO 大于 0。

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

异步复制是什么

异步复制指主侧事务提交成功后立即向应用返回,变更随后由复制线程传到备侧重放。写路径不等待备侧确认,因此跨城、跨区域的时延不会进入业务响应时间;代价是主侧故障时,尚未传完的那部分变更会丢,RPO 大于 0,具体大小取决于复制积压程度。

基本信息

常见形态MySQL 主从、PostgreSQL 流复制默认模式、SQL Server 日志传送、存储层远程异步复制
收益对主链路性能影响小,可跨长距离部署,链路抖动只影响备侧进度
代价切换时存在数据丢失窗口,实际 RPO 由复制频率、带宽与积压决定
优化手段并行复制线程、组提交、压缩传输、提高网络带宽、拆分大事务

典型使用场景

  • 异地容灾:跨城链路时延高,同步写不可接受时用异步保住性能
  • 读写分离:备库承接报表与只读查询,同时兼作容灾节点
  • 迁移过渡:新旧环境并行期间先异步追平数据,再择机切换
  • 云上跨区复制:跨可用区或跨区域副本,防止单区故障
  • 离线分析同步:把变更同步到分析库,允许分钟级延迟

查看复制状态与延迟(MySQL)

查看复制状态与延迟(MySQL)
# 关注两个复制线程是否 Running,以及延迟与 GTID 差值
SHOW REPLICA STATUS\G
# 关键字段:Replica_IO_Running / Replica_SQL_Running / Seconds_Behind_Source
# MySQL 8.0.22 之前字段名为 Seconds_Behind_Master
# 大事务会拉长重放时间:用 GTID 差集估算尚未应用的变更量
SHOW REPLICA STATUS\G | grep -E 'Executed_Gtid_Set|Retrieved_Gtid_Set'

SHOW REPLICA STATUS 读法

字段含义正常/异常
Replica_IO_Running拉取主库 binlog 的线程状态非 Yes 表示链路或网络异常,备侧不再前进
Replica_SQL_Running重放日志到备库的线程状态非 Yes 多为数据冲突或 SQL 执行报错中断
Seconds_Behind_Source备侧重放落后主库的秒数估计断链或缺时间戳时可能显示 NULL,不能只看它
Retrieved_Gtid_Set / Executed_Gtid_Set已拉取与已执行的 GTID 集合两者差集就是尚未应用的变更量,更接近真实丢失窗口
Replica_SQL_Delay主库写入与备库开始重放的固定延迟用于刻意制造延迟窗口,正常场景应为 0
异步复制的 RPO 是动态值:平峰时可能接近 0,批量导入或网络抖动时积压到分钟级。设计容灾指标要按压力测试与演练时实测的最大积压,而不是平均值。
延迟指标不能替代监控:复制线程中断数天而告警缺失的情况在演练中很常见,切换时才发现备库数据严重过期。

易错点

  • 按平均延迟评估 RPO:突发写入把延迟拉大时,故障恰落在积压窗口内,丢失量远超预期
  • 复制链路长期无人监控:线程中断数周后才发现,备库数据早已过期,切换等于换一个坏的可用点
  • 大事务一次灌入:备侧重放要串行执行,延迟从秒级跳到小时级,链路恢复时间被严重低估
  • 切换前不做数据核对:直接提升备库,把落后的数据当作最新状态对外服务

数据来源与参考

  • MySQL 8.0 Reference Manual(Replication / SHOW REPLICA STATUS)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌