多可用区数据库集群部署 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

多可用区数据库集群部署

一个多可用区数据库集群部署是 Amazon RDS 的高可用性部署模式,具有两个可读的备用数据库实例。多可用区数据库集群在同一个 Amazon 区域的三个独立可用区中有一个写入器数据库实例和两个读取器数据库实例。与多可用区数据库实例部署相比,多可用区数据库集群可提供高可用性、增加读取工作负载容量以及更低的写入延迟。

重要

多可用区数据库集群与 Aurora 数据库集群不同。有关使用 Aurora 数据库集群的更多信息,请参阅《Amazon Aurora 用户指南》。

多可用区数据库集群概览

使用多可用区数据库集群,Amazon RDS 使用数据库引擎的本机复制功能将数据从写入器数据库实例复制到两个读取器数据库实例。当对写入器数据库实例进行更改时,它会发送给每个读取器数据库实例。提交更改需要至少一个读取器数据库实例的确认。

读取器数据库实例可充当自动故障转移目标,还可提供读取流量以提高应用程序读取吞吐量。如果写入器数据库实例发生中断,RDS 将管理到其中一个读取器数据库实例的故障转移。RDS 会根据具有最近更改记录的读取器数据库实例来执行此操作。

下图显示了一个多可用区数据库集群。


				多可用区数据库集群

与多可用区数据库实例部署相比,多可用区数据库集群的写入延迟通常较低。其还允许在读取器数据库实例上运行只读工作负载。RDS 控制台显示了写入器数据库实例的可用区和读取器数据库实例的可用区。您也可以使用 describe-db-clusters CLI 命令或 DescribeDBClusters API 操作来查找此信息。

创建和管理多可用区数据库集群

您可以直接或通过从快照还原来创建多可用区数据库集群。有关说明,请参阅以下主题:

您可以按照以下主题中的说明修改、重启或删除多可用区数据库:

您可以按照 创建多可用区数据库集群的快照 中的说明创建多可用区数据库集群的快照。

您可按照 将多可用区数据库集群还原到指定时间 中的说明将多可用区数据库集群还原到某个时间点。

管理多可用区数据库集群的连接

多可用区数据库集群具有三个数据库实例,而不是单个数据库实例。每个连接均由特定的数据库实例处理。在连接到多可用区数据库集群时,您指定的主机名和端口将指向名为 endpoint(端点)的完全限定域名。多可用区数据库集群使用端点机制来提取这些连接。因此,当某些数据库实例不可用时,您不必对所有主机名进行硬编码或编写自己的逻辑来重新路由连接。

写入器端点将连接到数据库集群的写入器数据库实例,该实例同时支持读取和写入操作。读取器终端节点连接到两个读取器数据库实例之一,这两个实例仅支持读取操作。

通过使用终端节点,您可以根据使用案例将每个连接映射到相应的数据库实例或数据库实例组。例如,要执行 DDL 和 DML 语句,您可以连接到作为写入器数据库实例的任一数据库实例。要执行查询,您可以连接到读取器终端节点,并通过多可用区数据库集群自动在读取器数据库实例之间管理连接。对于诊断或优化,您可以连接到特定数据库实例端点以检查有关特定数据库实例的详细信息。

有关连接到数据库实例的信息,请参阅 连接到 Amazon RDS 数据库实例

多可用区数据库集群端点的类型

端点由包含主机地址的唯一标识符表示。可从多可用区数据库集群使用以下类型的端点。

集群终端节点

多可用区数据库集群的集群端点(或写入器端点)连接到该数据库集群的当前写入器数据库实例。此端点是唯一可以执行写操作(如 DDL 和 DML 语句)的端点。此端点还可以执行读取操作。

每个多可用区数据库集群均有一个集群端点和一个写入器数据库实例。

对数据库集群上的所有写入操作使用集群终端节点,这些操作包括插入、更新、删除和 DDL 更改。您还可以对读取操作(如查询)使用集群终端节点。

