使用Amazon FSx for NetApp ONTAP构建高可用Oracle数据库

概述

Oracle数据库作为关键业务应用的核心,其持续可用性至关重要。传统的Oracle高可用解决方案依赖于复杂的集群软件、昂贵的共享存储阵列以及专业的运维团队,这不仅引入了单点故障风险,还带来了巨大的运维开销。

本文介绍的现代云架构,通过整合Amazon FSx for NetApp ONTAP (FSxN)共享存储、EC2 Auto Scaling组、基于AWS Backup的自动AMI创建、AWS Lambda编排以及AWS Systems Manager Parameter Store,提供了一种全新的解决方案。该方案显著降低了传统Oracle高可用架构的复杂性,同时提供了企业级的可用性、自动化的故障恢复能力,并确保新实例始终能以最新的配置启动并连接到现有数据库。这是 sre-practices 中通过自动化和架构设计提升系统可靠性的典型范例。

核心概念

该架构的高可用性建立在几个关键的AWS服务及其交互模式之上:

  1. 持久化共享存储 (Amazon FSx for NetApp ONTAP Multi-AZ):与可用区(AZ)绑定的Amazon EBS不同,FSxN Multi-AZ提供跨两个AZ同步复制的持久化共享存储。Oracle数据库文件、软件和配置都存储于此。当EC2实例在任一AZ中被替换时,新实例可以立即访问现有的Oracle数据库文件,无需从备份恢复,从而实现近乎零的数据丢失(RPO)。

  2. 自愈自动化单元 (EC2 Auto Scaling Group):此处的Auto Scaling组并非用于应对负载增长,而是一种“自愈”模式。其容量固定设置为1(最小=最大=所需=1)。其核心作用是在检测到当前Oracle实例不健康时,自动终止并启动一个新的替换实例。健康检查宽限期应设置足够长(如300秒),以保证Oracle服务有时间完全启动。

  3. 自动化配置管理 (AWS Backup + Lambda + SSM Parameter Store):

    • AWS Backup:使用基于标签的资源选择,定期备份标记为Oracle的EC2实例,并创建包含主机完整配置的AMI(恢复点)。
    • AWS Lambda:由Amazon EventBridge规则触发,在每次备份完成时,自动从备份恢复点提取新的AMI ID,并将其更新到SSM Parameter Store中,同时清理旧的AMI以控制成本。
    • Systems Manager Parameter Store:存储当前最新的AMI ID。EC2启动模板通过resolve:ssm:前缀动态引用此参数,确保Auto Scaling组启动的任何新实例都使用最新的、包含最新补丁和设置的AMI。
  4. 无感故障切换 (User Data脚本):Auto Scaling组使用的启动模板包含一个用户数据脚本。新实例启动时,该脚本会自动配置iSCSI发起程序、发现并连接到FSxN端点、挂载Oracle数据卷,并通过systemd服务启动Oracle数据库,实现无需人工干预的完全恢复。

实践

以下是构建该高可用Oracle架构的关键步骤概述:

步骤一:创建并配置Amazon FSx for NetApp ONTAP共享存储

  1. 创建Multi-AZ文件系统:在AWS管理控制台中选择Amazon FSx for NetApp ONTAP,部署类型选择 Multi-AZ 1。将主文件服务器置于一个可用区,备用服务器置于另一个可用区,实现跨AZ同步复制。
  2. 设置存储虚拟机 (SVM):在创建的FSxN文件系统中,创建一个SVM(例如oracle-svm)。SVM是提供数据访问的逻辑容器。
  3. 配置iSCSI访问:
    • 在SVM的“端点”选项卡中,获取每个可用区的iSCSI端点IP地址。
    • 通过NetApp ONTAP CLI创建iGroups(定义允许访问存储的主机)和LUN(逻辑存储单元),并将LUN映射到iGroups。
    • 在EC2实例上配置iSCSI发起程序,发现并连接到FSxN端点。使用多路径I/O (MPIO)同时连接两个端点,以确保在AZ故障切换时存储访问不中断。

