通过使用全球数据服务在 AWS 中为 O

高效负载均衡与连接路由:在 AWS 中使用全球数据服务处理 Oracle 数据库工作负载

关键要点

在本文中,我们探讨了如何在 AWS 中利用全球数据服务(GDS)优化 Oracle数据库工作负载的负载均衡和连接路由。全球数据服务能够提供高可用性、负载均衡、工作负载路由以及复制延迟路由等功能,以满足分布式数据库的需求。通过本文提供的解决方案,实现了高效的资源利用和简化的管理。


Oracle 全球数据服务(GDS)是一个专门用于管理全球环境中分布式数据库连接的服务。它旨在提供高可用性、可扩展性和高效的负载均衡,跨多个 Oracle数据库实例进行操作。GDS 充当应用和数据库层之间的中介层,负责高可用性、优化负载均衡和智能请求路由。

在本文中,我们将展示如何将 Oracle GDS 与 AWS 中的 Oracle 数据库集成,以应对分布式数据库所面临的以下挑战:

挑战描述
读负载均衡GDS自动根据预设标准(如当前系统负载、地理位置或可用资源)将传入负载分配到多个数据库实例,从而优化资源利用率。
工作负载路由GDS能智能地将数据库请求精确地定向到网络中最合适的数据库实例,以实现最佳的性能。
基于复制延迟的路由允许 GDS 将查询直接路由至延迟最小的副本,从而确保用户始终访问最新数据。
基于角色的全球服务故障转移当数据库发生切换时,GDS无缝地将服务转移到新的主数据库实例,最小化停机时间。
集中工作负载管理GDS集中管理工作负载分配,简化了管理员的任务,并提高了对整个数据库基础架构性能的可见性。

解决方案概述

Oracle GDS 扩展了 Oracle 数据库服务模型,形成了一个被称为 GDS 配置 的同步数据库组。对于数据库客户端而言,这种配置呈现为一个虚拟多实例数据库,通过全球服务提供访问。这些全球服务类似于单实例或 Oracle实时应用集群(RAC)中找到的本地数据库服务,提供负载均衡、高可用性和资源管理能力。关键区别在于,本地服务仅限于单一数据库中的实例,而全球服务则跨多个数据库的实例扩展。

Oracle GDS 的组件

  • GSM 服务器和监听器 :全球服务管理器(GSM)是 Oracle GDS 的核心组件,提供服务级负载均衡、故障转移和集中管理服务的能力。
  • GDS 目录 :存储 GDS 配置的配置数据以及该配置提供的所有全球服务的存储库。
  • GDS 池 :提供一套共同的全球服务,所有池数据库必须是企业版(EE)。
  • GDS 区域 :定义一组紧密网络连接的数据库和客户端。
  • GDS 服务 :指由多个具有复制数据的数据库提供的服务。
  • GDSCTL :用于配置 Oracle GDS 的命令行接口。

以下示意了这种架构。

删除)

根据 Oracle 文档,对于 GSM 软件不需要单独的许可证。如果 GDS 目录数据库是现有存储库(例如 Oracle企业管理器)数据库中的模式,或作为单实例数据库单独承载,则不需要 EE 许可证。其他许可证适用于使用 RAC 或数据保护特性时。评估在 Amazon RDSCustom for Oracle 上承载 GDS 目录数据库的选项时,必须考虑这些许可证要求。GDS 配置中的所有池数据库必须是 EE 并获得 Oracle Active Data Guard 或 Oracle GoldenGate 的许可证。

接下来,通过 AWS 中的 Amazon RDS for Oracle 作为池数据库实例,演示如何使用 Oracle GDS 进行配置:

  • oradb2 (唯一名称 ORADB_A) - RDS for Oracle 主数据库
  • oradb1 (唯一名称 ORADB_D) - RDS for Oracle 读副本数据库
  • oradb_r1 (唯一名称 ORADB_B) - RDS for Oracle 读副本数据库
  • oradb_r2 (唯一名称 ORADB_C) - RDS for Oracle 读副本数据库
  • orcl1 (唯一名称 ORCL_A) - RDS for Oracle 数据库 2

实现此解决方案的高级步骤如下:

  1. 安装 Oracle GDS。
  2. 创建并准备一个 GDS 目录数据库。
  3. 准备 GDS 池数据库。
  4. 配置 GSM 服务器。
  5. 在 GSM 服务器中添加池数据库。
  6. 根据用例添加服务。
  7. 配置并测试客户端连接。

在接下来的部分中,我们描述如何为四种不同的用例添加池数据库和服务。

先决条件

每个 GDS 池数据库应该能够与每个 GSM 服务器的监听器端口建立双向通信。此外,这些 GSM 监听器端口必须向应用或客户端层、所有 GDS池数据库、GDS 目录和所有其他全球服务管理器开放。每个 GDS 池数据库的 TNS 监听器端口(通常在默认端口号 1521 上运行)应保持双向通信。

您可以通过配置安全组规则来允许入站和出站流量,建议将安全组指定为源或目标,而不是使用 IP 地址,这种方法增强了安全性,并简化了规则管理。

