

# PostgreSQL 只读副本配置
<a name="USER_PostgreSQL.Replication.ReadReplicas.Configuration"></a>

RDS for PostgreSQL 使用 PostgreSQL 本机流式复制来创建源数据库实例的只读副本。此只读副本数据库实例是源数据库实例的异步创建的物理副本。该副本是通过在源数据库实例和只读副本之间传输预写日志（WAL）数据的特殊连接创建。有关更多信息，请参阅 PostgreSQL 文档中的[流式复制](https://www.postgresql.org/docs/14/warm-standby.html#STREAMING-REPLICATION)。

在源数据库实例上进行更改时，PostgreSQL 会通过此安全连接异步流式传输数据库更改。您可以通过将 `ssl` 参数设置为 `1`，来加密从客户端应用程序到源数据库实例或任何只读副本的通信。有关更多信息，请参阅 [将 SSL 与 PostgreSQL 数据库实例结合使用](PostgreSQL.Concepts.General.SSL.md)。

PostgreSQL 使用*复制*角色执行流式复制。该角色拥有特权，但不能用于修改任何数据。PostgreSQL 使用处理复制的单个过程。

您可以在不影响源数据库实例的操作或用户的情况下创建 PostgreSQL 只读副本。Amazon RDS 为您在源数据库实例和只读副本上设置必要的参数和权限，而不会影响服务。为源数据库实例拍摄快照，该快照用于创建只读副本。如果您在将来某个时间点删除只读副本，则不会发生中断。

您可以从同一区域内的一个源数据库实例创建最多 15 个只读副本。自 RDS for PostgreSQL 14.1 起，您还可以从源数据库实例在链（级联）中创建最多三个级别的只读副本。有关更多信息，请参阅 [将级联只读副本用于 RDS for PostgreSQL](USER_PostgreSQL.Replication.ReadReplicas.Cascading.md)。在所有情况下，源数据库实例都需要配置自动备份。为此，您可以将数据库实例上的备份保留期设置为非 0 值。有关更多信息，请参阅 [创建只读副本](USER_ReadRepl.Create.md)。

您可以在与源数据库实例相同的 AWS 区域中为您的 RDS for PostgreSQL 数据库实例创建只读副本。这称为*区域内*复制。您还可以在与源数据库实例不同的 AWS 区域中创建只读副本。这称为*跨区域*复制。有关设置跨区域只读副本的更多信息，请参阅[在不同的 中创建只读副本AWS 区域](USER_ReadRepl.XRgn.md)。根据 RDS for PostgreSQL 版本，支持区域内和跨区域复制过程的各种机制略有不同，如[流式复制如何适用于不同的 RDS for PostgreSQL 版本](USER_PostgreSQL.Replication.ReadReplicas.Mechanisms-versions.md)中所述。

为了有效地进行复制，每个只读副本具有的计算和存储资源的量应与源数据库实例的一样多。如果扩展源数据库实例，则还应确保扩展只读副本。

如果 Amazon RDS 从一开始就阻止只读副本，它将覆盖只读副本上的任何不兼容参数。例如，假定源数据库实例上的 `max_connections` 参数值高于只读副本上的此参数值。在这种情况下，Amazon RDS 将只读副本上的参数更新为与源数据库实例上的参数相同的值。

RDS for PostgreSQL 只读副本可以访问通过源数据库实例上的外部数据包装器（FDW）提供的外部数据库。例如，假设您的 RDS for PostgreSQL 数据库实例使用 `mysql_fdw` 包装器从 RDS for MySQL 访问数据。如果是这样，只读副本也可以访问该数据。其他支持的 FDW 包括 `oracle_fdw`、`postgres_fdw` 和 `tds_fdw`。有关更多信息，请参阅 [使用 Amazon RDS for PostgreSQL 支持的外部数据包装器](Appendix.PostgreSQL.CommonDBATasks.Extensions.foreign-data-wrappers.md)。

## 将 RDS for PostgreSQL 只读副本用于多可用区配置
<a name="USER_PostgreSQL.Replication.ReadReplicas.Configuration.multi-az"></a>

您可从单可用区或多可用区数据库实例中创建只读副本。您可以借助备用副本，使用多可用区部署提高关键数据的持久性和可用性。*备用副本*是专用的只读副本，可以在源数据库发生故障转移时承担工作负载。您不能使用备用副本来提供读取流量。但是，可以从大流量、多可用区数据库实例创建只读副本以分流只读查询的负载。要了解关于多可用区部署的更多信息，请参阅 [Amazon RDS 的多可用区数据库实例部署](Concepts.MultiAZSingleStandby.md)。

如果多可用区部署的源数据库实例故障转移到备用可用区，则关联的只读副本将切换为使用备用可用区（现在为主可用区）作为其复制源。只读副本可能需要重新启动，具体取决于 RDS for PostgreSQL 版本，如下所示：
+ **PostgreSQL 13 及更高版本** – 不需要重新启动。只读副本将自动与新的主副本同步。但是，在某些情况下，您的客户端应用程序可能会缓存只读副本的域名服务（DNS）详细信息。如果是这样，请将生存时间（TTL）值设置为小于 30 秒。这样做可以防止只读副本继续留在陈旧的 IP 地址（因此可以防止它与新的主副本同步）。要了解有关此用法和其他最佳实践的更多信息，请参阅[Amazon RDS 基本操作指导方针](CHAP_BestPractices.md#CHAP_BestPractices.DiskPerformance)。
+ **PostgreSQL 12 和所有早期版本** – 只读副本在故障转移到备用副本后自动重新启动，因为备用副本（现为主）具有不同的 IP 地址和不同的实例名称。重启操作会将只读副本与新的主副本同步。

要详细了解失效转移，请参阅[对 Amazon RDS 的多可用区数据库实例执行失效转移](Concepts.MultiAZ.Failover.md)。要了解关于只读副本如何在多可用区部署中工作的更多信息，请参阅 [使用数据库实例只读副本](USER_ReadRepl.md)。

要为只读副本提供失效转移支持，您可以将只读副本创建为多可用区数据库实例，以便 Amazon RDS 在另一个可用区（AZ）中创建备用副本。创建您的只读副本作为多可用区数据库实例与源数据库是否为多可用区数据库实例无关。