如果数据库集群的当前写入器数据库实例失败,多可用区数据库集群将自动故障转移到新的写入器数据库实例。在故障转移期间,数据库集群将继续为从新的写入器数据库实例到集群端点的请求提供服务,对服务造成的中断最少。

以下示例介绍多可用区数据库集群中的集群端点。

mydbcluster.cluster-123456789012.us-east-1.rds.amazonaws.com

读取器终端节点

多可用区数据库集群的读取器终端节点为数据库集群的只读连接提供支持。对读取操作 (如查询) 使用读取器终端节点。通过在读取器数据库实例上处理这些语句,此端点可减少写入器数据库实例上的开销。它还可以帮助集群扩展容量以同时 SELECT 查询。每个多可用区数据库集群均有一个读取器终端节点。

读取器终端节点向读取器数据库实例之一发送每个连接请求。在会话中使用读取器终端节点时,您只能执行只读语句,例如该会话中的 SELECT

以下示例介绍多可用区数据库集群的读取器终端节点。

mydbcluster.cluster-ro-123456789012.us-east-1.rds.amazonaws.com

实例终端节点

实例端点会连接到多可用区数据库集群中的特定数据库实例。数据库集群中的每个数据库实例具有自己的唯一实例终端节点。因此,数据库集群的当前写入器数据库实例具有一个实例端点,并且数据库集群中的每个读取器数据库实例都具有一个实例端点。

实例端点提供对数据库集群连接的直接控制。此控制可以帮助您解决可能不适合使用集群端点或读取器终端节点的场景。例如,客户端应用程序可能根据工作负载类型需要更精细的负载均衡。在这种情况下,您可以配置多个客户端以连接到数据库集群中的不同读取器数据库实例,以便分配读取工作负载。

以下示例介绍多可用区数据库集群中数据库实例的实例端点。

mydbinstance.123456789012.us-east-1.rds.amazonaws.com

查看多可用区数据库集群的端点

在 Amazon Web Services Management Console 中,您可以在每个多可用区数据库集群的详细信息页面中查看集群端点和读取器终端节点。您可在每个数据库实例的详细信息页面中查看实例端点。

利用 Amazon CLI,您会在 describe-db-clusters 命令的输出中看到写入器和读取器终端节点。例如,以下命令显示当前 Amazon 区域中所有集群的终端节点属性。

aws rds describe-db-cluster-endpoints

利用 Amazon RDS API,您可以通过调用 DescribeDBClusterEndpoints 函数来检索终端节点。输出还将显示 Amazon Aurora 数据库集群端点(如果存在)。

使用集群终端节点

每个多可用区数据库集群都有一个内置读取器端点,其名称和其他属性均由 Amazon RDS 管理。您无法创建、删除或修改此类端点。

在管理数据库集群、执行提取、转换、加载 (ETL) 操作或开发和测试应用程序时,可以使用集群端点。集群端点将连接到集群的写入器数据库实例。写入器数据库实例是您可以在其中创建表和索引、运行 INSERT 语句以及执行其他 DDL 和 DML 操作的唯一数据库实例。

当故障转移机制将新数据库实例提升为集群的写入器数据库实例时,集群端点指向的物理 IP 地址会发生更改。如果您使用任意形式的连接池或其他多路复用,请准备刷新或减少任何缓存的 DNS 信息的生存时间。这样做可确保您不会尝试与在故障转移后不可用或现在为只读的数据库实例建立读/写连接。

使用读取器终端节点

您将读取器终端节点用于多可用区数据库集群的只读连接。此端点可帮助数据库集群处理查询密集型工作负载。读取器终端节点是您向在集群上执行报告或其他只读操作的应用程序提供的终端节点。读取器终端节点向多可用区数据库数据库集群中的可用读取器数据库实例发送连接。

每个多可用区集群都有一个内置读取器终端节点,其名称和其他属性由 Amazon RDS 管理。您无法创建、删除或修改此类端点。

