跨地域复制、延迟与冲突
跨地域部署把用户请求放到更近的节点,并在单个地域故障时保留服务。地域之间的网络往返无法消除,因此同步复制、异步复制和多地写入必须在延迟、可用性、数据丢失窗口与冲突之间取舍。
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 和丢失记录,不能只凭副本数量声明容灾。