Amazon EC2上Oracle数据库的灾难恢复与快速启动故障切换
关键要点
高可用性在今天的企业中至关重要,以防止业务关键应用程序的中断。企业必须优先考虑数据库的可伸缩性和可用性,从而避免数据库、网络、服务器或存储环境的停机。本文提供了一种在Amazon EC2上运行Oracle数据库时,使用Oracle Data Guard和快速启动故障切换实现数据库高可用性的架构解决方案,并阐述如何在发生故障时自动切换数据库。
引言
在当今的商业环境中,高可用性对组织来说是必不可少的,以避免业务关键应用程序的中断。企业需要优先考虑数据库的可扩展性和可用性,以确保数据库、网络、服务器或存储环境避免宕机。
为了避免对应用程序的必要更改,Oracle实时应用集群RAC是为Oracle数据库提供高可用性和可扩展性的一个选项。尽管Amazon EC2上的Oracle数据库不支持RAC功能,但Oracle主动数据保护在AWS云上提供了高可用性。
Oracle Data Guard功能使客户能够应对灾难和数据损坏,同时创建、维护和管理一个或多个同步的备用数据库。配置Oracle Data Guard快速启动故障切换FSFO进一步有助于实现高可用性。
在本文中,我们提供了一种架构解决方案,以实现Amazon EC2上Oracle数据库的高可用性,结合Oracle Data Guard和快速启动故障切换解决可用区AZs或Amazon EC2实例故障。我们还将介绍使数据库故障切换无需人工干预所需采取的步骤,并提供跨区域灾难恢复的建议。
解决方案概述
我们将通过讨论架构和两种使用Oracle Data Guard确保高可用性的替代选项,以及每种选项的优缺点来探索此解决方案。随后,我们将提供步骤指南,以实现无需人工干预的数据库故障切换。
使用多可用区和多区域的Oracle Data Guard实现Oracle高可用性
这种架构建议在Amazon EC2上维护Oracle数据库的高可用性,并对一个区域内的Amazon EC2服务中断提供保护。灾难恢复环境和更高的弹性在Amazon EC2服务中断后得到提供。这种结构通过在一个备用区域的多可用区设置来保护免受AWS区域内的Amazon EC2服务中断。
闪连加速器破解版在这种架构中,Oracle Data Guard快速同步Fast Sync复制的存在涵盖了位于区域A的AZ 1中的主数据库,AZ 2中有备用数据库快速同步,区域B中的AZ 1异步和区域B的AZ 2异步。备用数据库之间存在异步级联复制设置,以避免跨区域的网络延迟问题。
如果区域A发生Amazon EC2服务中断,Oracle观察者Oracle Observer这一客户端软件会监控Oracle Data Guard并启动故障切换到区域B的备用数据库。应用程序可以继续连接到数据库,从而实现高可用性,基于数据变化率,仅会有有限的或最小的数据丢失。如图1所示。
使用Amazon Route 53和Oracle Data Guard进行数据库故障切换
以下步骤定义了可通过Amazon Route 53和Oracle Data Guard实现无需人工干预的数据库故障切换的流程。
前提条件
在开始之前,请查阅此解决方案的以下前提条件:
一个AWS账户配置了Oracle Data Guard的Amazon EC2实例设置了Oracle Data Guard快速启动故障切换步骤指南
步骤1 创建Oracle数据库服务
为了在发生故障时使应用程序可以无缝连接,我们建议使用名为DBMSSERVICE的Oracle DBMS包创建一个Oracle数据库服务。
sqlexec dbmsserviceCREATESERVICE(SERVICENAME=gtDBSERVICEFORAPP NETWORKNAME=gtDBSERVICEFORAPP)exec dbmsserviceSTARTSERVICE(DBSERVICEFORAPP)
步骤2 网络配置
使用Oracle透明应用程序故障切换TAF方法,应用程序在从主数据库到备用数据库的故障转移过程中能够无缝连接,尽管在主机IP更改时需要更新应用程序连接字符串。
以下使用Amazon Route 53的方法建议为增加灵活性和可扩展性。Route 53提供DNS A记录,用于映射到数据库实例IP和CNAME记录,以重定向DNS查询到A记录。以下是DNS映射的示例。CNAME以及数据库服务名称可以在应用程序的网络配置中使用。
sqlDatabaseName = (DESCRIPTION = (ADDRESSLIST = (ADDRESS = (PROTOCOL = TCP)(HOST = ltdbcnamegt)(PORT = 1521)) (connectdata = (servicename = ltdbservicenamegt) )) )
为自动更新Route 53中CNAME以映射到主机,您可以按照以下步骤操作。
步骤3 Route 53设置
创建一个名为route53updatesh的脚本并将其放在数据库主机上,使用以下代码:
bash
!/bin/bash
export ORACLEHOME=ltgt export LDLIBRARYPATH=ORACLEHOME/libexport PATH=ORACLEHOME/binPATH/usr/local/bin/usr/bin
LOGFILE=/tmp/switchdnslog
DNSDOMAIN=ltgt ACTIVEDBCNAME=ltgt HOSTEDZONEID=ltgt TTL=ltgt
updatedns () {TMPFILE=/tmp/route53dnslogcat gt {TMPFILE} ltlt EOF { CommentUpdating DNS of record {1}{DNSDOMAIN} Changes[ { ActionUPSERT ResourceRecordSet{ ResourceRecords[ { Value2 } ] Name{1}{DNSDOMAIN} TypeCNAME TTLTTL } } ] }EOF
/usr/local/bin/aws route53 changeresourcerecordsets hostedzoneid HOSTEDZONEID changebatch file//TMPFILE gtgt LOGFILE}
primuniqsid=ORACLEHOME/bin/sqlplus s / as sysdba ltltEOFset feedback off echo off lines 2000 head offselect upper(dbuniquename) from vdataguardconfig where DESTROLE=PRIMARY DATABASEEOF
primuniqsid=echo primuniqsid sed s/[ t]//s/[ t]//hostcurrent=ORACLEHOME/bin/tnsping {primuniqsid}sed n s/(Host)([)])()/2/pi sed s/=//gsed s/[ t]//s/[ t]//dnscurrenthost=/usr/local/bin/aws route53 listresourcerecordsets hostedzoneid HOSTEDZONEID query ResourceRecordSets[Name == {ACTIVEDBCNAME}{DNSDOMAIN}]ResourceRecords output text
if [ hostcurrent != dnscurrenthost ] then updatedns {ACTIVEDBCNAME} hostcurrentfi
步骤4 数据库作业设置
在Oracle主数据库中创建一个作业以在故障发生时执行刚才介绍的shell脚本,使用以下代码:
sqlbegin dbmsschedulercreatejob ( jobname =gt route53update jobtype =gt executable numberofarguments =gt 0 jobaction =gt /ltgt/route53updatesh autodrop =gt false )
dbmsschedulerenable(route53update)end /
步骤5 数据库触发器设置
在发生故障时,主数据库将切换,备用数据库将启动作为新的主数据库。需要在主数据库上创建一个触发器以在任何故障转移时执行作业,使用以下代码更新Route 53 CNAME。

sqlcreate or replace trigger SYSUpdateRoute53Record AFTER STARTUP ON DATABASEDECLAREdbrole varchar2(16)dbmode varchar2(20)BEGINselect databaserole openmode into dbrole dbmode from vdatabaseif dbrole = PRIMARY thendbmsschedulerrunjob(route53update)END IFEND /
替代方案1:单区域与多可用区
此选项是建议的最低配置,以维护Amazon EC2上Oracle数据库的高可用性,适用于没有多区域设置的客户。
优势:保护单个可用区内的Amazon EC2服务中断。限制:无法保护单个区域内的Amazon EC2服务中断。在此架构中,Oracle Data Guard快速同步复制存在于具有多可用区设置的Oracle数据库实例中,主数据库可读取和写入位于AZ 1,备用数据库只读位于AZ 2。
如果主数据库因任何故障无法访问,Oracle观察者将故障转移到不同AZ的备用数据库。应用程序可以继续连接到数据库,基于在最大可用性/最大保护模式设置下的同步复制,确保0数据丢失。如果主数据库位于useast1a而备用位于useast1b,则可以这样定义RedoRoutes属性。
Oracle RedoRoutes设置示例:
sqldgmgrlgt edit database DB1A set property RedoRoutes= (LOCAL (DB1B FASTSYNC)dgmgrlgt edit database DB1B set property RedoRoutes= (LOCAL (DB1A FASTSYNC)
有关AWS云中灾难恢复如何工作的更多信息,请访问AWS WellArchitected Framework的灾难恢复在云中有所不同部分。
替代方案2:单可用区的多可用区与多区域
此选项建议用于维护Amazon EC2上Oracle数据库的高可用性,适用于需要多区域可用性的客户。它提供了针对主区域内Amazon EC2实例发生罕见不可用情况的保护,提供灾难恢复环境。
优势:保护2个可用区或AWS区域内的Amazon EC2服务中断。限制:在整个区域发生Amazon EC2服务中断时,弹性降低而没有高可用性。在此架构中,Oracle Data Guard快速同步复制存在于单个区域的多可用区中,区域A的AZ 1中的主数据库与AZ 2的备用数据库。备用数据库的跨区域也有异步复制设置。
推荐采用异步复制,以避免跨区域的网络延迟问题。级联备用配置确保主数据库在将数据发送到多个备用数据库时没有额外性能影响。
如果主数据库无法访问,故障转移将在区域A的AZ之间发生。在Amazon EC2区域发生服务中断时,故障转移会发生到区域B,从而高可用性得以实现,数据丢失量仅按照数据变化率量控制。如果主数据库位于useast1a,备用数据库位于useast1b快速同步和useast2a异步,则RedoRoutes属性可以定义如下。
Oracle RedoRoutes设置示例:
sqldgmgrl gt edit database DB1A set property RedoRoutes= (LOCAL (DB1B FASTSYNC PRIORITY=1 DB2A ASYNC PRIORITY=2))(DB1B DB2A ASYNC)(DB2A DB1B ASYNC)dgmgrl gt edit database DB1B set property RedoRoutes= (LOCAL (DB1A FASTSYNC PRIORITY=1 DB2A ASYNC PRIORITY=2)) (DB1A DB2A ASYNC)
清理
此解决方案涉及的服务会产生费用。当您完成使用此解决方案时,请清理以下资源:
Amazon EC2 实例 停止或删除终止所配置的Amazon EC2实例。Route53 删除创建的托管区域ID和A记录/CNAME。结论
本文展示了如何通过Oracle Data Guard为Amazon EC2实例上的Oracle数据库实现高可用性和灾难恢复。利用本文中的架构,您可以在同一区域或跨区域实现零数据丢失的Oracle快速启动故障切换。
您还可以使用此架构将Amazon EC2上的Oracle数据库中的数据复制到AWS云之外托管的Oracle数据库。借助Oracle级联备用和Oracle RedoRoutes,您可以降低对主数据库的高度依赖,从而整体提高性能。
作者简介
Harshad GohilHarshad Gohil是亚马逊网络服务AWS专业服务团队的云/数据库顾问。他帮助客户在AWS云中构建可扩展、高可用和安全的解决方案。他的重点领域是在AWS云中进行同质和异质的迁移。
Jeemy PatelJeemy Patel是亚马逊网络服务AWS专业服务团队的数据库顾问。Jeemy协助客户迁移到AWS、优化性能,并提供有关Amazon客户各种灾难恢复解决方案的技术指导。
Vignyanand PenumatchaVignyanandViggyPenumatcha是AWS专业服务团队的高级数据库顾问。他帮助AWS客户在迁移或转型其数据库到AWS云数据库解决方案时实现业务需求。
Saumya MulaSaumya Mula是亚马逊网络服务AWS专业服务团队的高级数据库顾问。她担任数据库迁移顾问,为Amazon客户提供技术指导,迁移其本地数据库到AWS。