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

多可用区数据库集群部署

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

您可以使用 将数据导入到停机时间更少的 Amazon RDS MariaDB 或 MySQL 实例 中的说明将本地数据库中的数据导入到多可用区数据库集群。

您可以为多可用区数据库集群购买预留数据库实例。有关更多信息,请参阅多可用区数据库集群的预留数据库实例

特征可用性和支持因每个数据库引擎的特定版本以及 Amazon Web Services 区域而异。有关使用多可用区数据库集群的 Amazon RDS 的版本和区域可用性的更多信息,请参阅多可用区数据库集群

重要

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

实例类可用性

以下数据库实例类支持多可用区数据库集群部署:db.m5ddb.m6gdm6iddb.m6idndb.r5ddb.r6gddb.x2iedndb.r6iddb.r6idn

有关数据库实例类的更多信息,请参阅 数据库实例类

多可用区数据库集群概览

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

多可用区数据库集群部署使用半同步复制,这需要来自至少一个读取器数据库实例的确认才能提交更改。它不需要确认事件已在所有副本上完全执行和提交。

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

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


				多可用区数据库集群

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

重要

为防止 RDS for MySQL 多可用区数据库集群出现复制错误,我们强烈建议所有表都具有主键。

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

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

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

  • 只有当外部 MySQL 源启用了 GTID 时,RDS for MySQL 多可用区数据库集群才支持从该源进行复制。有关更多信息,请参阅mysql.rds_set_external_master_with_auto_position。不支持基于位置的二进制日志复制。

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

    • 支持 IPv6 连接(双堆栈模式)

    • 跨区域自动备份

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

    • IAM 数据库身份验证

    • Kerberos 身份验证

    • 修改端口

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

    • 选项组

    • 已删除的集群的时间点故障恢复(PITR)

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

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

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

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

    • 复制多可用区数据库集群的快照

    • 加密未加密的多可用区数据库集群

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

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

    • mysql.rds_rotate_general_log

    • mysql.rds_rotate_slow_log

    • mysql.rds_show_configuration

    • mysql.rds_set_external_master_with_auto_position

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

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

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

使用 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 RDS 提供每个支持的数据库引擎的更高版本,因此,您可以使多可用区数据库集群保持最新。当 Amazon RDS 支持数据库引擎的新版本时,您可以选择如何以及何时升级您的多可用区数据库集群。

您可以执行两种升级:

主要版本升级

主要引擎版本升级 可能引入与现有应用程序不兼容的更改。当您启动主要版本升级时,Amazon RDS 会同时升级写入器和读取器实例。因此,在升级完成之前,数据库集群可能不可用。

次要版本升级

次要版本升级 仅包含与现有应用程序向后兼容的更改。当您启动次要版本升级时,Amazon RDS 首先一次升级一个读取器数据库实例。然后,其中一个读取器数据库实例将切换为新的写入器数据库实例。然后,Amazon RDS 升级旧的写入器实例(现在是读取器实例)。

升级期间的停机时间限于其中一个读取器数据库实例变为新写入器数据库实例所花费的时间。这一停机时间就像自动失效转移一样。有关更多信息,请参阅多可用区数据库集群的故障转移流程。请注意,多可用区数据库集群的副本滞后可能会影响停机时间。有关更多信息,请参阅副本滞后和多可用区数据库集群

对于 RDS for PostgreSQL 多可用区数据库集群只读副本,Amazon RDS 一次升级一个集群成员实例。升级期间,读取器和写入器集群角色不会切换。因此,在 Amazon RDS 升级集群写入器实例时,数据库集群可能会出现停机。

注意

多可用区数据库集群次要版本升级的停机时间通常为 35 秒。与 RDS 代理一起使用时,您可以将停机时间进一步缩短到一秒或更短。有关更多信息,请参阅将 Amazon RDS 代理。或者,您可以使用开源数据库代理,例如 ProxySQLPgBouncer适用于 MySQL 的 Amazon JDBC 驱动程序

目前,Amazon RDS 仅对于 RDS for PostgreSQL 多可用区数据库集群支持主要版本升级。Amazon RDS 对于所有支持多可用区数据库集群的数据库引擎支持次要版本升级。

Amazon RDS 不会自动升级多可用区数据库集群只读副本。对于次要版本升级,必须先手动升级所有只读副本,然后升级集群。否则,升级将被阻止。当您执行集群的主要版本升级时,所有只读副本的复制状态将更改为终止。升级完成后,您必须删除并重新创建只读副本。有关更多信息,请参阅监控只读复制

升级多可用区数据库集群的引擎版本的过程与升级数据库实例引擎版本的过程相同。有关说明,请参阅升级数据库实例引擎版本。唯一的区别是,当使用 Amazon Command Line Interface(Amazon CLI)时,您使用 modify-db-cluster 命令并指定 --db-cluster-identifier 参数(以及 --allow-major-version-upgrade 参数)。

有关主要版本升级和次要版本升级的更多信息,请参阅数据库引擎的以下文档:

将 RDS 代理用于多可用区数据库集群

您可以使用 Amazon RDS 代理为您的多可用区数据库集群创建代理。通过使用 RDS 代理,您的应用程序可以池化和共享数据库连接,以提高其扩展能力。每个代理都执行连接多路复用,也称为连接重用。对于多路复用,RDS 代理使用一个底层数据库连接对事务执行所有操作。RDS 代理还可以将多可用区数据库集群的次要版本升级的停机时间缩短到一秒或更短。有关 RDS 代理优点的更多信息,请参阅 将 Amazon RDS 代理

要为多可用区数据库集群设置代理,请在创建集群时选择创建 RDS 代理。有关创建和管理 RDS 代理端点的说明,请参阅 使用 Amazon RDS Proxy 终端节点

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

副本滞后是写入器数据库实例上的最新事务与读取器数据库实例上的最新应用事务之间的时间差异。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 会自动处理故障转移,因此,您可以尽快恢复数据库操作而无需管理干预。要进行故障转移,写入器数据库实例将自动切换到读取器数据库实例。

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

如果您手动对多可用区数据库集群执行失效转移,RDS 将首先终止主数据库实例。然后,内部监控系统检测到主数据库实例运行状况不佳,并提升可读副本数据库实例。故障转移时间通常低于 35 秒。

您可以使用 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(故障转移)。

    此时将会显示失效转移数据库集群页面。

  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");