步骤二:配置自动化备份与AMI管理

  1. 配置AWS Backup计划:创建一个备份计划,使用基于标签的资源选择(例如标签Application: oracle-db)来指定要备份的EC2实例。这样,任何带有该标签的新实例都会自动纳入备份范围。
  2. 设置事件驱动的AMI更新:
    • 创建一个Lambda函数(如oracle-backup-handler),其逻辑为:当AWS Backup完成EC2备份时,该函数会触发,提取新生成的AMI ID,并更新SSM Parameter Store中指定的参数(如/oracle/ec2/ami-id),最后清理过期的AMI。
    • 创建一个Amazon EventBridge规则,监听AWS Backup作业完成事件,并将该事件路由到上述Lambda函数。
    • 为Lambda函数配置必要的IAM权限,以操作EC2(管理AMI)、Systems Manager(更新参数)和Backup(读取恢复点元数据)。

步骤三:配置自愈Auto Scaling组

  1. 创建动态AMI的启动模板:在启动模板配置中,AMI ID字段使用 resolve:ssm:/oracle/ec2/ami-id 语法。这使模板能在实例启动时动态解析Parameter Store中的最新AMI ID。
  2. 配置用户数据脚本:在启动模板的“用户数据”部分,编写一个脚本,用于自动化新实例的完整配置,包括:配置iSCSI、发现并连接FSxN LUN、挂载文件系统、启动Oracle服务等。
  3. 创建Auto Scaling组:配置Auto Scaling组,将容量设置为1,并关联上述启动模板。设置健康的检查宽限期为300秒以上。将组部署在至少两个可用区的子网中,以实现跨AZ自愈。

步骤四:验证与清理

  • 测试故障切换:通过终止当前运行的Oracle EC2实例来模拟故障。预期Auto Scaling组将在约30秒内检测到不健康状态,并在5分钟内启动一个使用最新AMI配置、自动挂载共享存储并启动Oracle的新实例。
  • 清理资源:测试完成后,为避免持续产生费用,请按需删除创建的Lambda函数、EventBridge规则、SSM参数、AWS Backup计划、AMI、Auto Scaling组以及Amazon FSx for NetApp ONTAP文件系统。

SRE要点

与可靠性实践的关联

此架构是 sre-practices 中消除共模故障和通过自动化实现自愈的优秀案例。它通过将状态(数据存储在FSxN)与计算实例解耦,使实例可以安全地被替换,从而提升了系统的整体可靠性。

最佳实践与常见反模式

  • 最佳实践:
    • 使用基于标签的备份策略,以适应动态的实例生命周期。
    • 利用SSM Parameter Store作为配置中央协调点,确保启动模板始终指向最新配置。
    • 在启动模板中使用resolve:ssm:实现配置的动态绑定,避免手动更新模板版本。
    • 为Auto Scaling组设置充足的健康检查宽限期,避免因启动时间过长导致的误判。
  • 反模式:
    • 在Auto Scaling组启动模板中硬编码AMI ID,导致每次配置变更后需手动更新模板,容易出错并引发配置漂移。
    • 将Auto Scaling组用于水平扩展而非自愈,在这种单实例数据库场景中是不合适的。
    • 忽略对FSxN端点的网络连通性和安全组配置,导致新实例无法挂载存储。

相关指标(SLI/SLO/SLA)

  • SLI (服务级别指标):
    • 恢复时间 (Time to Recovery): 从实例故障检测到数据库重新可用的时间。
    • 数据持久性 (Data Durability): FSxN同步复制确保RPO接近零。
    • 配置一致性 (Configuration Consistency): 新实例与故障实例在主机配置(补丁、设置)上的差异。
  • SLO (服务级别目标): 可针对上述SLI设定目标,例如:恢复时间目标 (RTO) < 5分钟, 配置漂移率 < 0.1%。
  • SLA (服务级别协议): 向内部客户或外部用户承诺的可用性等级(如99.99%),该架构通过消除单点故障和实现快速自动恢复来支持高SLA承诺。