

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用邏輯複寫來執行 Aurora PostgreSQL 的主要版本升級
<a name="AuroraPostgreSQL.MajorVersionUpgrade"></a>

使用邏輯複寫和 Aurora 快速複製，您可使用目前版本 Aurora PostgreSQL 資料庫執行主要版本升級，同時逐漸將變更資料遷移至新的主要版本資料庫。此低停機時間升級程序稱為藍/綠升級。資料庫的目前版本稱為「藍色」環境，而新的資料庫版本則稱為「綠色」環境。

Aurora 快速複製會透過取得來源資料庫的快照，完全載入現有資料。快速複製會使用建置在 Aurora 儲存層之上的寫入時複製通訊協定，這可讓您在短時間內建立資料庫複製。升級到大型資料庫時，此方法非常有效。

PostgreSQL 中的邏輯複寫會追蹤您的資料變更，並將其從初始執行個體傳輸到並行執行的新執行個體，直到您移至更新版本的 PostgreSQL 為止。邏輯複寫使用發佈與訂閱模型。如需有關 Aurora PostgreSQL 邏輯複寫的詳細資訊，請參閱 [以 Amazon Aurora PostgreSQL 進行複寫](AuroraPostgreSQL.Replication.md)。

**提示**  
您可以使用受管 Amazon RDS 藍/綠部署功能，將主要版本升級所需的停機時間降至最低。如需詳細資訊，請參閱[使用 Amazon Aurora 藍/綠部署進行資料庫更新](blue-green-deployments.md)。

