同步复制、异步复制、半同步复制有什么区别?
简化版
同步复制在返回成功前等待规定副本持久化,RPO 更小但延迟和故障敏感度更高;异步复制主节点本地成功就返回,延迟低、可用性高,但主故障可能丢失尚未复制的数据;半同步只等待至少一个或指定数量的从副本确认,是两者之间的策略。准确语义取决于“确认到内存还是磁盘、等几个副本、超时后是否降级”。
详细版
同步复制不等于等待所有副本,常见是等待 quorum 或指定远端副本。成功条件必须明确:日志是否已持久化、是否已提交、是否已应用。
异步复制允许 replication lag。若主库已确认 1000 条、本地从库只追到 990,主库永久损坏且强制提升从库,最多可能丢 10 条已对客户端成功的写,实际 RPO 由 lag 和故障切换策略决定。
半同步常指主节点至少等一个从节点接收或落盘再返回。它降低单机故障的数据丢失概率,但不一定形成共识;确认副本是否能被选为新主、网络分区是否会双写,仍需选主和 fencing 机制。
设计时同时给出 RPO、RTO、P99 延迟、故障域和降级规则。不能只用“金融同步、日志异步”这种标签代替失败路径分析。
完整版教学
一、区别在成功确认点
复制模式真正的差异是客户端何时收到成功。异步模式在主节点本地持久化后即可返回,副本随后追赶;同步模式要等策略要求的远端确认;半同步通常等待部分副本,但具体产品定义不同。
异步:primary durable -> ACK client -> ship log
同步:primary durable -> replica durable/quorum -> ACK client
二、确认层级必须说清
“副本已收到”可能只表示进入网络缓冲,也可能表示写入 OS page cache、fsync 完成或状态机已应用。这些语义的故障后果不同。面试回答应把 durable、committed、applied 分开,否则“同步”两个字没有可验证含义。
| 确认点 | 能抵抗的故障 | 仍有风险 |
|---|---|---|
| 收到内存 | 传输已到达 | 副本断电可丢 |
| 副本 fsync | 单节点掉电 | 选主可能不用该副本 |
| 多数派提交 | CFT 少数故障 | 少数派不可写 |
| 副本应用 | 可立即本地读新值 | 延迟更高,通常非写确认必需 |
三、用数字理解 RPO 与延迟
假设跨可用区 RTT 为 3 ms,本地 fsync 为 1 ms。异步写可能约 1~2 ms 返回;等待一个跨区副本至少多一段网络与远端持久化时间,可能变为 5~8 ms。数字只是推演,排队和尾延迟会让 P99 更大。
如果写入 2000 条/秒,异步副本落后 4 秒,理论暴露窗口可达约 8000 条。RPO 应以时间和业务笔数同时监控,不能只看一个平均 lag。
四、半同步不是自动强一致
半同步只说明返回前等到某种从库确认。若主与已确认从库都在同一机架,同时断电仍可能丢数据;若故障切换提升了另一个更落后的从库,也会丢已确认写。选主必须比较日志新旧,并通过仲裁与 fencing 阻止旧主继续写。
因此半同步可以改善数据耐久性,却不天然提供线性一致、无损切换或防脑裂。必须结合产品协议说明其保证,而不是从名称推导保证。
五、超时与降级策略
同步副本不可达时,可以阻塞、失败或自动退化成异步。阻塞保护 RPO 却伤可用性;自动异步保护写入可用性却扩大数据风险。系统必须把模式变化暴露为告警和状态,不能静默降级。
例如支付主账可在多数派不足时拒写,而行为日志可降为本地队列异步补传。策略应由业务后果决定,并在演练中验证“副本断开 10 分钟、主节点随后故障”的恢复结果。
六、故障域与监控
副本数量不是可靠性的全部。三副本都在同一机柜无法抵抗机柜断电;跨地域同步则可能显著放大延迟。常见做法是同城多可用区同步、异地异步灾备,但准确拓扑取决于 RPO/RTO。
监控包括发送位点、接收位点、持久化位点、应用位点、lag bytes/time、最老未复制日志、同步降级次数和 ACK 延迟。容量规划还要确保 WAL 保留时间覆盖最长可接受离线,否则落后副本只能全量重建。
记忆钩子:不要背“同步安全、异步快”;先问“成功等到哪一步、几个副本、哪个故障域、超时后怎么办”。
七、常见误区与追问
- 误区:同步复制必须等所有副本。 可以等待指定副本或多数派,语义由协议定义。
- 误区:半同步就是强一致。 它只改变 ACK 条件,还需安全选主、fencing 和读路径。
- 误区:异步复制一定会丢数据。 正常运行会收敛,但在未复制窗口内发生不可恢复主故障时存在丢失风险。
- 追问:如何估算潜在丢失? 同时看 lag 时间、字节和业务位点,并结合实际故障提升对象。
- 追问:同步超时能否自动异步? 可以设计,但必须由业务授权、显式告警并记录风险窗口。
- 追问:为什么应用进度也要看? 已持久化未应用的副本可保数据,却可能暂时返回旧读。
八、加强记忆
三种模式都围绕 ACK 边界:异步只等主,半同步等部分远端,同步等规定的持久化集合。再把确认层级、故障域、选主和降级补上,才能推导真实 RPO、RTO 与延迟。名称不是保证,协议的成功条件和失败路径才是保证。