2. OCI区域与可用域架构解析

在OCI上设计高可用与灾备架构,第一步不是选服务,而是把“区域(Region)—可用域(Availability Domain,AD)—故障域(Fault Domain,FD)”这三层物理与逻辑边界搞清楚。它们决定了故障的爆炸半径,也决定了你能否用最低成本获得可接受的RTO/RPO。

三层边界:从地理到机架

区域是OCI的地理部署单元,例如ap-singapore-1、us-ashburn-1、eu-frankfurt-1。区域之间通常相隔数百到数千公里,拥有独立的电力、制冷、网络与身份控制平面。区域是灾备的“最后一道边界”:跨区域复制才能抵御区域性灾难。

可用域是区域内的逻辑数据中心分组,每个AD拥有独立的供电、冷却和物理网络。AD之间通过低延迟、高带宽的专用网络互联,典型往返时延在1毫秒以内。一个区域通常有1~3个AD,例如ap-singapore-1有3个AD,而部分区域只有1个AD。AD是“区域内高可用”的基本单位:把同一应用的多个实例分散到不同AD,可以抵御单AD级故障。

故障域是AD内部的进一步隔离单元,可以理解为同一AD内不同机架或供电组。一个AD通常包含3个FD。FD用于抵御机架级故障,例如单机架掉电或交换机故障。FD不提供独立的网络时延保证,但提供了更细粒度的放置控制。

关键结论:跨区域解决“区域级灾难”,跨AD解决“数据中心级故障”,跨FD解决“机架级故障”。三者是包含关系,不是替代关系。

物理与逻辑关系图解

下图展示了区域、可用域、故障域之间的包含关系,以及它们对应的故障边界和典型高可用策略。注意:AD之间是低延迟互联,FD之间共享AD级网络与供电主干。

区域 Region:ap-singapore-1 地理边界 · 独立电力/制冷/网络 · 跨区域时延 50~300ms 可用域 AD-1 独立供电/冷却/网络 故障域 FD-1 机架组 A · 供电组 A Web/App 实例 1 故障域 FD-2 机架组 B · 供电组 B Web/App 实例 2 故障域 FD-3 机架组 C · 供电组 C DB 主节点 可用域 AD-2 独立供电/冷却/网络 故障域 FD-1 机架组 A · 供电组 A Web/App 实例 3 故障域 FD-2 机架组 B · 供电组 B Web/App 实例 4 故障域 FD-3 机架组 C · 供电组 C DB 备节点 可用域 AD-3 独立供电/冷却/网络 故障域 FD-1 机架组 A · 供电组 A 只读副本 / 备份 故障域 FD-2 机架组 B · 供电组 B 对象存储 / 日志 故障域 FD-3 机架组 C · 供电组 C 灾备同步节点 低延迟 低延迟 故障边界:FD 故障 → 影响单机架组 | AD 故障 → 影响整个可用域 | Region 故障 → 影响整个地理区域

对高可用设计的直接影响

理解了这三层边界,就能把高可用设计拆成三个可独立决策的问题:

  • 跨FD放置:同一AD内,把同一角色的多个实例放到不同FD。例如Web层在AD-1的FD-1和FD-2各放一个实例,避免单机架掉电导致服务中断。OCI的实例启动时可通过faultDomain参数指定FD,或使用实例池自动分散。
  • 跨AD放置:把应用层和数据库层的主备节点分散到不同AD。例如AD-1跑DB主节点,AD-2跑DB备节点,AD-3跑只读副本。AD间低延迟使同步复制成为可能,RPO可接近0。
  • 跨Region放置:在另一个区域部署灾备环境,通过对象存储跨区域复制、数据库跨区域Data Guard或GoldenGate实现数据同步。跨区域时延较高,通常采用异步复制,RPO在分钟级。

一个可落地的放置示例

假设你在ap-singapore-1部署一个三层Web应用,要求“单AD故障不中断,单FD故障不影响容量”。可以按如下方式规划:

层级AD-1AD-2AD-3
Web/AppFD-1 实例AFD-1 实例BFD-2 实例C
数据库FD-3 主节点FD-3 备节点FD-1 只读副本
负载均衡FD-2 主LBFD-2 备LB—
对象存储区域级服务,自动跨AD冗余,无需手动放置

这个布局的效果是:单FD故障最多影响一个Web实例或一个DB节点,容量下降但服务不中断;单AD故障时,另外两个AD仍可承载全部流量,数据库通过AD间同步复制保持数据一致。注意,负载均衡器本身也要跨AD部署,否则它可能成为单点。

OCI的托管服务(如对象存储、Autonomous Database、负载均衡器)通常已经内置跨AD冗余,你不需要手动指定FD。需要手动规划FD/AD放置的主要是计算实例、块存储和自建数据库。

常见误区与判断依据

第一个误区是“有3个AD就自动高可用”。如果所有实例都放在AD-1的不同FD里,AD-1整体故障时服务仍然全挂。判断依据很简单:打开实例列表,看Availability Domain列是否至少覆盖两个不同的AD。

第二个误区是“跨AD复制一定同步”。AD间低延迟不等于零延迟,同步复制仍会增加写入响应时间。对于延迟敏感的交易系统,需要实测AD间复制延迟,再决定用同步还是异步。可以在两个AD各起一台实例,用ping和fio分别测网络RTT和存储复制吞吐,作为容量规划的输入。

第三个误区是“FD可以替代AD”。FD只隔离机架级故障,不隔离AD级供电或网络故障。FD适合做同一AD内的反亲和放置,但不能作为跨AD高可用的替代方案。

把边界转化为设计约束

在实际项目中,建议把这三层边界写成明确的设计约束,而不是停留在概念层面。例如:

  • 生产环境计算实例必须分布在至少2个AD,每个AD内至少分布在2个FD。
  • 数据库主备必须跨AD,且备节点所在AD与主节点不同。
  • 跨区域灾备的RPO目标为15分钟时,采用异步复制并监控复制延迟告警。
  • 任何单AD故障场景下,剩余AD的容量水位不超过70%,预留30%的突发余量。

这些约束可以直接转化为Terraform中的availability_domain和fault_domain参数,也可以转化为架构评审时的检查项。只有把物理边界变成可验证的约束,高可用设计才不会停留在纸面上。