使用实例终端节点

多可用区数据库集群中的每个数据库实例均有自己的内置实例端点,其名称和其他属性由 Amazon RDS 管理。您无法创建、删除或修改此类端点。使用多可用区数据库集群时,与实例端点相比,您通常会更频繁地使用写入器和读取器终端节点。

在日常操作中,使用实例端点的主要方式是诊断影响多可用区数据库集群中某个特定数据库实例的容量或性能问题。在连接到特定数据库实例时,您可以检查其状态变量、指标等。这样做可以帮助您确定该数据库实例与集群中其他数据库实例的不同之处。

多可用区数据库端点如何使用高可用性

对于高可用性非常重要的多可用区数据库集群,请使用写入器端点进行读/写或通用型连接,并使用读取器终端节点进行只读连接。写入器和读取器终端节点比实例终端节点更好地管理数据库实例故障转移。与实例终端节点不同,如果集群中的数据库实例变得不可用,写入器和读取器终端节点会自动更改其连接到的数据库实例。

如果数据库集群的写入器数据库实例失败,Amazon RDS 将自动故障转移到新的写入器数据库实例。它通过将读取器数据库实例提升为新的写入器数据库实例来实现这一目标。如果发生了故障转移,您可以使用写入器端点重新连接到新提升的写入器数据库实例。或者,您可以使用读取器终端节点重新连接到数据库集群中的读取器数据库实例之一。在故障转移期间,在将读取器数据可实例提升为新的写入器数据库实例之后,读取器终端节点可能会在很短的时间内将连接定向到数据库集群的新写入器数据库实例。如果您设计自己的应用程序逻辑来管理实例端点连接,则可以手动或以编程方式搜索数据库集群中生成的可用数据库实例集。

使用 Amazon Web Services Management Console 管理多可用区数据库集群

您可以使用控制台管理多可用区数据库集群。

要使用控制台管理多可用区数据库集群

  1. 登录Amazon Web Services Management Console并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

  2. 在导航窗格中,选择 Databases(数据库),然后选择要管理的多可用区数据库集群。

下图显示了控制台中的多可用区数据库集群。


				Amazon Web Services Management Console 中的多可用区数据库集群

Actions(操作)菜单中可用的操作取决于是选择了多可用区数据库集群还是集群中的数据库实例。

选择多可用区数据库集群以查看集群详细信息并在集群级别执行操作。


				Amazon Web Services Management Console 中的多可用区数据库集群操作

在多可用区数据库集群中选择数据库实例以查看数据库实例详细信息并在数据库实例级别执行操作。


				Amazon Web Services Management Console 中多可用区数据库集群中的数据库实例操作

使用多可用区数据库集群的参数组

在多可用区数据库集群中,数据库集群参数组就像是引擎配置值的容器,这些值可应用于多可用区数据库集群中的每个数据库实例。

在多可用区数据库集群中,数据库参数组设置为数据库引擎和数据库引擎版本的原定设置数据库参数组。数据库集群参数组中的设置用于集群中的所有数据库实例。

有关参数组的信息,请参阅 使用参数组

副本滞后和多可用区数据库集群

副本滞后是写入器数据库实例上的最新事务与读取器数据库实例上的最新应用事务之间的时间差异。Amazon CloudWatch 指标 ReplicaLag 表示这种时间差。有关 CloudWatch 指标的更多信息,请参阅使用 Amazon CloudWatch 监控 Amazon RDS 指标

尽管多可用区数据库集群允许高写入性能,但基于引擎的复制的性质仍可能导致副本滞后。由于任何故障转移都必须先解决副本滞后问题,然后才能提升新的写入器数据库实例,因此要考虑监控和管理此副本滞后。

对于 RDS for MySQL 多可用区数据库集群,故障转移时间取决于两个剩余读取器数据库实例的副本滞后。两个读取器数据库实例必须先应用未应用的事务,然后才能将其中一个升级为新写入器数据库实例。

