找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3241

积分

0

好友

415

主题
发表于 2026-2-14 02:37:30 | 查看: 31| 回复: 0

随着全球化和国际业务的普及,企业对服务实时性与数据安全性的要求日益严苛。越来越多的业务场景需要跨地域甚至跨国提供服务,作为数据基座的数据库,自然也面临着跨地域部署的强烈需求。在维护和开发分布式数据库产品的过程中,与客户的深入交流让我们意识到,跨地域部署的核心需求可以归纳为两方面:

  1. 容灾:即便发生地域级别的故障,数据库依然能通过自动或人工介入的故障转移(Failover)继续提供服务。在这种场景下,灾备地域的数据库副本在故障发生前,可以处于冷备或不提供服务的状态。不同业务对故障转移时的数据丢失容忍度(RPO)也有着不同的要求。
  2. 多活:数据库需要在多个地域同时提供服务,这在跨国业务中尤为常见,核心目标是让不同地域的用户都能获得较低的请求延迟。部分业务可能只关心读取延迟,而另一些则对读写延迟都有严格的要求。

这两个需求常常在同一个业务系统中并存。此外,数据安全法规(合规性要求)也可能对数据的传输和存储地理位置施加额外的限制。

跨地域部署的根本挑战:网络延迟

数据库跨地域部署最大的挑战,源于地域之间的网络延迟。受限于光在介质中的传播速度,网络延迟与物理距离直接相关。这种由距离导致的高延迟,在可预见的未来都是一道难以逾越的“天堑”。下图汇总了 Google Cloud 各区域之间的网络 Ping 延迟数据:

Google Cloud 各区域间网络延迟热力图 (单位:ms)

可以看到,不同的物理距离下,网络延迟从几毫秒到几百毫秒不等。例如,中欧之间的延迟甚至会超过 300ms。从数据库服务的角度来看,这个延迟非常可观。假设数据库内部每个请求都需要一次跨地域的网络往返(RTT),那么数据库在单线程下能提供的每秒查询率(QPS)上限将只有 3 次。

对关系型数据库核心特性的冲击

在 NoSQL 领域,跨地域部署的支持相对常见,因为其设计通常为了扩展性而牺牲了强一致性和完整的关系模型。那么,对于强调 ACID 特性的关系型数据库而言,如此高的跨地域网络延迟会带来哪些具体问题和设计权衡呢?

关系型数据库的核心是事务,其具备原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)四个核心特性。其中,一致性(C)通常指业务利用数据库提供的机制来保证数据的正确性。这里我们重点关注原子性(A)、隔离性(I)和持久性(D)在跨地域维度上的实现挑战。

1. 跨地域复制(持久性 - Durability)

持久性要求即使发生故障,已提交事务的修改也必须持久存在。在单机应对节点故障时,通常通过预写日志(WAL)或控制脏页刷盘顺序来实现。当需求扩展到跨地域容灾时,要保证故障切换后已提交事务的数据不丢失,就必须采用同步复制。然而,极高的网络延迟会显著延长每个写请求的处理时间。

考虑到地域级故障概率较低,对数据丢失有一定容忍度的业务通常会采用异步复制,在故障切换时接受接近复制延迟的数据丢失(RPO > 0)。另一种折中方案是法定人数(Quorum)复制,由多个节点组成一个复制组,读写操作需要在大多数节点上成功。例如,在三个地域部署节点的集群中,这相当于在较近的地域间进行同步复制,在较远的地域间进行异步复制。可见,数据复制策略没有“银弹”,本质上是请求延迟与数据可用性之间的权衡(即 CAP 理论中的取舍)。

2. 跨地域并发控制(隔离性 - Isolation)

隔离性要求并发执行的事务满足特定隔离级别的正确性约束。满足这些约束必然需要进行冲突检测,并对有冲突的事务进行调度(如延迟或中止)。根据检测冲突的时机(或乐观程度),可以简单分为三类:

  • 基于锁(Lock-based):在操作开始前检测冲突,较为悲观。
  • 基于时间戳(Timestamp-based):在实际访问数据时检测冲突。
  • 基于验证(Validation-based):在事务提交时才检测冲突,非常乐观。

