

# 通过 Aurora PostgreSQL 的集群缓存管理提供故障转移后的快速恢复
<a name="AuroraPostgreSQL.cluster-cache-mgmt"></a>

要快速恢复 Aurora PostgreSQL 集群中的写入器数据库实例（如果进行了故障转移），请使用 Amazon Aurora PostgreSQL 的集群缓存管理。集群缓存管理可以确保在进行故障转移时保持应用程序的性能。

在典型的故障转移情况下，您可能会在故障转移后看到暂时的但很明显的性能下降。发生性能下降，是因为当故障转移数据库实例启动时，缓冲区缓存是空的。空缓存也称为*冷缓存*。冷缓存会降低性能，是因为数据库实例必须从更慢的磁盘读取，而不是利用缓冲区缓存中存储的值。

通过集群缓存管理，您将特定的读取器数据库实例设置为故障转移目标。集群缓存管理可以确保指定读取器缓存中的数据与写入器数据库实例缓存中的数据保持同步。预填充值的指定读取器缓存也称为*热缓存*。如果发生故障转移，在提升为新写入器数据库实例时，指定读取器将立即使用其热缓存中的值。这种方法会为您的应用程序提供好很多的恢复性能。

集群缓存管理要求指定的读取器实例具有与写入器相同类型和大小的实例类（例如 `db.r5.2xlarge` 或 `db.r5.xlarge`）。创建 Aurora PostgreSQL 数据库集群时请记住这一点，以便集群可以在故障转移期间恢复。有关实例类的类型和大小列表，请参阅[适用于 Aurora 的数据库实例类的硬件规格](https://docs.amazonaws.cn/AmazonRDS/latest/AuroraUserGuide/Concepts.DBInstanceClass.html#Concepts.DBInstanceClass.Summary)。

**注意**  
作为 Aurora Global Database 一部分的 Aurora PostgreSQL 辅助数据库集群不支持集群缓存管理。对于支持此功能的主集群，建议不要在指定的第 0 层读取器上运行任何工作负载。

**Contents**
+ [配置集群缓存管理](#AuroraPostgreSQL.cluster-cache-mgmt.Configure)
  + [启用集群缓存管理](#AuroraPostgreSQL.cluster-cache-mgmt.Enable)
  + [为写入器数据库实例设置提升层优先级](#AuroraPostgreSQL.cluster-cache-mgmt.Writer)
  + [为读取器数据库实例设置提升层优先级](#AuroraPostgreSQL.cluster-cache-mgmt.Reader)
+ [监控缓冲区缓存](#AuroraPostgreSQL.cluster-cache-mgmt.Monitoring)
+ [排查 CCM 配置问题](#AuroraPostgreSQL.cluster-cache-mgmt.Troubleshooting)

## 配置集群缓存管理
<a name="AuroraPostgreSQL.cluster-cache-mgmt.Configure"></a>

要配置集群缓存管理，请按顺序执行以下过程。

**Topics**
+ [启用集群缓存管理](#AuroraPostgreSQL.cluster-cache-mgmt.Enable)
+ [为写入器数据库实例设置提升层优先级](#AuroraPostgreSQL.cluster-cache-mgmt.Writer)
+ [为读取器数据库实例设置提升层优先级](#AuroraPostgreSQL.cluster-cache-mgmt.Reader)

**注意**  
完成这些步骤后，至少需要 1 分钟才能使集群缓存管理完全正常运行。

### 启用集群缓存管理
<a name="AuroraPostgreSQL.cluster-cache-mgmt.Enable"></a>

要启用集群缓存管理，请执行以下描述的步骤。

#### 控制台
<a name="AuroraPostgreSQL.cluster-cache-mgmt.Enable.CON"></a>

**启用集群缓存管理**

1. 登录Amazon Web Services 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.amazonaws.cn/rds/)。

1. 在导航窗格中，选择**参数组**。

1. 在列表中，为您的 Aurora PostgreSQL 数据库集群选择参数组。

   数据库集群必须使用默认参数组以外的参数组，因为您无法更改默认参数组中的值。

1. 对于 **Parameter group actions (参数组操作)**，选择 **Edit (编辑)**。

1. 将 `apg_ccm_enabled` 集群参数的值设置为 **1**。

1. 选择**保存更改**。

#### Amazon CLI
<a name="AuroraPostgreSQL.cluster-cache-mgmt.Enable.CLI"></a>

要为 Aurora PostgreSQL 数据库集群启用集群缓存管理，请使用包含以下必要参数的 Amazon CLI [https://docs.amazonaws.cn/cli/latest/reference/rds/modify-db-cluster-parameter-group.html](https://docs.amazonaws.cn/cli/latest/reference/rds/modify-db-cluster-parameter-group.html) 命令：
+ `--db-cluster-parameter-group-name`
+ `--parameters`

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds modify-db-cluster-parameter-group \
    --db-cluster-parameter-group-name my-db-cluster-parameter-group \
    --parameters "ParameterName=apg_ccm_enabled,ParameterValue=1,ApplyMethod=immediate"
```
对于：Windows  

```
aws rds modify-db-cluster-parameter-group ^
    --db-cluster-parameter-group-name my-db-cluster-parameter-group ^
    --parameters "ParameterName=apg_ccm_enabled,ParameterValue=1,ApplyMethod=immediate"
```

### 为写入器数据库实例设置提升层优先级
<a name="AuroraPostgreSQL.cluster-cache-mgmt.Writer"></a>

要进行集群缓存管理，请确保 Aurora PostgreSQL 数据库集群的写入器数据库实例的提升优先级为 **0 层**。*提升层优先级* 是指定在发生故障后将 Aurora 读取器提升为写入器数据库实例的顺序。有效值为 0–15，0 是第一个优先级，15 是最后一个。有关提升层的更多信息，请参阅 [Aurora 数据库集群的容错能力](Concepts.AuroraHighAvailability.md#Aurora.Managing.FaultTolerance)。

#### 控制台
<a name="AuroraPostgreSQL.cluster-cache-mgmt.Writer.Console"></a>

**将写入器数据库实例的提升优先级设置为“0 层”**

1. 登录Amazon Web Services 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.amazonaws.cn/rds/)。

1. 在导航窗格中，选择 **Databases (数据库)**。

1. 选择 Aurora PostgreSQL 数据库集群的**写入器**数据库实例。

1. 选择**修改**。将显示 **Modify DB Instance (修改数据库实例)** 页面。

1. 在**其他配置**面板上，选择**第 0 层**作为**故障转移优先级**。

1. 选择**继续**，查看修改摘要。

1. 要在保存更改后立即应用这些更改，请选择 **Apply immediately (立即应用)**。

1. 选择**修改数据库实例**以保存更改。

#### Amazon CLI
<a name="AuroraPostgreSQL.cluster-cache-mgmt.Writer.CLI"></a>

要使用 Amazon CLI 将写入器数据库实例的提升层优先级设置为 0，请调用包含以下必需参数的 [modify-db-instance](https://docs.amazonaws.cn/cli/latest/reference/rds/modify-db-instance.html) 命令：
+ `--db-instance-identifier`
+ `--promotion-tier`
+ `--apply-immediately`



**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds modify-db-instance \
    --db-instance-identifier writer-db-instance \
    --promotion-tier 0 \
    --apply-immediately
```
对于：Windows  

```
aws rds modify-db-instance ^
    --db-instance-identifier writer-db-instance ^
    ---promotion-tier 0  ^
    --apply-immediately
```

 

### 为读取器数据库实例设置提升层优先级
<a name="AuroraPostgreSQL.cluster-cache-mgmt.Reader"></a>

您必须仅设置一个读取器数据库实例来进行集群缓存管理。要执行此操作，请从实例类和大小与写入器数据库实例相同的 Aurora PostgreSQL 集群选择读取器。例如，如果写入器使用 `db.r5.xlarge`，请选择使用相同类型和大小的实例类的读取器。然后，将其提升层优先级设置为 0。

*提升层优先级* 是指定在发生故障后将 Aurora 读取器提升为写入器数据库实例的顺序。有效值为 0-15，0 是第一优先级，15 是最后一个。

#### 控制台
<a name="AuroraPostgreSQL.cluster-cache-mgmt.Reader.Console"></a>

**将读取器数据库实例的提升优先级设置为“0 层”**

1. 登录Amazon Web Services 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.amazonaws.cn/rds/)。

1. 在导航窗格中，选择 **Databases (数据库)**。

1. 选择实例类与写入器数据库实例相同的 Aurora PostgreSQL 数据库集群的 **Reader (读取器)** 数据库实例。

1. 选择**修改**。将显示 **Modify DB Instance (修改数据库实例)** 页面。

1. 在**其他配置**面板上，选择**第 0 层**作为**故障转移优先级**。

1. 选择**继续**，查看修改摘要。

1. 要在保存更改后立即应用这些更改，请选择 **Apply immediately (立即应用)**。

1. 选择**修改数据库实例**以保存更改。

#### Amazon CLI
<a name="AuroraPostgreSQL.cluster-cache-mgmt.Reader.CLI"></a>

要使用 Amazon CLI 将读取器数据库实例的提升层优先级设置为 0，请调用包含以下必需参数的 [modify-db-instance](https://docs.amazonaws.cn/cli/latest/reference/rds/modify-db-instance.html) 命令：
+ `--db-instance-identifier`
+ `--promotion-tier`
+ `--apply-immediately`



**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds modify-db-instance \
    --db-instance-identifier reader-db-instance \
    --promotion-tier 0 \
    --apply-immediately
```
对于：Windows  

```
aws rds modify-db-instance ^
    --db-instance-identifier reader-db-instance ^
    ---promotion-tier 0  ^
    --apply-immediately
```

 

## 监控缓冲区缓存
<a name="AuroraPostgreSQL.cluster-cache-mgmt.Monitoring"></a>

在设置集群缓存管理后，您可以监控写入器数据库实例的缓冲区缓存与指定读取器的热缓冲区缓存之间的同步状态。要检查写入器数据库实例和指定读取器数据库实例上的缓冲区缓存内容，请使用 PostgreSQL `pg_buffercache` 模块。有关更多信息，请参阅 [PostgreSQL `pg_buffercache` 文档](https://www.postgresql.org/docs/current/pgbuffercache.html)。

**使用 `aurora_ccm_status` 函数**  
集群缓存管理还提供 `aurora_ccm_status` 函数。在写入器数据库实例上使用 `aurora_ccm_status` 函数可以获取以下有关指定读取器上的缓存预热的进度的信息：
+ `buffers_sent_last_minute` – 在过去一分钟内，有多少缓冲区发送到指定读取器。
+ `buffers_found_last_minute` – 在过去一分钟内识别的频繁访问缓冲区的数量。
+ `buffers_sent_last_scan` – 在上次完整扫描缓冲区缓存期间，有多少缓冲区发送到了指定读取器。
+ `buffers_found_last_scan` – 有多少缓冲区被识别为经常访问，并需要在上一次完整扫描缓冲区缓存期间发送。已在指定读取器上缓存的缓冲区不会发送。
+ `buffers_sent_current_scan` – 在当前的扫描期间，到现在已经发送了多少缓冲区。
+ `buffers_found_current_scan` – 在当前的扫描中，有多少缓冲区被识别为经常访问。
+ `current_scan_progress` – 在当前的扫描期间，到现在有多少缓冲区已被访问。

以下示例演示如何使用 `aurora_ccm_status` 函数将其一部分输出转换为热速率和热百分比。

```
SELECT buffers_sent_last_minute*8/60 AS warm_rate_kbps, 
   100*(1.0-buffers_sent_last_scan::float/buffers_found_last_scan) AS warm_percent 
   FROM aurora_ccm_status();
```

## 排查 CCM 配置问题
<a name="AuroraPostgreSQL.cluster-cache-mgmt.Troubleshooting"></a>

 启用 `apg_ccm_enabled` 集群参数后，将在 Aurora PostgreSQL 数据库集群上的写入器数据库实例和一个读取器数据库实例上，以实例级别自动启用集群缓存管理。写入器和读取器实例应使用相同的实例类类型和大小。它们的提升层优先级设置为 `0`。数据库集群中的其它读取器实例应具有非零的提升层，并且集群缓存管理对于这些实例处于禁用状态。

以下原因可能会导致配置出现问题并禁用集群缓存管理：
+ 当没有单个读取器数据库实例设置为提升层 0 时。
+ 当写入器数据库实例未设置为提升层 0 时。
+ 当多个读取器数据库实例设置为提升层 0 时。
+ 当提升层为 0 的写入器和一个读取器数据库实例的实例大小不相同时。