对于 RDS for PostgreSQL 多可用区数据库集群,故障转移时间取决于两个剩余读取器数据库实例的最低副本滞后。具有最低副本滞后的读取器数据库实例必须先应用未应用的事务,然后才能将其升级为新写入器数据库实例。

有关演示副本滞后超过设置时间量时如何创建 CloudWatch 告警的教程,请参阅 教程:为多可用区数据库集群副本滞后创建 Amazon CloudWatch 告警

副本滞后的常见原因

一般来说,写入工作负载过高,导致读取器数据库实例无法有效应用事务时,就会出现副本滞后。各种工作负载都可能会产生临时或持续副本滞后。以下是一些常见示例:

  • 写入器数据库实例的高写入并发或大量批处理更新,导致读取器数据库实例上的应用过程落后。

  • 在一个或多个读取器数据库实例上使用资源的繁重的读取工作负载。运行速度慢或查询数量多都可能会影响应用进程,继而导致副本滞后。

  • 由于数据库必须保留提交顺序,因此修改大量数据或 DDL 语句的事务有时会暂时加剧副本滞后问题。

缓解副本滞后问题

对于适用于 RDS for MySQL 和 RDS for PostgreSQL 的多可用区数据库集群,您可以通过减少写入器数据库实例的负载来缓解副本滞后问题。您还可以使用流量控制来减少副本滞后。流量控制通过限制写入器数据库实例上的写入操作来发挥作用,从而确保副本滞后时间不会继续无限延长。通过在事务结束时添加延迟来实现写入限制,以此降低写入器数据库实例的写入吞吐量。流量控制不能保证会消除滞后,但可以帮助缩短许多工作负载的总体滞后时间。以下各节提供有关将流量控制与 RDS for MySQL 和 RDS for PostgreSQL 结合使用的信息。

使用 RDS for MySQL 的流量控制来缓解副本滞后

当您使用 RDS for MySQL 多可用区数据库集群时,默认情况下,使用动态参数 rpl_semi_sync_master_target_apply_lag 启用流量控制。此参数指定副本滞后的上限。副本滞后接近这一配置限制时,流量控制会限制写入器数据库实例上的写入事务,以尝试将副本滞后控制在指定值以下。在某些情况下,副本滞后可能会超过指定的限制。默认情况下,该参数设置为 120 秒。要禁用流量控制,请将该参数设置为其最大值 86400 秒(一天)。

要查看流量控制注入的当前延迟,请通过运行以下查询来显示参数 Rpl_semi_sync_master_flow_control_current_delay

SHOW GLOBAL STATUS like '%flow_control%';

输出看上去类似于以下内容。

+-------------------------------------------------+-------+ | Variable_name | Value | +-------------------------------------------------+-------+ | Rpl_semi_sync_master_flow_control_current_delay | 2010 | +-------------------------------------------------+-------+ 1 row in set (0.00 sec)
注意

延迟以微秒为单位显示。

当您为 RDS for MySQL 多可用区数据库集群启用 Performance Insights 时,您可以监控与指示查询通过流量控制延迟的 SQL 语句对应的等待事件。当流量控制引入延迟时,您可以查看与 Performance Insights 控制面板上的 SQL 语句对应的等待事件 /wait/synch/cond/semisync/semi_sync_flow_control_delay_cond。要查看这些指标,请确保性能架构已启用。有关 Performance Insights 的信息,请参阅 在 Amazon RDS 上使用性能详情监控数据库负载

使用 RDS for PostgreSQL 的流量控制来缓解副本滞后

使用 RDS for PostgreSQL 多可用区数据库集群时,流量控制作为扩展部署。其为数据库集群中的所有数据库实例开启后台工件。默认情况下,读取器数据库实例上的后台工件会将当前副本滞后情况告知写入器数据库实例上的后台工件信。如果读取器数据库实例的滞后时间超过两分钟,则写入器数据库实例上的后台工件会在事务结束时添加延迟。若要控制滞后阈值,请使用参数 flow_control.target_standby_apply_lag