无论哪种方式,都可能需要跨地域的交互来确定是否存在访问冲突。理论上,越悲观的方式(如基于锁)需要的跨地域交互可能越多。

此外,多版本并发控制(MVCC)提供了避免只读事务与写事务冲突的机制,在跨地域冲突检测成本极高的场景中显得尤为重要。MVCC 结合不同的乐观程度,衍生出 MV2PL(多版本两阶段锁)、MVTO(多版本时间戳排序)和 MVOCC(多版本乐观并发控制)等具体实现。

MVCC 的可见性判断以及基于时间戳或验证的冲突检测,都需要为事务定序,即分配一个全局唯一的序号来标识事务的先后顺序。在单机环境下,这很简单(如使用递增ID)。但在分布式系统中,通常使用时间戳。然而,单机的物理时钟存在不准确、不可控偏差的问题,无法直接用于全局定序。这就是著名的分布式授时问题,常见解决方案包括:

  • 中心化授时(Timestamp Oracle):维护独立的授时集群提供全局递增时间戳。这种方式严重依赖低延迟网络,通常只适用于同一数据中心,跨地域部署基本不可用。
  • 逻辑时钟(Lamport Clock):其核心思想是,每个节点维护一个本地计数器,通过网络消息传递来推进彼此的计数器值,从而在没有物理时钟的情况下建立事件间的偏序关系。如下图所示,Client A 在访问 Node 2 后,将 Node 1 的计数器从 1 “推高”到了 6。

逻辑时钟示例序列图

  • TrueTime:过去十多年,Google 和 Amazon 等大型云厂商通过结合 GPS 和原子钟,提供了 TrueTime 服务。它能在全球范围内提供相对精确的物理时间,并向调用者暴露时间戳的不确定区间(Uncertainty Interval)。例如 Google 的 TrueTime,其不确定区间平均控制在 1-2ms,上限为 7ms 以内。Spanner 数据库正是利用这一特性,结合 Commit Wait 等机制实现了准确的事务定序。TrueTime 避免了跨地域获取时间戳的延迟,但高度依赖特定云厂商的基础设施,不具备通用性。

3. 跨地域事务提交(原子性 - Atomicity)

原子性要求成功提交的事务的所有修改全部生效,而未成功提交的事务的所有修改全部不可见。在单机环境中,数据库通过写入一条标记事务提交的 WAL 日志来实现,并以该日志落盘作为提交的确认点。

当事务涉及多个节点时,需要所有节点对提交或中止达成一致。工程上成熟的方案是两阶段提交(2PC)

两阶段提交(2PC)时序图

如上图所示,2PC 将提交过程分为两个阶段:

  1. 准备阶段(Prepare):协调者(Coordinator)在确认所有数据都已复制后,向所有参与者(Participant)发送 Prepare 请求。参与者对要提交的数据进行本地检查(如加锁、唯一性约束检查),确保可以提交后,在本地写入 Prepare 日志并返回“Yes”。这是第一个不可回退点,之后参与者必须持有保证提交所需的资源(如锁)。
  2. 提交阶段(Commit):协调者确保收到所有参与者的答复,仅在全部为“Yes”时决定提交。它在本地写入提交日志,向客户端返回成功,并通知所有参与者提交。这是第二个不可回退点。参与者收到通知后,在本地提交并释放资源。

简单类比,2PC 相当于将单机事务中“提交日志落盘”这个承诺点拆成了两段:准备阶段获得所有参与者的提交承诺,最后由协调者汇总并通过落盘提交日志做出全局承诺。在跨地域部署场景下,如果事务涉及跨地域的节点,一次 2PC 需要两次完整的网络往返,这会显著增加事务提交的延迟。

性能影响汇总:我们假设一个极端场景——采用同步复制、基于锁的并发控制、中心化授时,且所有同步节点和授时中心都不在本地域。以一个事务的完整生命周期来看,假设跨地域网络延迟为 300ms,其影响被急剧放大:

极端情况下跨地域事务延迟分析时间轴图

如图所示,事务的每个阶段都需要网络交互,300ms 的延迟被成倍放大。在这种极端情况下,一个事务可能需要数秒才能完成,这显然是不可接受的。因此,实践中必须进行权衡选择和针对性优化。

