亚马逊AWS官方博客

使用Amazon RDS for Oracle配合Oracle Active Data Guard建立托管的灾难恢复与只读副本

原文链接:

https://thinkwithwp.com/cn/blogs/database/managed-disaster-recovery-and-managed-reader-farm-with-amazon-rds-for-oracle-using-oracle-active-data-guard/

 

众多亚马逊云科技用户都在使用Amazon关系数据库服务产品组合(Amazon Relational Database Service,简称Amazon RDS)来减少沉重繁琐且无差异化的数据库日常维护工作。其中Amazon RDS for Oracle也切实帮助用户显著减少了Oracle数据库的管理与维护负担。

Amazon RDS for Oracle提供多可用区部署方案,可针对特定区域内的数据库实例提供更出色的可用性与持久性,同时带来高效灾难恢复解决方案。当然,一部分运行关键任务数据库的客户希望自己的灾难恢复配置能够跨越多个区域,以满足特殊的业务需求。此外,这些客户还希望利用灾难恢复的投资来处理某些只读生产工作负载。

现在,大家已经可以任选以下方法,为您的Amazon RDS for Oracle建立起自我管理型灾难恢复解决方案:

借助Amazon RDS for Oracle区域内与跨区域只读副本功能,我们可以使用Oracle Active Data Guard轻松创建多个只读副本。本文将讨论如何使用Amazon RDS for Oracle只读副本建立托管灾难恢复与只读副本。此外,本文还将涵盖其他用例,例如如何从主数据库实例中转移读取工作负载、通过只读副本服务扩展读取工作负载,以及优化读取延迟等。

 

关于Amazon RDS for Oracle只读副本

Amazon RDS for Oracle只读副本(分区域内与跨区域两类),在主数据库实例与物理备用数据库(只读副本)之间使用Oracle Active Data Guard。Amazon RDS for Oracle在主实例与只读副本之间配置异步Data Guard复制机制,保证只读副本处于只读模式且Redo Apply处于活动状态。主实例与只读副本运行在Data Guard 最大性能模式,该模式使用日志写入器(LGWR)异步传输(ASYNC),而且只读副本I/O没有任何确认(NOAFFIRM)。在这种模式下,一旦产生的redo被写入在线redo日志,即提交相应事务。此外,redo还会被异步写入至只读副本的redo日志。这套解决方案在最大程度提升数据保护水平的同时,又不会对主数据库实例的性能造成任何影响。

根据数据库工作负载及其所生成redo日志的具体数量,我们可以将RPO与RTO控制在不超过10分钟的时间之内。RDS Oracle会在主实例与只读副本之间建立安全的通信通道,并通过安全组和访问控制列表,实现主实例和只读副本之间安全的redo传输。

区域内只读副本使用场景

下面来看区域只读副本的几种常见用例:

  • 转移读取工作负载——客户可以将读取工作负载从主数据库实例转移至只读副本数据库实例,借此提高运行在主数据库上的读取与写入事务的性能表现。
  • 读取工作负载横向扩展——客户最多可以创建5个只读副本,借此实现读取工作负载的横向扩展
  • 可用性——客户可以将指定的只读副本提升为新的独立数据库保证在主数据库发生故障时带来更高的可用性。

下图所示,为Amazon RDS for Oracle区域内只读副本的基本架构。

跨区域只读副本使用场景

下面来看跨区域只读副本的几种常见场景:

  • 托管灾难恢复——使用托管灾难恢复方案,客户可以将其他区域内的只读副本提升为新的独立生产数据库。
  • 优化数据邻近度——客户可以将副本部署在更靠近应用程序用户的特定区域内,借此降低读取延迟。
  • 转移读取工作负载——客户可以将读取工作负载从主数据库实例转移至只读副本数据库实例。只读副本可以部署在任意服务区域内。
  • 读取工作负载横向扩展——客户可以在任意区域中部署最多5个只读副本,借此实现读取工作负载的横向扩展。

下图所示,为Amazon RDS for Oracle跨区域只读副本的基本架构。

 

在Amazon RDS控制台上创建只读副本