流量控制限制 PostgreSQL 进程时,pg_stat_activity 和 Performance Insights 中的 Extension 等待事件会表明该情况。函数 get_flow_control_stats 显示当前所添加延迟时长的详细信息。

流量控制可以给大多数短时、高量并发联机事务处理 (OLTP) 工作负载带来益处。如果滞后由长时间运行的事务(如分批操作)造成,流量控制便无法提供特别大的助益。

preload_shared_libraries 中移除扩展程序,然后重启数据库实例,即可关闭流量控制。

多可用区数据库集群的故障转移流程

如果多可用区数据库集群中的写入器数据库实例发生计划内或计划外的中断,Amazon RDS 会自动故障转移到另一个可用区中的读取器数据库实例。完成故障转移所用的时间取决于在写入器数据库实例变为不可用时的数据库活动和其他条件。故障转移时间通常低于 35 秒。当两个读取器数据库实例都应用了来自失败写入器的未完成事务后,故障转移即完成。完成故障转移后,RDS 控制台还需要一段时间才能反映新的可用区。

自动故障转移

Amazon RDS 会自动处理故障转移,因此,您可以尽快恢复数据库操作而无需管理干预。要进行故障转移,写入器数据库实例将自动切换到读取器数据库实例。

手动对多可用区数据库集群执行故障转移

您可以使用 Amazon Web Services Management Console、Amazon CLI 或 RDS API 手动对多可用区数据库集群执行故障转移。

要手动对多可用区数据库集群执行故障转移

  1. 登录Amazon Web Services Management Console并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

  2. 在导航窗格中,选择 Databases (数据库)

  3. 选择要进行故障转移的多可用区数据库集群。

  4. 对于 Actions(操作),请选择 Failover(故障转移)。

    此时将会显示 Failover DB Cluster(故障转移数据库集群)页面。

  5. 请选择 Failover(故障转移)以确认手动进行故障转移。

要手动对多可用区数据库集群执行故障转移,请使用 Amazon CLI 命令 failover-db-cluster

aws rds failover-db-cluster --db-cluster-identifier mymultiazdbcluster

要手动对多可用区数据库集群执行故障转移,请调用 Amazon RDS API FailoverDBCluster 然后指定 DBClusterIdentifier

确定多可用区数据库集群是否已完成故障转移

要确定多可用区数据库集群是否发生故障转移,您可以执行以下操作:

  • 将数据库事件订阅设置为在故障转移启动时向您发送电子邮件或 SMS 通知。有关事件的更多信息,请参阅 使用 Amazon RDS 事件通知

  • 使用 Amazon RDS 控制台或 API 操作查看数据库事件。

  • 使用 Amazon RDS 控制台、Amazon CLI 以及 RDS API 查看多可用区数据库集群的当前状态。

有关如何响应故障转移、缩短恢复时间以及 Amazon RDS 的其他最佳实践的信息,请参阅 Amazon RDS 的最佳实践

设置 DNS 名称查找的 JVM TTL

故障转移机制自动更改数据库实例的域名系统 (DNS) 记录,使其指向读取器数据库实例。因此,您需要重新建立与数据库实例之间的所有现有连接。在 Java 虚拟机 (JVM) 环境中,由于 Java DNS 缓存机制的工作原理,您可能需要重新配置 JVM 设置。

JVM 缓存 DNS 名称查找。当 JVM 将主机名解析为 IP 地址时,它会在指定时间段内 (称为存活时间 (TTL)) 缓存 IP 地址。

由于 Amazon 资源使用偶尔变更的 DNS 名称条目,因此建议您为 JVM 配置的 TTL 值不超过 60 秒。这样做可确保在资源的 IP 地址发生更改时,您的应用程序可以通过重新查询 DNS 来接收和使用资源的新 IP 地址。