如果您从单独的机器运行 GDSCTL,则必须确保从该机器到已添加到配置中的每个 GDS 池数据库的双向通信端口开放。如果 Oracle GDS组件与池数据库之间的连接没有正确配置,池数据库的客户端连接请求可能会出现挂起或 TNS 错误。

在 EC2 服务器上安装 Oracle GDS

您可以在 Amazon EC2 上安装和配置 Oracle GDS。有关详细信息,请参阅 。安装后,设置以下 ORACLE_HOMEORACLE_BASE 环境变量:

bash export ORACLE_BASE=/u01/apps/oracle exportORACLE_HOME=/u01/apps/oracle/product/gsm exportPATH=$ORACLE_HOME/bin:$PATH:$HOME/local/bin:$HOME/bin

创建并准备 GDS 目录数据库

您可以选择创建一个专用数据库来承载 GDS 目录,或者使用现有的存储库数据库。无论是托管在 Amazon EC2 的自我管理数据库中,还是在 AmazonRDS Custom for Oracle 中,配置步骤保持一致。为了验证高可用性,建议实施 Oracle 的高可用性功能,比如 Oracle数据保护,以保护 GDS 目录免受潜在中断。这种方法提供了一个健壮且可靠的 GDS 目录基础设施。

创建目录数据库后,完成以下步骤进行配置:

  1. 在 GDS 目录数据库 (gdscat) 中,以特权用户身份登录,使用以下命令设置 GDS 管理员账户和权限:

sql SQL> connect <user>/<passwd>@gdscat SQL> show parameter db_unique SQL> alter user gsmcatuser account unlock; SQL> alter user gsmcatuser identified by <passwd>; SQL> create user gsmadmin identified by <passwd>; SQL> grantgsmadmin_role to gsmadmin; SQL> exit

在此示例中,我们使用具有管理员权限的用户连接到目录数据库,以便创建和修改用户,并授予 gsmadmin_role。您也可以使用 SYS 或 SYSTEM来执行此操作,建议为这些用户使用复杂的密码。

  1. 在 GDS 目录中设置远程监听器指向 GSM 监听器:

sql SQL> connect <user>/<passwd>@gdscat SQL> alter system set remote_listener = '<your EC2 instance DNS name>:<your database port>' SCOPE=BOTH;

在此示例中,GSM 监听器将在 EC2 主机 ip-172-xx-xx-xxx.ec2.internal 的 1521端口上运行,我们稍后会更详细地讨论此配置。

准备池数据库

  1. 确保数据库监听器、池数据库和 GDS 目录数据库 (gdscat) 已设置。然后完成以下步骤以准备池数据库:

sql SQL> conn <user>/<passwd>@<pooldb1> SQL> show parameter db_unique SQL> alter user gsmuser account unlock; SQL> alter user gsmuser identified by <passwd>; SQL> exit;

  1. 在所有池数据库上设置远程监听器,指向 GSM 监听器。有关如何在 Amazon RDS for Oracle 中设置参数的详细信息,请参阅 。修改参数组以设置以下参数:

sql remote_listener: <your EC2 instance DNS name>:<your database port>

对于托管在 Amazon EC2 和 Amazon RDS Custom for Oracle 上的自我管理数据库,运行以下语句:

sql SQL> alter system set remote_listener = '<your EC2 instance DNSname>:<your db port>' SCOPE=BOTH SID='*'

  1. 对池中的所有主数据库重复上述步骤。

配置 GDS 服务器

GDS 配置由每个区域内的多个 GSM 组成。这些 GSM 作为全球监听器,协调跨数据库服务故障转移,并在 GDS 环境中提供负载均衡。

建议将 GSM 监听器配置在与 Oracle 数据库分开的服务器上,这种分离会增强 Oracle GDS 基础设施的稳定性和可靠性。

完成以下步骤以配置 GDS 服务器:

  1. 将 GDS 目录和池数据库的 TNS 条目添加到 GSM 服务器节点上的 tnsnames.ora 中。以下代码显示了示例 TNS 条目。确保为所有与用例相关的主数据库和备用数据库(读副本)添加条目:
(CONNECT_DATA = (SERVICE_NAME = CSTMTRG3) ) )

ORADB2, ORADB_A = (DESCRIPTION = (address = (protocol = tcp)(host = )(port =
)) (CONNECT_DATA = (SERVICE_NAME = ORADB) ) )