Amazon RDS for Oracle只读副本为各数据库实例提供强大的性能与持久性。Amazon RDS可使用源数据库实例的快照创建第二个数据库实例。要启用只读副本,大家需要首先启用自动备份选项(将备份保留周期的值设置为大于0),并在源数据库实例上启用强制日志记录。要启用强制日志记录模式,请连接数据库实例并输入以下代码:

exec rdsadmin.rdsadmin_util.force_logging(p_enable => true);

关于创建只读副本以及相关限制的更多详细信息,请参阅Oracle数据库只读副本限制说明

在本章节中,我们将共同了解如何创建跨区域只读副本。

创建主(源数据库)实例。
为了单纯展示只读副本的创建过程,我们已经在“us-west-2”区域内创建了名为“mydbinstance”的主数据库实例,具体操作命令如下:

aws rds create-db-instance \
  --db-instance-identifier mydbinstance \
  --db-name MYDB \
  --allocated-storage 20 \
  --storage-type gp2 \
  --db-instance-class db.m5.xlarge \
  --engine oracle-ee  \
  --port 1521 \
  --backup-retention-period 1 \
  --license-model byol \
  --master-user-password XXXXXXXXXX \
  --master-username admin \
  --engine-version 19.0.0.0.ru-2020-01.rur-2020-01.r1
 
       

关于更多详细信息,请参阅创建一个Oracle数据库实例,及如何连接Oracle数据库实例上的数据库。当主数据库实例状态显示为Available后,您即可创建只读副本了(请确保在Amazon RDS控制台中前往Region部分,并选定主数据库实例)。

  • 创建主(源数据库)实例

为了单纯展示只读副本的创建过程,我们已经在“us-west-2”区域内创建了名为“mydbinstance”的主数据库实例,具体操作命令如下:

aws rds create-db-instance \
  --db-instance-identifier mydbinstance \
  --db-name MYDB \
  --allocated-storage 20 \
  --storage-type gp2 \
  --db-instance-class db.m5.xlarge \
  --engine oracle-ee  \
  --port 1521 \
  --backup-retention-period 1 \
  --license-model byol \
  --master-user-password XXXXXXXXXX \
  --master-username admin \
  --engine-version 19.0.0.0.ru-2020-01.rur-2020-01.r1

关于更多详细信息,请参阅创建一个Oracle数据库实例,及如何连接Oracle数据库实例上的数据库。当主数据库实例状态显示为Available后,您即可创建只读副本了(请确保在Amazon RDS控制台中前往Region部分,并选定主数据库实例)。

  • 在Amazon RDS控制台中,选择Databases。
  • 选择 mydbinstance。
  • 在Actions下拉菜单中,选择Create read replica。

  • 在Instance specifications部分的DB instance class中,选择m5.xlarge。
  • 在Multi-AZ deployment部分,选择No。
  • 在Storage type部分,选择General Purpose(SSD)。

  • 在Network & Security部分的Destination region处,选择US East (N. Virginia)。
  • 在Destination DB subnet group处,选择default。
  • 在Availability zone处,选择No preference。
  • 在Publicly accessible部分,选择Yes。
  • 在VPC security groups部分,选择default。

  • 在Settings部分的 Read replica source处,选择mydbinstance。
  • 在DB instance identifier部分,输入 mydbinstance-ro

  • 在Monitoring部分的Enhanced monitoring处,选择Disable enhanced monitoring。
  • 在Log exports部分,取消所有选中的日志类型。

  • 在Performance Insights部分,选择Disable Performance Insights。
  • 在Maintenance部分的Auto minor version upgrade处,选择No。

  • 选择Create read replica。整个创建过程大概需要10到15分钟,创建完成后您的主数据库实例将在us-west-2中显示为 Master 

    The role for the Read Replica shows as Replica in us-east-1.

 

在 AWS CLI 创建只读副本

另外,大家也可以在AWS CLI中或者使用 create-db-instance-read-replica Amazon RDS API创建只读副本。要在us-east-1中创建跨区域只读副本(mydbinstance-ro),并在us-west-2区域中运行主数据库实例(mydbinstance),请输入以下操作代码:

