异步复制是什么
异步复制指主侧事务提交成功后立即向应用返回,变更随后由复制线程传到备侧重放。写路径不等待备侧确认,因此跨城、跨区域的时延不会进入业务响应时间;代价是主侧故障时,尚未传完的那部分变更会丢,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,批量导入或网络抖动时积压到分钟级。设计容灾指标要按压力测试与演练时实测的最大积压,而不是平均值。
延迟指标不能替代监控:复制线程中断数天而告警缺失的情况在演练中很常见,切换时才发现备库数据严重过期。