对于一些 Java 配置,将设置 JVM 默认 TTL,以便在重新启动 JVM 之前绝不刷新 DNS 条目。因此,如果 Amazon 资源的 IP 地址在应用程序仍在运行时发生更改,则在您手动重新启动 JVM 并刷新缓存的 IP 信息之前,将无法使用该资源。在此情况下,设置 JVM 的 TTL,以便定期刷新其缓存的 IP 信息是极为重要的。

注意

默认 TTL 是变化的,具体取决于 JVM 的版本以及是否安装安全管理器。许多 JVM 提供的默认 TTL 小于 60 秒。如果您使用此类 JVM 并且未使用安全管理器,则您可以忽略本主题的剩余内容。有关 Oracle 中安全管理器的更多信息,请参阅 Oracle 文档中的安全管理器

要修改 JVM 的 TTL,请设置 networkaddress.cache.ttl 属性值。根据您的需求,使用下列方法之一:

  • 要为使用 JVM 的所有应用程序全局设置属性值,请在 networkaddress.cache.ttl 文件中设置 $JAVA_HOME/jre/lib/security/java.security

    networkaddress.cache.ttl=60
  • 要仅在本地为应用程序设置属性,请在建立任何网络连接之前,在应用程序的初始化代码中设置 networkaddress.cache.ttl

    java.security.Security.setProperty("networkaddress.cache.ttl" , "60");

多可用区数据库集群的限制

以下限制适用于多可用区数据库集群:

  • 您只能使用 MySQL 版本 8.0.28 和更高的 8.0 版本,以及 PostgreSQL 版本 13.4 创建多可用区数据库集群。

  • 您只能在以下 Amazon 区域中创建多可用区数据库集群:

    • 美国东部(弗吉尼亚北部)

    • 美国西部(俄勒冈)

    • 欧洲(爱尔兰)

  • 多可用区数据库集群仅支持预置 IOPS 存储。

  • 您无法将单可用区数据库实例部署或多可用区数据库实例部署更改为多可用区数据库集群。作为替代方法,您可以将单可用区数据库实例部署或多可用区数据库实例部署的快照还原为多可用区数据库集群。

  • 您无法将多可用区数据库集群快照还原为多可用区数据库实例部署或单可用区部署。

  • 多可用区数据库集群不支持在数据库实例级别进行修改,因为所有修改都是在数据库集群级别完成的。

  • 多可用区数据库集群不支持以下功能:

    • Amazon RDS 代理

    • Amazon Backup

    • Amazon CloudFormation

    • 将多可用区数据库集群快照数据导出到 Amazon S3 存储桶

    • IAM 数据库身份验证

    • Kerberos 身份验证

    • 与 Amazon Secrets Manager 集成

    • 修改端口

      作为替代方法,您可以将多可用区数据库集群还原到某个时间点并指定其他端口。

    • 选项组

    • 只读副本

    • 预留数据库实例

    • 从 Amazon S3 存储桶还原多可用区数据库集群快照

    • 通过设置最大分配的存储空间来执行存储弹性伸缩

      作为替代方法,您可以手动扩展存储。

    • 停止并启动数据库集群。

  • RDS for MySQL 多可用区数据库集群不支持复制到外部目标数据库。

  • RDS for MySQL 多可用区数据库集群仅支持以下系统存储过程:

    • mysql.rds_rotate_general_log

    • mysql.rds_rotate_slow_log

    • mysql.rds_show_configuration

    RDS for MySQL 多可用区数据库集群不支持其他系统存储过程。有关这些过程的信息,请参阅 Amazon RDS SQL 上的 MySQL 参考

  • RDS for PostgreSQL 多可用区数据库集群不支持以下 PostgreSQL 扩展:aws_s3pg_transportpglogical

  • RDS for PostgreSQL 多可用区数据库集群不支持使用自定义 DNS 服务器进行出站网络访问。

  • RDS for PostgreSQL 多可用区数据库集群的 RDS 不支持逻辑复制。