主流跨地域部署方案解析

方案一:多集群部署(Master-Slaves 与 Multi-Master)

在不同的地域部署多套独立的数据库集群,并通过日志(如 binlog)进行异步复制。这是最简单、最通用的跨地域部署方式,绝大多数现有数据库产品都支持。

最常见的模式是 Master-Slaves(一主多从):一个主集群提供读写服务,通过异步复制同步到一个或多个部署在其他地域的只读从集群。

Master-Slaves 主从复制架构图

这种方案的权衡在于完全放弃了跨地域事务支持,从而避免了对主集群写入性能的复杂影响。从集群可以提供基于 MVCC 的本地低延迟读取,并满足 RPO > 0 的地域级容灾需求。对于大多数业务而言,这是一种可以接受的权衡,用户通常需要选择一个主地域来处理所有写请求。

那么,如果每个地域都需要低延迟写入,能否采用 Multi-Master(多主) 架构呢?许多数据库支持双向复制,让多个集群都能写入,再通过复制链路相互同步数据,看似可以达到最终一致。

Multi-Master 双向复制架构图

从业务角度看,这种方案改造成本似乎很低,但实际上存在诸多安全隐患。因为缺乏跨地域事务支持,所有数据库约束都可能失效,最典型的就是主键和唯一索引的唯一性约束。业务必须自行保证绝对不重复。此外,不同节点间的写入冲突检测完全失效,数据库无法自动处理这种冲突。更严重的是,很多冲突是静默发生的(例如,因两边执行顺序不同导致最终数据不一致),不会立即暴露错误。因此,业务需要精心设计,并对未来的开发和运维人员充分警示,同时准备好数据不一致的处理预案。

观点:Multi-Master 方案可以作为临时的权宜之计,但绝不应作为长期的演进方向。如果不得已必须使用,建议参考相关最佳实践文章。

在多集群部署架构下,由于完全放弃了跨地域事务,主集群的写入不受影响,跨地域复制异步进行,其事务时间轴如下:

多集群部署(异步复制)下的事务时间轴

方案二:原生跨地域数据库(Spanner, CockroachDB, Aurora DSQL)

近年来,一些数据库从设计之初就定位为支持跨地域部署,并实现了跨地域的分布式事务。下面分析三个极具代表性的工业级产品:Spanner、CockroachDB 和 Amazon Aurora DSQL。有趣的是,它们分别采用了 MV2PL、MVTO 和 MVOCC 三种不同乐观程度的并发控制机制。

1. Google Spanner

Spanner 是 Google 开发的全球级分布式关系型数据库,采用 Shared-Nothing 架构。数据被切分为分片(Tablet),每个 Tablet 通过 Paxos 协议组成一个复制组(Paxos Group),副本可跨地域部署。

Spanner 架构示意图

  • 跨地域复制:采用 Paxos 法定人数复制。副本的放置策略直接决定了其访问延迟和容灾级别。例如,将 3 个副本放在美东,2 个放在美西,由于美东拥有多数副本,写入可以以美东地域内的延迟完成,但美东故障时将无法自动容灾。Spanner 提供了灵活的数据放置策略配置。
  • 跨地域并发控制:读写事务采用基于锁的 MV2PL(多版本两阶段锁)来保证可串行化隔离级别。写锁在提交(Prepare)阶段才集中获取,以减少锁持有时间和潜在的跨地域交互。只读事务利用 MVCC,可由 Follower 副本提供低延迟读取。授时依赖于 Google 的 TrueTime 服务。
  • 跨地域事务提交:跨 Tablet(即跨 Paxos Group)的事务使用 2PC 提交。Spanner 进行了多项优化:将加写锁与 Prepare 阶段合并;协调者(Coordinator)的提交确认消息可以与 Paxos 法定人数复制的网络交互重叠;并利用 TrueTime 进行 Commit Wait 以保证严格的外部一致性。

Spanner 跨地域事务优化后的时间轴

2. CockroachDB