aws rds create-db-instance-read-replica \
--source-db-instance-identifier arn:aws:rds:us-west-2:xxxxxxxxxx:db:mydbinstance\
--source-region us-west-2\
--db-instance-identifier mydbinstance-ro\
--region us-east-1
-- kms-key-id  kms-key-id xxxxxxxxxx: xxxxxxxxxx:

如果您希望在其他区域中创建加密的只读副本,则需要为目标区域指定一个AWS KMS密钥。您在区域内创建的AWS KMS加密密钥,将只能在该区域中使用;我们无法在某一区域中使用其他区域内创建的加密密钥。

 

连接只读副本

您可以使用首选客户端连接只读副本实例;本文将使用SQL * Plus,具体如下所示。关于更多接入RDS Oracle数据库的详细信息,请参阅接入您的示例Oracle数据库实例

要使用SQL * Plus接入只读副本,请输入以下操作代码:

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> set lines 250 pages 10000
SQL> show parameter db_uniq

NAME				     	TYPE	 	VALUE
------------------------------------ -----------
db_unique_name			     string	MYDB_B

SQL> select open_mode,database_role from v$database;

OPEN_MODE	     		DATABASE_ROLE
-------------------- ----------------
READ ONLY WITH APPLY 	PHYSICAL STANDBY

监控只读副本上的复制延迟

您可以在Amazon CloudWatch控制台、Amazon RDS控制台、Oracle Enterprise Manager)OEM)或者Oracle Data Guard视图(v$archived_logv$dataguard_statsv$dataguard_status)上监控复制延迟。

如果希望在Amazon RDS控制台中进行监控,请在Databases页面下选择您的只读副本实例。

在Monitoring选项卡中,搜索replica lag。

您也可以使用首选客户端连接只读副本实例;本文将使用SQL Deverloper。关于接入RDS Oracle数据库的更多详细信息,请参阅接入您的示例Oracle数据库实例。具体操作代码如下:

您也可以在只读副本实例上运行以下查询,使用Oracle Active Data Gurad视图检查关于副本延迟的更多详细信息。以下为使用SQL Deverloper并通过管理员用户连接只读副本的输出结果

SQL>  Select * from v$standby_event_histogram where upper(name)='APPLY_LAG';

SQL> Select name,value,datum_time,time_computed from v$dataguard_stats where upper(name)='APPLY_LAG';

 

提升只读副本

一旦发生灾难,请完成以下步骤,将特定的跨区域只读副本提升为新的独立生产数据库:

  1. 停止仍在访问旧有生产数据库的应用程序。
  2. 保证所有可用的redo日志都已被正确应用于跨区域只读副本,且不存在复制滞后。
  3. 提升该跨区域只读副本。
  4. 将应用程序指向提升后数据库的监听器端点。
  5. 为提升后的新独立数据库重新创建只读副本。

要手动提升只读副本,请完成以下操作步骤:

  • 在Databases页面中,选择mydbinstance-ro
  • 在Actions下拉菜单中,选择Promote。
  • 在Promote Read Replica页面中的Enable automatic backups位置,选择Yes。
  • 在Backup retention period部分,选择1 days。
  • 在Backup window部分,选择No preference。

  • 选择Continue。
    现在,您会看到确认页面。
  • 选择Promote Read Replica。

    整个过程大概需要5分钟。在成功完成后,您可以在Amazon RDS控制台上验证主实例与副本实例的状态。二者的角色都应显示为 Instance。

    如果需要修改数据库实例标识符,您可以选定该实例并选择Modify。

 

通过AWS CLI提升只读副本

要在AWS CLI上提升只读副本,请输入以下操作代码:

aws rds promote-read-replica \
 --db-instance-identifier mydbinstance-ro\

 

计划内维护

无论是大升级与小升级,与引擎相关的升级操作将首先作用于主数据库实例,而后再并行将引擎升级应用于所有副本(请注意,所有副本都将在主数据库实例的维护容器期间升级完成)。关于为Amazon RDS for Oracle升级数据库引擎的更多详细信息,请参阅升级Oracle数据库引擎

 

许可要求

