跳到主要内容

跨地域复制、延迟与冲突

跨地域部署把用户请求放到更近的节点,并在单个地域故障时保留服务。地域之间的网络往返无法消除,因此同步复制、异步复制和多地写入必须在延迟、可用性、数据丢失窗口与冲突之间取舍。

1. 物理距离进入提交延迟

同步写入若等待远端多数确认,最小延迟至少包含跨地域往返与存储时间。距离更远、网络抖动更大时,P99 会明显上升。

把副本增加到更多地域不能免费提高可用性:写 quorum 可能更慢,故障时也更难取得。先按用户延迟、故障域和数据驻留要求选择副本位置。

2. 单主跨地域简化写入顺序

所有写入进入 home region 的 Leader,其他地域异步复制并提供陈旧读或代理写入。它避免多主写冲突,适合账户、配置和元数据。

远端用户写延迟包含到主地域的 RTT。读取副本可能落后,需要按接口选择:普通浏览读本地,写后读携带 commit position 等待追上,关键读取回主地域。

主地域完全故障时,提升异步副本可能丢失尚未复制的数据,RPO 取决于实际 replication lag,而不是“有副本”三个字。

3. 同步多地域复制缩小 RPO

共识组跨多个故障域复制并在多数确认后提交,可以在少数地域故障时保留已提交数据。代价是每次写入受 quorum 中较慢路径影响,并且失去多数地域后拒绝写入。

可以把投票副本放在三个地域,并让客户端就近连接 Leader;Leader 位置仍会影响写延迟。见证节点减少数据副本成本时,也要评估它是否具备独立故障域与足够稳定网络。

4. 多主写入让冲突成为业务问题

每个地域本地接受写入能降低延迟并提高分区期间可写性,但同一对象可能在不同地域并发更新。复制恢复后必须合并:

  • Last-write-wins 简单,但依赖时钟并可能静默丢更新。
  • 每字段或业务规则合并需要理解领域语义。
  • 可交换操作和 CRDT 可以自动合并特定计数、集合等数据类型。
  • 无法安全合并的对象指定 home region 或单写所有者。

订单状态、余额和用户名唯一性通常不能靠任意 LWW 正确解决。按数据类型选择拓扑比全站统一 active-active 更实际。

5. 版本信息帮助识别并发

单调版本、逻辑时钟或 version vector 可以区分“一个更新发生在另一个之后”和“两个更新彼此并发”。冲突解决要保留来源、版本与决策,便于审计和重放。

墙上时间会偏移,即使使用高精度时间戳,也不能自动表示因果关系。需要全局严格顺序时,使用共识日志或把写入路由到单一所有者。

6. 故障转移先防止双主

主地域失联时,系统无法立即知道它已崩溃还是仅与控制面分区。提升新主前要通过多数派、租约或 fencing 阻止旧主继续接受写入。

DNS 和客户端缓存的切换有传播延迟,已有长连接也不会立即迁移。发布新主后应检查客户端流量、旧主隔离、复制位置和重复请求,而不是只修改一条路由记录。

恢复旧地域时先作为副本追赶和核对,再决定是否切回。自动来回切换可能在不稳定网络中反复震荡。

7. 数据驻留限制复制位置

个人数据、密钥和审计日志可能受地域法规或合同约束,不能为了容灾复制到任意机房。数据分类决定允许的存储与处理地域,并反映到备份、日志和遥测。

控制面可以全球共享元数据,敏感正文保留在指定地域;跨地域请求只传递最小必要信息。架构图要同时标数据流和法律边界。

8. 演练以 RTO 和 RPO 验证恢复

模拟主地域断网、复制延迟、部分客户端仍访问旧主、DNS 缓存和新主容量不足。记录:

  • 多久停止错误写入并恢复关键服务。
  • 最后安全复制位置与实际丢失记录。
  • 写后读、队列和缓存如何重新收敛。
  • 冲突和重复是否能自动处理或进入人工队列。
  • 故障恢复后是否安全 failback。

跨地域方案只有在真实数据量和网络条件下完成演练,RTO/RPO 才是证据而不是目标口号。

9. 常见问题

9.1 两地三中心是否一定高可用

拓扑名称不说明副本协议、故障域和切换条件。需要明确哪些节点投票、写等待谁、网络分区哪一侧继续、数据丢失窗口和容量是否能承载故障流量。

9.2 多活是否表示所有数据都可以多地写

不表示。静态内容、购物车和可合并计数可以多地写,余额、库存和唯一约束可能保留单一写所有者或同步共识。多活应按数据类型和业务不变量划分。

10. 面试题

10.1 跨地域部署如何选择同步复制、异步复制和多主写入

出现公司:字节跳动、百度、美团、滴滴

考察重点

  • RTT、quorum、RPO 与可写性。
  • 单主、同步共识与多主冲突。
  • fencing、切流、数据驻留和恢复演练。

相关内容:第 1 节“物理距离进入提交延迟”至第 8 节“演练以 RTO 和 RPO 验证恢复”。

参考回答

我会按数据不变量和用户位置拆分。单主异步复制给写入统一顺序,远端写延迟较高,故障提升落后副本有 RPO;跨三地同步 quorum 能保住已提交写,但每次提交承担地域 RTT,失去多数后拒绝写。多主降低本地写延迟,却必须处理并发冲突,只适合可按业务规则或 CRDT 合并的数据。

余额、唯一约束等对象通常指定 home region 或共识组,购物车等可以多地写。故障切换用多数派、租约或 fencing 隔离旧主,考虑 DNS 与长连接传播;恢复后先追赶核对再 failback。最后用断网演练测量真实 RTO、replication lag 和丢失记录,不能只凭副本数量声明容灾。