ORADB_R1, ORADB_B = (DESCRIPTION = (address = (protocol = tcp)(host = )(port =
)) (CONNECT_DATA = (SERVICE_NAME = ORADB) ) ) ```

  1. 使用 GDSCTL 创建 GDS 目录,从 GSM 服务器节点的终端窗口运行以下代码:

`bash $ gdsctl GDSCTL> create catalog -database gdscat -user gsmadmin
-configname aws.amazon.com`

  1. 添加并启动 GSM 服务器。在以下代码中,我们添加 GSM 服务器 `gsm1east1`,它将在 `port 1521` 上监听。您可以使用类似代码为其他区域添加 GSM 服务器:

`bash GDSCTL> add gsm -gsm <gsm server name> -listener <gsm listener port>
-catalog gdscat GDSCTL> start gsm -gsm <gsm server name>`

例如:

`bash GDSCTL> add gsm -gsm gsm1east1 -listener 1521 -catalog gdscat GDSCTL>
start gsm -gsm gsm1east1`

  1. 检查 GSM 服务器的配置,使用以下代码:

`bash GDSCTL> config gsm -gsm <gsm server name>`

例如:

`bash GDSCTL> config gsm -gsm gsm1east1 Catalog connection is establishedName: gsm1east1 Endpoint 1: (ADDRESS=(HOST=ip-172-xx-xx-
xxx.ec2.internal)(PORT=1521)(PROTOCOL=tcp)) Local ONS port: 6123 Remote ONSport: 6234 ORACLE_HOME path: /u01/apps/oracle/product/gsm GSM Host name:
ip-172-xx-xx-xxx.ec2.internal Region: regionora`

  1. 允许已配置的 `gdscat` 数据库的远程监听器和池数据库与 GSM 监听器注册,通过向相应服务器的允许列表中添加主机 DNS 端点:

`bash GDSCTL> config vncr GDSCTL> add invitednode <DNS endpoint of catalog DBhost> GDSCTL> add invitednode <DNS endpoint of pool db1> GDSCTL> addinvitednode <DNS endpoint of pool db2>`

使用 `config vncr` 验证,所有添加的服务器应显示在输出中。

  1. 检查 GSM 监听器的状态,以验证目录数据库服务和池数据库服务是否已注册:

`bash $ lsnrctl status <GSM server name>`

例如:

`bash $ lsnrctl status GSM1EAST1`

  1. 创建 GDS 区域。在以下代码中,我们创建两个区域 `east1` 和 `east2`:

`bash GDSCTL> add region -region east1, east2`

  1. 为每个 GSM 指定一个区域:

`bash GDSCTL> modify gsm –gsm gsm1east1 -region east1`

  1. 可选地,根据应用创建一个池,将所有池数据库分组:

`bash GDSCTL> add gdspool -gdspool <pool>`

例如:

`bash GDSCTL> add gdspool -gdspool orders`

接下来的部分中,我们将描述如何为不同的用例添加池数据库和服务。

## 用例 1:透明托管切换(基于角色的服务故障转移)

在与读副本进行时,通常需要手动干预以将应用程序重定向到新提升的主数据库。为了解决这个问题,Oracle GDS提供了基于角色的服务故障转移的能力。Oracle GDS会根据数据库的角色自动重定位全球服务。在这一场景中,我们设置了两个全球服务:`order_entry_srvc`,配置为在主数据库 `(ORADB_A)`
上运行,`order_reporting_srvc` 定向在备用数据库 `(ORADB_D)`
上运行。在执行数据保护切换操作后,您会发现角色变化后,`order_entry_srvc` 无缝地转移到新主数据库 `(ORADB_D)`,并且
`order_reporting_srvc` 转移到新备用数据库 `(ORADB_A)`。

以下示意了切换前的架构。

删除)

以下示意了切换后的架构。

![切换后](https://d2908q01vomqb2.cloudfront.net/887309d048beef83ad3eabf2a79a64a389ab1c9f/2023/12/11/DBBLOG-3335-after-.png)

从 GDS 服务器完成以下步骤:

  1. 将数据库添加到 GDS 池。对于这个用例,我们使用以下池数据库:

  2. oradb2 (ORADB_A) – RDS for Oracle 主数据库

  3. oradb1 (ORADB_D) – RDS for Oracle 读副本

`bash GDSCTL> add database -connect oradb1 -gdspool orders -region east1GDSCTL> add database -connect oradb2 -gdspool orders -region east1`

  1. 检查数据库是否已注册到 GSM,运行以下代码:

`bash GDSCTL> databases`

  1. 添加并启动服务 `order_entry_srvc`(用于读/写工作负载)和 `order_reporting_srvc`(用于报告工作负载):

`bash GDSCTL> add service -service order_entry_srvc -gdspool orders
-preferred_all -role PRIMARY GDSCTL> start service -service order_entry_srvc
-gdspool orders GDSCTL> add service -service order_reporting_srvc -gdspoolorders -preferred_all -role PHYSICAL_STANDBY GDSCTL> start service -serviceorder_reporting_srvc -gdspool orders`

  1. 检查运行的服务和数据库的位置:

`bash GDSCTL> services GDSCTL> databases`

  1. 为 `order_entry_srvc` 和 `order_reporting_srvc` 在客户端的 `tnsnames.ora` 文件中添加 TNS 条目。将主机名和端口替换为您的 GSM 服务器 DNS 端点和 GSM 监听器端口:

```bash order_entry_srvc = (DESCRIPTION = (FAILOVER = ON) (CONNECT_TIMEOUT =
3) (TRANSPORT_CONNECT_TIMEOUT = 3) (RETRY_COUNT = 2) (ADDRESS_LIST = (

Leave a Reply

Required fields are marked *