要使用Amazon RDS for Oracle支持的区域内与跨区域只读副本功能,您需要使用Oracle Database Enterprise Edition中的自带许可(BYOL)模式,同时拥有一份Oracle Active Data Guard选项的使用许可。在主数据库实例及各只读副本数据库实例中,您都需要Oracle Enterprise Edition以及Oracle Active Data Guard选项的使用许可。

 

兼容性

Amazon RDS for Oracle支持Oracle Enterprise Edition的12.1及更高版本(从12.1.0.2.v10起)。

 

计费标准

只读副本的计费标准与标准数据库实例相同。与标准数据库实例一样,数据库实例的每小时运行费用,由只读副本所使用的具体数据库实例类型决定。

对于跨区域只读副本,主数据库实例与只读副本数据库实例之间的往来传输数据需要计费,具体取决于源区域与目标区域之间的数据传输速率。关于实例计费、存储、数据传输以及可用区域相关的更多详细信息,请参阅Amazon RDS for Oracle计费标准

 

实现只读副本的高可用性

您可以启用多可用区,为运行在只读副本上的关键业务报告类工作负载提供高可用性保证。在进行多可用区故障转移时(主环境或只读副本环境),Data Guard将自动在源与目标实例之间执行复制与重新配置,无需任何人为干预。

以下CLI代码所示,为如何在只读副本上启用多可用区。

## Modify read replica: convert SAZ to MAZ:
 
aws rds modify-db-instance \
--db-instance-identifier mydbinstance-ro\
--apply-immediately\
-- multi-az

我们为只读副本选择的实例类型与存储类型,不必与主实例的实例类型与存储类型相同。例如,您可以在区域内只读副本中使用配置较低的实例类型、大小与存储类型,只要足够处理读取工作负载即可。如果需要使用跨区域只读副本实现灾难恢复,则应保证只读副本直接使用主实例的实例类型、大小与存储类型镜像,保证在将跨区域只读副本提升至主实例后,可直接处理所有生产工作负载。

 

多可用区部署与只读副本

Amazon RDS for Oracle只读副本属于Amazon RDS多可用区部署的一种重要补充。Amazon RDS多可用区机制将带来高可用性与强大的数据保护能力,区域内只读副本则负责为只读类工作负载提供可扩展性支持。跨区域只读副本在可扩展性之外,又进一步实现了灾难恢复功能。再有,如果希望在只读副本上运行关键业务报告类工作负载,则应在只读副本数据库实例上启用多可用区选项。下表所示,为Amazon RDS多可用区与Amazon RDS for Oracle只读副本之间的比较结果:

多可用区 只读副本
同步复制——高持久度,零数据丢失 异步复制——高可扩展性
单区域内实现高可用性与灾难恢复功能 区域内只读副本实现读取可扩展性;跨区域只读副本为跨越2个区域实现灾难恢复功能。
在任意时间点内,只有主实用处于活动状态 所有副本皆处于活动状态,且可实现读取规模伸缩
备份来自第二个实例 RDS Oracle只读副本不支持备份功能
始终处于同一区域内的两个可用区中 可处于同一可用区内、跨越多个可用区或者跨越多个服务区域
当检测到问题时自动执行故障转移 可手动提升为独立数据库

总结

Amazon RDS for Oracle能够在只读副本之上支持托管灾难恢复与托管读取工作负载的可扩展能力。如果您身为Oracle BYOL客户且需要建立一套灾难恢复策略,可以将您自行管理的关键任务数据库迁移至Amazon RDS for Oracle,借此享受托管灾难恢复与只读副本带来的各种收益。

在转换为托管数据库服务模式之后,您可以使用Amazon RDS for Oracle托管服务提供的高可用性、灾难恢复、可扩展性以及多种丰富功能,摆脱繁重的日常运营负担。以此为基础,大家能够专注于对组织业务更为重要的事务,例如优化数据库设计、调整容量以及调整性能等等。关于Amazon RDS for Oracle只读副本的更多详细信息,请参阅使用Amazon RDS for Oracle只读副本RDS只读副本使用指南

 

本篇作者

Sameer Malik

Amazon Web Services公司首席数据库解决方案架构师。

Srinagesh Battula

Amazon Web Services公司首席产品经理。