在 Aurora PostgreSQL 全局数据库中使用写入转发
主题
- Aurora PostgreSQL 中写入转发的区域和版本可用性
- 在 Aurora PostgreSQL 中启用写入转发
- 检查辅助集群是否在 Aurora PostgreSQL 中启用了写入转发
- 应用程序和 SQL 与 Aurora PostgreSQL 中写入转发的兼容性
- Aurora PostgreSQL 中写入转发的隔离和一致性
- 具有写入转发的事务访问模式
- 使用 Aurora PostgreSQL 中的写入转发运行多部分语句
- Aurora PostgreSQL 中写入转发的配置参数
- Aurora PostgreSQL 中写入转发的 Amazon CloudWatch 指标
- 在 Aurora PostgreSQL 中使用写入转发的等待事件
Aurora PostgreSQL 中写入转发的区域和版本可用性
在 Aurora PostgreSQL 版本 16 及更高的主要版本中,所有次要版本都支持全局写入转发。对于更早的 Aurora PostgreSQL 版本,版本 15.4 及更高的次要版本和版本 14.9 及更高的次要版本支持全局写入转发。写入转发在提供基于 Aurora PostgreSQL 的全局数据库的每个 AWS 区域均可用。
有关 Aurora PostgreSQL 全局数据库的版本和区域可用性的更多信息,请参阅使用 Aurora PostgreSQL 的 Aurora 全局数据库。
在 Aurora PostgreSQL 中启用写入转发
默认情况下,在将辅助集群添加到 Aurora 全局数据库时不启用写入转发。您可以在创建辅助数据库集群时或创建后的任何时候为其启用写入转发。如果需要,您可以稍后将其禁用。启用或禁用写入转发不会导致停机或重启。
注意
对于偶尔写入且要求先写后读一致性(即能够读取事务中的最新写入内容)的应用程序,您可以使用本地写入转发。
在控制台中,您可以在创建或修改辅助数据库集群时启用或禁用写入转发。
创建辅助数据库集群时启用或禁用写入转发
创建新的辅助数据库集群时,您可以通过选中只读副本写入转发下方的开启全局写入转发复选框来启用写入转发。或者清除复选框即可将其禁用。要创建辅助数据库集群,请按 创建 Amazon Aurora 数据库集群 中数据库引擎的说明操作。
以下屏幕截图显示已选中开启全局写入转发复选框的只读副本写入转发部分。
修改辅助数据库集群时启用或禁用写入转发
在控制台中,您可以修改辅助数据库集群以启用或禁用写入转发。
使用控制台为辅助数据库集群启用或禁用写入转发
登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 -
选择数据库。
-
选择辅助数据库集群,然后选择修改。
-
在只读副本写入转发部分,选中或清除开启全局写入转发复选框。
-
选择继续。
-
对于计划修改,选择立即应用。如果您选择在下一个计划的维护时段内应用,则 Aurora 将忽略此设置并立即开启写入转发。
-
选择修改集群。
要使用 AWS CLI 启用写入转发,请使用 --enable-global-write-forwarding
选项。当您使用 create-db-cluster 命令创建新的辅助集群时,此选项将起作用。当您使用 modify-db-cluster 命令修改现有辅助集群时,它也可以起作用。它要求全局数据库使用支持写入转发的 Aurora 版本。您可以结合这些相同的 CLI 命令使用 --no-enable-global-write-forwarding
选项来禁用写入转发。
以下过程介绍如何使用 AWS CLI 为全局集群中的辅助数据库集群启用或禁用写入转发。
为现有辅助数据库集群启用或禁用写入转发
-
调用 modify-db-cluster AWS CLI 命令并提供以下值:
-
--db-cluster-identifier
– 数据库集群的名称。 -
--enable-global-write-forwarding
以打开或--no-enable-global-write-forwarding
以关闭。
以下示例为数据库集群
sample-secondary-db-cluster
启用写入转发。对于 Linux、macOS 或 Unix:
aws rds modify-db-cluster \ --db-cluster-identifier sample-secondary-db-cluster \ --enable-global-write-forwarding
对于 Windows:
aws rds modify-db-cluster ^ --db-cluster-identifier sample-secondary-db-cluster ^ --enable-global-write-forwarding
-
要使用 Amazon RDS API 启用写入转发,请将 EnableGlobalWriteForwarding
参数设置为 true
。当您使用 CreateDBCluster 操作创建新的辅助集群时,此参数起作用。当您使用 ModifyDBCluster 操作修改现有辅助集群时,它也起作用。它要求全局数据库使用支持写入转发的 Aurora 版本。您可以通过将 EnableGlobalWriteForwarding
参数设置为 false
来禁用写入转发。
检查辅助集群是否在 Aurora PostgreSQL 中启用了写入转发
要确定是否可以使用辅助集群中的写入转发,可以检查集群是否具有属性 "GlobalWriteForwardingStatus": "enabled"
。
在 AWS Management Console中,您可以在集群的详细信息页面的配置选项卡上看到 Read replica write forwarding
。要查看所有集群的全局写入转发设置的状态,请运行以下 AWS CLI 命令。
辅助集群显示值 "enabled"
或 "disabled"
,以指示写入转发是打开还是关闭。null
的值表示写入转发对该集群不可用。集群不是全局数据库的一部分,或者是主集群而不是辅助集群。如果写入转发处于打开或关闭的过程中,则该值也可能是 "enabling"
或 "disabling"
。
例
aws rds describe-db-clusters --query '*[].{DBClusterIdentifier:DBClusterIdentifier,GlobalWriteForwardingStatus:GlobalWriteForwardingStatus}' [ { "GlobalWriteForwardingStatus": "enabled", "DBClusterIdentifier": "aurora-write-forwarding-test-replica-1" }, { "GlobalWriteForwardingStatus": "disabled", "DBClusterIdentifier": "aurora-write-forwarding-test-replica-2" }, { "GlobalWriteForwardingStatus": null, "DBClusterIdentifier": "non-global-cluster" } ]
要查找启用了全局写入转发功能的所有辅助集群,请运行以下命令。此命令还会返回集群的读取器终端节点。在 Aurora Global Database 中使用从辅助集群到主集群的写入转发时,可以使用辅助集群的读取器端点。
例
aws rds describe-db-clusters --query 'DBClusters[].{DBClusterIdentifier:DBClusterIdentifier,GlobalWriteForwardingStatus:GlobalWriteForwardingStatus,ReaderEndpoint:ReaderEndpoint} | [?GlobalWriteForwardingStatus == `enabled`]' [ { "GlobalWriteForwardingStatus": "enabled", "ReaderEndpoint": "aurora-write-forwarding-test-replica-1.cluster-ro-cnpexample.us-west-2.rds.amazonaws.com", "DBClusterIdentifier": "aurora-write-forwarding-test-replica-1" } ]
应用程序和 SQL 与 Aurora PostgreSQL 中写入转发的兼容性
在具有写入转发的全局数据库中使用某些语句时,不允许这些语句或它们可能产生过时的结果。此外,不支持用户定义的函数和用户定义的过程。因此,默认情况下,辅助集群的 EnableGlobalWriteForwarding
设置处于关闭状态。在启用它之前,请检查以确保您的应用程序代码不受任何这些限制的影响。
您可以将以下类型的 SQL 语句与写入转发一起使用:
-
数据操作语言(DML)语句,如
INSERT
、DELETE
和UPDATE
。 -
SELECT FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE }
语句 -
PREPARE
和EXECUTE
语句 -
EXPLAIN
语句和此列表中语句
写入转发不支持以下类型的 SQL 语句:
-
数据定义语言(DDL)语句
-
ANALYZE
-
CLUSTER
-
COPY
-
游标 - 不支持游标,因此在使用写入转发之前,请务必将其关闭。
-
GRANT
|REVOKE
|REASSIGN OWNED
|SECURITY LABEL
-
LOCK
-
SAVEPOINT
语句 -
SELECT INTO
-
SET CONSTRAINTS
-
TRUNCATE
-
VACUUM
Aurora PostgreSQL 中写入转发的隔离和一致性
在使用写入转发的会话中,您可以使用 REPEATABLE READ
和 READ COMMITTED
隔离级别。但是,不支持 SERIALIZABLE
隔离级别。
您可以控制辅助集群上的读取一致性程度。读取一致性级别确定辅助集群在每次读取操作之前要等待多少时间,以确保从主集群复制某些或所有更改。您可以调整读取一致性级别,以确保会话中的所有转发的写入操作在辅助集群中可见,然后再进行任何后续查询。您还可以使用此设置来确保辅助集群上的查询始终看到主集群中的最新更新,即使是由其他会话或其他集群提交的更新。要为应用程序指定此类行为,请为会话级别参数 apg_write_forward.consistency_mode
选择一个合适的值。apg_write_forward.consistency_mode
参数仅对启用写入转发的辅助集群产生影响。
注意
对于 apg_write_forward.consistency_mode
参数,您可以指定值 SESSION
、EVENTUAL
、GLOBAL
和 OFF
。默认情况下, 值设为 SESSION
。将该值设置为 OFF
将在会话中禁用写入转发。
随着您提高一致性级别,您的应用程序会花更多时间等待在 AWS 区域之间传播更改。您可以在快速响应时间与确保在运行查询之前在其他位置进行的更改完全可用之间选择平衡。
对于每种可用的一致性模式设置,效果如下所示:
SESSION
– 辅助 AWS 区域中使用写入转发的所有查询都会看到在该会话中所做的所有更改的结果。无论事务是否已提交,这些更改都是可见的。如有必要,查询将等待转发的写入操作的结果复制到当前区域。它不会等待在其他区域或当前区域内的其他会话中执行的写入操作的更新结果。EVENTUAL
– 使用写入转发的辅助 AWS 区域中的查询可能会看到由于复制滞后而稍微过时的数据。在对主区域执行写入操作并将其复制到当前区域之前,看不到同一会话中写入操作的结果。查询不会等待更新的结果可用。因此,它可能会检索较旧的数据或更新的数据,具体取决于语句的时间和复制滞后量。GLOBAL
– 辅助 AWS 区域中的会话会看到该会话所做的更改。它还可以查看来自主 AWS 区域和其他辅助 AWS 区域的所有已提交的更改。每个查询可能会等待一段时间,该时间取决于会话滞后量。从查询开始时,辅助集群与来自主集群的所有已提交数据处于最新状态时,查询将继续进行。OFF
– 在会话中禁用写入转发。
有关写入转发涉及的所有参数的更多信息,请参阅 Aurora PostgreSQL 中写入转发的配置参数。
具有写入转发的事务访问模式
如果事务访问模式设置为只读,则不使用写入转发。在连接到启用了写入转发的数据库集群和会话时,可以将访问模式设置为只读写。
有关事务访问模式的更多信息,请参阅 SET TRANSACTION
使用 Aurora PostgreSQL 中的写入转发运行多部分语句
DML 语句可能由多个部分组成,如 INSERT ... SELECT
语句或 DELETE ... WHERE
语句。在这种情况下,整个语句将转发到主集群并在此处运行。
Aurora PostgreSQL 中写入转发的配置参数
Aurora 集群参数组包含写入转发特征的设置。由于这些是集群参数,因此每个集群中的所有数据库实例对于这些变量具有相同的值。下表汇总了有关这些参数的详细信息,表后附有使用说明。
名称 | 范围 | 类型 | 默认值 | 有效值 |
---|---|---|---|---|
apg_write_forward.connect_timeout
|
会话 | 秒 | 30 | 0–2147483647 |
apg_write_forward.consistency_mode |
Session | enum | 会话 |
SESSION , EVENTUAL , GLOBAL , OFF
|
apg_write_forward.idle_in_transaction_session_timeout
|
会话 | 毫秒 | 86400000 | 0–2147483647 |
apg_write_forward.idle_session_timeout
|
会话 | 毫秒 | 300000 | 0–2147483647 |
apg_write_forward.max_forwarding_connections_percent
|
全局 | int | 25 | 1–100 |
apg_write_forward.max_forwarding_connections_percent
参数是可以用于处理从读取器转发的查询的数据库连接插槽上限。它表示为主集群中写入器数据库实例的 max_connections
设置的百分比。例如,如果 max_connections
是 800
,而 apg_write_forward.max_forwarding_connections_percent
是 10
,则写入器最多允许 80 个同时转发会话。这些连接来自由 max_connections
设置管理的同一连接池。当至少一个辅助集群启用了写入转发时,此设置仅适用于主集群。
在辅助集群上使用以下设置:
-
apg_write_forward.consistency_mode
– 会话级参数,用于控制辅助集群上的读取一致性程度。有效值为SESSION
、EVENTUAL
、GLOBAL
或OFF
。默认情况下, 值设为SESSION
。将该值设置为OFF
将在会话中禁用写入转发。要了解有关一致性级别的更多信息,请参阅Aurora PostgreSQL 中写入转发的隔离和一致性。此参数仅适用于启用了写入转发且位于 Aurora 全局数据库中的辅助集群的读取器实例。 apg_write_forward.connect_timeout
– 辅助集群在与主集群建立连接时在放弃之前等待的最大秒数。值0
表示无限期等待。apg_write_forward.idle_in_transaction_session_timeout
– 主集群在关闭从具有未处理事务的辅助集群转发的连接之前等待活动的毫秒数。如果在此段时间之后,会话在事务中仍处于空闲状态,则 Aurora 会终止会话。0
值禁用超时。apg_write_forward.idle_session_timeout
– 主集群在关闭从辅助集群转发的连接之前等待活动的毫秒数。如果会话在这段时间之后仍处于空闲状态,则 Aurora 会终止会话。值0
禁用超时。
Aurora PostgreSQL 中写入转发的 Amazon CloudWatch 指标
在一个或多个辅助集群上使用写入转发时,以下 Amazon CloudWatch 指标适用于主集群。这些指标均在主集群中的写入器数据库实例上进行测量。
CloudWatch 指标 | 单位和描述 |
---|---|
|
计数(每秒)。此写入器数据库实例每秒处理的转发 DML 语句数。 |
|
计数。此写入器数据库实例上处理转发查询的打开会话数。 |
|
计数。此写入器数据库实例上的转发会话总数。 |
以下 CloudWatch 指标适用于每个辅助集群。这些指标在启用写入转发的辅助集群中的每个读取器数据库实例上进行测量。
CloudWatch 指标 | 单位和描述 |
---|---|
|
计数(每秒)。此副本每秒转发的会话中的提交数。 |
|
毫秒。副本上转发 DML 的平均响应时间(以毫秒为单位)。 |
|
计数(每秒)。此副本每秒处理的转发 DML 语句数。 |
|
计数。由于达到最大连接数或最大写入转发连接数限制而被主集群拒绝的会话数。 |
|
计数。在副本实例上使用写入转发的会话数。 |
|
毫秒。副本等待与主集群 LSN 一致的平均等待时间(以毫秒为单位)。读取器数据库实例等待的程度取决于 apg_write_forward.consistency_mode 设置。有关该设置的信息,请参阅 Aurora PostgreSQL 中写入转发的配置参数。 |
在 Aurora PostgreSQL 中使用写入转发的等待事件
当您在 Aurora PostgreSQL 中使用写入转发时,Amazon Aurora 会生成以下等待事件。
主题
IPC:AuroraWriteForwardConnect
当辅助数据库集群上的后端进程在等待开启与主数据库集群写入器节点的连接时,就会发生该 IPC:AuroraWriteForwardConnect
事件。
等待次数增加的可能原因
随着尝试从辅助区域读取器节点连接到主数据库集群写入器节点的次数不断增加,此事件也会增加。
操作
减少从辅助节点到主区域写入器节点的同时连接数量。
IPC:AuroraWriteForwardConsistencyPoint
该 IPC:AuroraWriteForwardConsistencyPoint
事件描述在将转发写入操作的结果复制到当前区域之前,来自辅助数据库集群上节点的查询将等待的时间。仅当会话级别的参数 apg_write_forward.consistency_mode
设置为以下项之一时,才会生成此事件:
SESSION
– 辅助节点上的查询等待在该会话中所做的所有更改的结果。GLOBAL
– 辅助节点上的查询等待该会话中所做更改以及全局集群中主区域和其它辅助区域中已提交的所有更改的结果。
有关 apg_write_forward.consistency_mode
参数设置的更多信息,请参阅 Aurora PostgreSQL 中写入转发的配置参数。
等待次数增加的可能原因
等待时间较长的常见原因包括以下几点:
副本滞后延长,如 Amazon CloudWatch
ReplicaLag
指标所衡量。有关该指标的更多信息,请参阅监控 Aurora PostgreSQL 复制。增加了主区域写入器节点或辅助节点上的负载。
操作
根据应用程序的要求更改一致性模式。
IPC:AuroraWriteForwardExecute
当辅助数据库集群上的后端进程在等待转发查询完成并从主数据库集群写入器节点获取结果时,就会发生该 IPC:AuroraWriteForwardExecute
事件。
等待次数增加的可能原因
等待次数增加的常见原因包括以下几点:
从主区域的写入器节点获取大量行。
辅助节点和主区域写入器节点之间的网络延迟增加会增加辅助节点从写入器节点获得数据所花费的时间。
辅助节点的负载增加可能会延迟从辅助节点向主区域写入器节点传输查询请求的时间。
主区域写入器节点负载的增加可能会延迟从写入器节点向辅助节点传输数据的时间。
操作
根据等待事件的原因,我们建议采取不同的操作。
优化查询以仅检索必要的数据。
优化数据操纵语言(DML)操作,使其仅修改必要数据。
如果辅助节点或主区域写入器节点受到 CPU 或网络带宽的限制,请考虑将其更改为具有更大 CPU 容量或更多网络带宽的实例类型。
IPC:AuroraWriteForwardGetGlobalConsistencyPoint
当使用 GLOBAL 一致性模式的辅助数据库集群上的后端进程在执行查询之前等待从写入器节点获取全局一致性点时,就会发生该 IPC:AuroraWriteForwardGetGlobalConsistencyPoint
事件。
等待次数增加的可能原因
等待次数增加的常见原因包括以下几点:
辅助节点和主区域写入器节点之间的网络延迟增加会增加辅助节点从写入器节点获得数据所花费的时间。
辅助节点的负载增加可能会延迟从辅助节点向主区域写入器节点传输查询请求的时间。
主区域写入器节点负载的增加可能会延迟从写入器节点向辅助节点传输数据的时间。
操作
根据等待事件的原因,我们建议采取不同的操作。
根据应用程序的要求更改一致性模式。
如果辅助节点或主区域写入器节点受到 CPU 或网络带宽的限制,请考虑将其更改为具有更大 CPU 容量或更多网络带宽的实例类型。
IPC:AuroraWriteForwardXactAbort
当辅助数据库集群上的后端进程在等待远程清理查询的结果时,就会发生该 IPC:AuroraWriteForwardXactAbort
事件。在写入转发的事务中止后,会发出清理查询,以将进程恢复到适当的状态。Amazon Aurora 之所以执行这些操作,要么是因为发现了错误,要么是因为用户发出了明确的 ABORT
命令或取消了正在运行的查询。
等待次数增加的可能原因
等待次数增加的常见原因包括以下几点:
辅助节点和主区域写入器节点之间的网络延迟增加会增加辅助节点从写入器节点获得数据所花费的时间。
辅助节点的负载增加可能会延迟从辅助节点向主区域写入器节点传输清理查询请求的时间。
主区域写入器节点负载的增加可能会延迟从写入器节点向辅助节点传输数据的时间。
操作
根据等待事件的原因,我们建议采取不同的操作。
调查事务中止的原因。
如果辅助节点或主区域写入器节点受到 CPU 或网络带宽的限制,请考虑将其更改为具有更大 CPU 容量或更多网络带宽的实例类型。
IPC:AuroraWriteForwardXactCommit
当辅助数据库集群上的后端进程在等待转发提交事务命令的结果时,就会发生该 IPC:AuroraWriteForwardXactCommit
事件。
等待次数增加的可能原因
等待次数增加的常见原因包括以下几点:
辅助节点和主区域写入器节点之间的网络延迟增加会增加辅助节点从写入器节点获得数据所花费的时间。
辅助节点的负载增加可能会延迟从辅助节点向主区域写入器节点传输查询请求的时间。
主区域写入器节点负载的增加可能会延迟从写入器节点向辅助节点传输数据的时间。
操作
如果辅助节点或主区域写入器节点受到 CPU 或网络带宽的限制,请考虑将其更改为具有更大 CPU 容量或更多网络带宽的实例类型。
IPC:AuroraWriteForwardXactStart
当辅助数据库集群上的后端进程在等待转发开始事务命令的结果时,就会发生该 IPC:AuroraWriteForwardXactStart
事件。
等待次数增加的可能原因
等待次数增加的常见原因包括以下几点:
辅助节点和主区域写入器节点之间的网络延迟增加会增加辅助节点从写入器节点获得数据所花费的时间。
辅助节点的负载增加可能会延迟从辅助节点向主区域写入器节点传输查询请求的时间。
主区域写入器节点负载的增加可能会延迟从写入器节点向辅助节点传输数据的时间。
操作
如果辅助节点或主区域写入器节点受到 CPU 或网络带宽的限制,请考虑将其更改为具有更大 CPU 容量或更多网络带宽的实例类型。