CockroachDB 是一个开源的全球分布式 SQL 数据库,架构与 Spanner 类似(Shared-Nothing),数据被划分为 Range,通过 Raft 协议复制。

  • 跨地域复制:同样采用基于 Raft 的法定人数复制。它通过清晰的表类型定义来简化副本放置策略配置:
    • REGIONAL BY TABLE:表的所有有投票权(Voter)副本都在主地域,写入无跨地域延迟。
    • REGIONAL BY ROW:表按行自动分区,每行数据的主副本位于其指定的地域。
    • GLOBAL:表的 Leader 在主地域,Voter 副本跨地域部署,写入有跨地域延迟,但读可在各地域本地进行。
  • 跨地域并发控制:采用比 Spanner 更乐观的 MVTO(多版本时间戳排序)。读写事务在访问记录时按时间戳判断冲突,而非提前加锁。授时采用混合逻辑时钟(HLC),一种类似于 Lamport 时钟的机制,通过消息传递同步,无需跨地域网络交互即可获得单调递增的时间戳,但因此只保证单键的线性一致性。CockroachDB 支持在冲突时提升事务的提交时间戳,以减少回滚。
  • 跨地域事务提交:同样使用 2PC。其优化在于 Write Pipelining(并行发送写请求)和 Parallel Commit(将事务状态设置为“Staging”的操作与实际数据分发并行),减少了网络往返等待。

CockroachDB 跨地域事务优化后的时间轴

3. Amazon Aurora DSQL

DSQL 是 Amazon Aurora 推出的跨地域多活产品。其架构与前述 Shared-Nothing 数据库不同,更接近于在多集群之上增加了一个分布式事务协调层,目前支持双地域部署。

Amazon Aurora DSQL 双地域架构图

  • 跨地域复制:依赖于独立的 Journal 组件进行日志持久化和跨地域复制。Journal 采用三地域部署(两个业务地域 + 一个中间地域),写入延迟由到中间地域的网络延迟决定,并能容忍单一地域故障。
  • 跨地域并发控制:采用最乐观的 MVOCC。事务开始前获取一个开始时间戳(依赖类似 TrueTime 的授时服务),读写操作在事务期间都只在本地域进行,所有修改缓存在内存中。在提交时,由 Adjudicator 组件验证事务开始到提交期间的所有写入是否存在冲突。这种方式在事务执行过程中完全避免了跨地域协调,非常适合读写时间长但冲突少的场景。
  • 跨地域事务提交:Adjudicator 是事务协调器。如果事务修改的数据涉及多个 Adjudicator(它们全局唯一),则使用 2PC 协调。提交确认后,日志写入 Journal 即完成持久化。

Amazon Aurora DSQL 跨地域事务时间轴

总结与核心观点

下表总结了上述几种方案在跨地域核心特性上的支持情况:

跨地域数据库特性对比表格

核心观点

  1. 业务应感知地域:由于跨地域网络延迟巨大,在几乎所有实现中,数据都有一个负责写入的“主地域”。非主地域的访问会承受显著的延迟惩罚。因此,引导业务进行“单元化”改造,让流量尽量本地化处理,是一个重要的演进方向。
  2. 尽量避免跨地域事务:首先,支持跨地域事务本身会引入巨大的复杂性,带来额外的稳定性风险。其次,即使支持,2PC 也会带来可观的开销。最后,为减少交互,支持跨地域事务的数据库通常采用偏乐观的并发机制,这会改变传统数据库的使用模式,并且在冲突严重的场景下可能导致大量事务回滚和资源浪费。

数据库跨地域部署是在性能、一致性、可用性之间进行的精密权衡。无论是选择通用的多集群异步复制,还是采用原生支持跨地域事务的数据库,都需要深入理解业务的实际需求(延迟容忍度、数据一致性要求、容灾等级),并做出合适的选择。技术的发展,如更精确的全球授时、更高效的共识协议和并发控制算法,正在不断推动这条“天堑”的边界,但其中蕴含的基础原理和权衡思想始终是架构设计的核心。更多关于分布式系统与数据库架构的深度讨论,欢迎访问云栈社区进行交流。




上一篇:从Feature Coding到Platform Engineering:Vibe Coding时代测试的价值与Agent Computer新形态
下一篇:深度分析:火山引擎为何押注春晚?其AI云战略的三张底牌
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-23 11:43 , Processed in 1.005429 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表