**Topics**
+ [需求](#AuroraPostgreSQL.MajorVersionUpgrade.Requirements)
+ [限制](#AuroraPostgreSQL.MajorVersionUpgrade.Limitations)
+ [設定和檢查參數值](#AuroraPostgreSQL.MajorVersionUpgrade.Parameters)
+ [將 Aurora PostgreSQL 引擎升級至新的主要版本](#AuroraPostgreSQL.MajorVersionUpgrade.StartLogicalReplication)
+ [執行升級後任務](#AuroraPostgreSQL.MajorVersionUpgrade.PostUpgrade)

## 需求
<a name="AuroraPostgreSQL.MajorVersionUpgrade.Requirements"></a>

您必須符合下列需求，才能執行此低停機時間升級程序：
+ 您必須具有 rds\$1superuser 許可。
+ 您要升級的 Aurora PostgreSQL 資料庫叢集必須執行受支援的版本，其可使用邏輯複寫執行主要版本升級。務必將任何次要版本更新和修補程式套用至資料庫叢集。下列版本的 Aurora PostgreSQL 支援此技術中使用的 `aurora_volume_logical_start_lsn` 函數：
  + 15.2 版和更新的 15 版本
  + 14.3 版和更新的 14 版
  + 13.6 版及更新的第 13 版本
  + 12.10 版和更新的第 12 版本
  + 11.15 和更新的第 11 版本
  + 10.20 和更新的第 10 版本

  如需有關 `aurora_volume_logical_start_lsn` 函數的詳細資訊，請參閱 [aurora\$1volume\$1logical\$1start\$1lsn](aurora_volume_logical_start_lsn.md)。
+ 您的所有資料表都必須具有主索引鍵或包含 [PostgreSQL 身分資料欄](https://www.postgresql.org/docs/current/sql-createtable.html)。
+ 針對您的 VPC 設定安全群組，以允許兩個 Aurora PostgreSQL 資料庫叢集 (無論新舊) 之間的傳入和傳出存取。您可以將存取權授與特定無類別域間路由 (CIDR) 範圍，或是授予 VPC 或對等 VPC 中的另一個安全群組。(對等 VPC 需要 VPC 對等互連。)

**注意**  
如需設定和管理執行中邏輯複寫案例所需許可的詳細資訊，請參閱 [PostgreSQL 核心文件](https://www.postgresql.org/docs/13/logical-replication-security.html)。

## 限制
<a name="AuroraPostgreSQL.MajorVersionUpgrade.Limitations"></a>

 在對 Aurora PostgreSQL 資料庫叢集執行低停機時間升級以將其升級到新的主要版本時，您使用的是原生 PostgreSQL 邏輯複寫功能。它具有與 PostgreSQL 邏輯複寫相同的功能和限制。如需詳細資訊，請參閱 [PostgreSQL 邏輯複寫](https://www.postgresql.org/docs/13/logical-replication.html)。
+ 不會複寫資料定義語言 (DDL) 命令。
+ 複寫不支援即時資料庫中的結構描述變更。在複製過程中，會以其原始形式重新建立結構描述。如果您在複製之後，但在完成升級之前變更結構描述，該結構描述不會反映在升級的執行個體中。
+ 不會複製大型物件，但您可以將資料儲存在一般資料表中。
+ 只有資料表 (包括分割的資料表) 支援複寫。不支援複寫至其他類型的關係，例如視觀表、具體化視觀表或外部資料表。
+ 不會複寫序列資料，且其需要在容錯移轉後手動更新。

**注意**  
此升級不支援自動編寫指令碼。您應該手動執行所有步驟。

## 設定和檢查參數值
<a name="AuroraPostgreSQL.MajorVersionUpgrade.Parameters"></a>

 升級之前，請先設定 Aurora PostgreSQL 資料庫叢集的寫入器執行個體，以充當發佈伺服器。執行個體應該搭配下列設定使用自訂資料庫叢集參數群組：
+ `rds.logical_replication` – 將此參數設為 1。`rds.logical_replication` 參數提供的用途與獨立 PostgreSQL 伺服器的 `wal_level` 參數和其他控制預寫日誌檔管理的參數相同。
+ `max_replication_slots` – 將此參數值設為您計畫建立的訂閱總數。如果您使用的是 AWS DMS，請將此參數設定為您計劃用於此資料庫叢集變更資料擷取 AWS DMS 的任務數量。
+ `max_wal_senders` – 設為並行連線的數目，加上一些額外的數目，以供管理任務和新工作階段使用。如果您使用的是 AWS DMS，max\$1wal\$1senders 的數量應該等於並行工作階段的數量，以及在任何指定時間可能運作 AWS DMS 的任務數量。
+ `max_logical_replication_workers` – 設為您預期的邏輯複寫工作者和資料表同步工作者的數目。將複寫工作者的數目設為用於 max\$1wal\$1senders 的相同值。通常很安全。工作者是從配置給伺服器的背景程序 (max\$1worker\$1process) 集區中取得的。
+  `max_worker_processes` – 設為伺服器的背景程序數目。此數目應該大到足以配置工作者進行複寫、自動清空程序，以及其他可能同時發生的維護程序。

升級到更新版本的 Aurora PostgreSQL 時，您需要複製已在舊版參數群組中修改的任何參數。這些參數會套用至升級的版本。您可以查詢 `pg_settings` 資料表以取得參數設定清單，以便可在新的 Aurora PostgreSQL 資料庫叢集上重新建立參數設定。

例如，若要取得複寫參數的設定，請執行下列查詢：

```
SELECT name, setting FROM pg_settings WHERE name in 
('rds.logical_replication', 'max_replication_slots', 
'max_wal_senders', 'max_logical_replication_workers', 
'max_worker_processes');
```

## 將 Aurora PostgreSQL 引擎升級至新的主要版本
<a name="AuroraPostgreSQL.MajorVersionUpgrade.StartLogicalReplication"></a>

**準備發佈者 (藍色)**

1. 在以下範例中，來源寫入器執行個體 (藍色) 是執行 PostgreSQL 11.15 版的 Aurora PostgreSQL 資料庫叢集。這是我們複寫案例中的發佈節點。針對此示範，我們的來源寫入器執行個體會管理一個保留一系列值的範例資料表：

   ```
   CREATE TABLE my_table (a int PRIMARY KEY);
   INSERT INTO my_table VALUES (generate_series(1,100));
   ```

1. 若要在來源執行個體上建立發佈，請使用 psql (PostgreSQL 的 CLI) 或使用您選擇的用戶端連線至執行個體的寫入器節點。在每個資料庫中輸入下列命令：

   ```
   CREATE PUBLICATION publication_name FOR ALL TABLES;
   ```

   publication\$1name 指定發佈的名稱。

1. 您也需要在執行個體上建立複寫槽。下列命令會建立複寫槽並載入 `pgoutput` [邏輯解碼外掛程式](https://www.postgresql.org/docs/current/logicaldecoding-explanation.html)。外掛程式會將從預寫日誌 (WAL) 讀取的內容變更為邏輯複寫通訊協定，並根據發佈規格篩選資料。

   ```
   SELECT pg_create_logical_replication_slot('replication_slot_name', 'pgoutput');
   ```

**複製發佈者**

1. 使用 Amazon RDS 主控台建立來源執行個體的複製。反白顯示 Amazon RDS 主控台中的執行個體名稱，然後在 **Actions** (動作) 功能表中選擇 **Create clone** (建立複製)。  
![\[將 Aurora MySQL 資料庫叢集從第 2 版就地升級至第 3 版\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/AuroraUserGuide/images/apg-logicalreplication-mvu-create-clone.png)

1. 提供執行個體的唯一名稱。大部分的設定都是來源執行個體中的預設值。當您對新執行個體進行了必要的變更時，請選擇 **Create clone** (建立複製)。  
![\[將 Aurora MySQL 資料庫叢集從第 2 版就地升級至第 3 版\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/AuroraUserGuide/images/apg-logicalreplication-mvu-create-clone-note.png)

1. 當目標執行個體啟動時，寫入器節點的 **Status** (狀態) 資料欄會在 **Status** (狀態) 資料欄中顯示 Creating (建立中)。當執行個體準備就緒時，狀態會變更為 Available (可用)。

**準備複製以進行升級**

1. 複製是部署模型中的「綠色」執行個體。它是複寫訂閱節點的主機。當節點變成可用時，請與 psql 連線，並查詢新的寫入器節點，以取得日誌序號 (LSN)。LSN 識別 WAL 串流中記錄的開頭。

   ```
   SELECT aurora_volume_logical_start_lsn();
   ```

1. 在查詢的回應中，您可以找到 LSN 號碼。您稍後在此程序中需要此號碼，因此請記下它。

   ```
   postgres=> SELECT aurora_volume_logical_start_lsn();
   aurora_volume_logical_start_lsn 
   ---------------
   0/402E2F0
   (1 row)
   ```

1. 升級複製之前，請先捨棄複製的複寫槽。

   ```
   SELECT pg_drop_replication_slot('replication_slot_name');
   ```

**將叢集升級至新的主要版本**
+ 在複製提供者節點之後，請使用 Amazon RDS 主控台，在訂閱節點上啟動主要版本升級。反白顯示 RDS 主控台中的執行個體名稱，然後選取 **Modify** (修改) 按鈕。選取更新的版本和更新的參數群組，然後立即套用設定以升級目標執行個體。  
![\[將 Aurora MySQL 資料庫叢集從第 2 版就地升級至第 3 版\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/AuroraUserGuide/images/apg-logicalreplication-mvu-modify-DB-cluster.png)
+ 您也可以使用 CLI 執行升級：

  ```
  aws rds modify-db-cluster —db-cluster-identifier $TARGET_Aurora_ID —engine-version 13.6 —allow-major-version-upgrade —apply-immediately
  ```

**準備訂閱者 (綠色)**

1. 升級完成後，當複製變成可用時，請與 psql 連線並定義訂閱。若要這樣做，您需要在 `CREATE SUBSCRIPTION` 命令中指定下列選項：
   + `subscription_name` – 訂閱的名稱。
   + `admin_user_name` – 具有 rds\$1superuser 許可的管理使用者名稱。
   + `admin_user_password` – 與管理使用者相關聯的密碼。
   + `source_instance_URL` – 發佈伺服器執行個體的 URL。
   + `database` – 訂閱伺服器將與其連線的資料庫。
   + `publication_name` – 發佈伺服器的名稱。
   + `replication_slot_name` - 複寫槽的名稱。

   ```
   CREATE SUBSCRIPTION subscription_name 
   CONNECTION 'postgres://admin_user_name:admin_user_password@source_instance_URL/database' PUBLICATION publication_name 
   WITH (copy_data = false, create_slot = false, enabled = false, connect = true, slot_name = 'replication_slot_name');
   ```

1.  建立訂閱之後，請查詢 [pg\$1replication\$1origin](https://www.postgresql.org/docs/14/catalog-pg-replication-origin.html) 檢視以擷取 roname 值，這是複寫來源的識別符。每個執行個體都有一個 `roname`：

   ```
   SELECT * FROM pg_replication_origin;
   ```

   例如：

   ```
   postgres=> 
   SELECT * FROM pg_replication_origin;
    
   roident | roname 
   ---------+----------
   1 | pg_24586
   ```

1. 提供您先前查詢發佈節點時所儲存的 LSN，以及從命令中訂閱節點 [INSTANCE] 傳回的 `roname`。此命令會使用 `[pg\$1replication\$1origin\$1advance](https://www.postgresql.org/docs/14/functions-admin.html)` 函數來指定日誌序列中進行複寫的起點。

   ```
   SELECT pg_replication_origin_advance('roname', 'log_sequence_number');
   ```

   `roname` 是 pg\$1replication\$1origin 檢視傳回的識別符。

   `log_sequence_number` 是先前查詢 `aurora_volume_logical_start_lsn` 函數所傳回的值。

1. 然後，使用 `ALTER SUBSCRIPTION... ENABLE` 子句開啟邏輯複寫。

   ```
   ALTER SUBSCRIPTION subscription_name ENABLE;
   ```

1. 此時，您可以確認複製正在運作中。將一值新增至發佈執行個體，然後確認該值複寫到訂閱節點。

   然後，使用下列命令來監控發佈節點上的複寫延遲：

   ```
   SELECT now() AS CURRENT_TIME, slot_name, active, active_pid, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),
   confirmed_flush_lsn)) AS diff_size, pg_wal_lsn_diff(pg_current_wal_lsn(),
   confirmed_flush_lsn) AS diff_bytes FROM pg_replication_slots WHERE slot_type = 'logical';
   ```

   例如：

   ```
   postgres=> SELECT now() AS CURRENT_TIME, slot_name, active, active_pid, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), 
   confirmed_flush_lsn)) AS diff_size, pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn) AS diff_bytes FROM pg_replication_slots WHERE slot_type = 'logical';
    
   current_time                   | slot_name             | active | active_pid | diff_size | diff_bytes 
   -------------------------------+-----------------------+--------+------------+-----------+------------
   2022-04-13 15:11:00.243401+00  | replication_slot_name | t      | 21854      | 136 bytes | 136
   (1 row)
   ```

   您可以使用 `diff_size` 和 `diff_bytes` 值來監控複寫延遲。當這些值達到 0，複本即已跟上來源資料庫執行個體。

## 執行升級後任務
<a name="AuroraPostgreSQL.MajorVersionUpgrade.PostUpgrade"></a>

升級完成時，執行個體狀態會在主控台儀表板的 **Status** (狀態) 資料欄中顯示為 **Available** (可用)。在新執行個體上，建議您執行下列動作：
+ 重新導向您的應用程式以指向寫入器節點。
+ 新增讀取器節點以管理工作量，並在寫入器節點發生問題時提供高可用性。
+ Aurora PostgreSQL 資料庫叢集偶爾需要作業系統更新。這些更新可能會包含較新版本的 glibc 程式庫。在此類更新期間，建議您遵循 [Aurora PostgreSQL 支援的定序](PostgreSQL-Collations.md) 中所述指示。
+ 更新新執行個體上的使用者許可來確保存取權。

在新執行個體上測試您的應用程式和資料之後，建議您先對初始執行個體進行最終備份，然後再將其移除。如需在 Aurora 主機上使用邏輯複寫的詳細資訊，請參閱 [針對 Aurora PostgreSQL 資料庫叢集設定邏輯複寫](AuroraPostgreSQL.Replication.Logical.Configure.md)。