使用邏輯複寫來執行 Aurora PostgreSQL 的主要版本升級 - Amazon Aurora

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

使用邏輯複寫來執行 Aurora PostgreSQL 的主要版本升級

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

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

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

提示

您可以使用受管 Amazon RDS 藍/綠部署功能,將主要版本升級所需的停機時間降至最低。如需詳細資訊,請參閱 使用 Amazon RDS 藍/綠部署進行資料庫更新

需求

您必須符合下列需求,才能執行此低停機時間升級程序:

  • 您必須具有 rds_superuser 許可。

  • 您要升級的 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_volume_logical_start_lsn

  • 您的所有資料表都必須具有主索引鍵或包含 PostgreSQL 身分資料欄

  • 針對您的 VPC 設定安全群組,以允許兩個 Aurora PostgreSQL 資料庫叢集 (無論新舊) 之間的傳入和傳出存取。您可以將存取權授與特定無類別域間路由 (CIDR) 範圍,或是授予 VPC 或對等 VPC 中的另一個安全群組。(對等 VPC 需要 VPC 對等互連。)

注意

如需設定和管理執行中邏輯複寫案例所需許可的詳細資訊,請參閱 PostgreSQL 核心文件

限制

在對 Aurora PostgreSQL 資料庫叢集執行低停機時間升級以將其升級到新的主要版本時,您使用的是原生 PostgreSQL 邏輯複寫功能。它具有與 PostgreSQL 邏輯複寫相同的功能和限制。如需詳細資訊,請參閱 PostgreSQL 邏輯複寫

  • 不會複寫資料定義語言 (DDL) 命令。

  • 複寫不支援即時資料庫中的結構描述變更。在複製過程中,會以其原始形式重新建立結構描述。如果您在複製之後,但在完成升級之前變更結構描述,該結構描述不會反映在升級的執行個體中。

  • 不會複製大型物件,但您可以將資料儲存在一般資料表中。

  • 只有資料表 (包括分割的資料表) 支援複寫。不支援複寫至其他類型的關係,例如視觀表、具體化視觀表或外部資料表。

  • 不會複寫序列資料,且其需要在容錯移轉後手動更新。

注意

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

設定和檢查參數值

升級之前,請先設定 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_wal_發件人的數量應等於並行工作階段的數目加上可能在任何給定時間 AWS DMS 執行的工作數目。

  • max_logical_replication_workers – 設為您預期的邏輯複寫工作者和資料表同步工作者的數目。將複寫工作者的數目設為用於 max_wal_senders 的相同值。通常很安全。工作者是從配置給伺服器的背景程序 (max_worker_process) 集區中取得的。

  • 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 引擎升級至新的主要版本

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

    CREATE TABLE my_table (a int PRIMARY KEY); INSERT INTO my_table VALUES (generate_series(1,100));
  2. 若要在來源執行個體上建立發佈,請使用 psql (PostgreSQL 的 CLI) 或使用您選擇的用戶端連線至執行個體的寫入器節點。在每個資料庫中輸入下列命令:

    CREATE PUBLICATION publication_name FOR ALL TABLES;

    publication_name 指定發佈的名稱。

  3. 您也需要在執行個體上建立複寫槽。下列命令會建立複寫槽並載入 pgoutput 邏輯解碼外掛程式。外掛程式會將從預寫日誌 (WAL) 讀取的內容變更為邏輯複寫通訊協定,並根據發佈規格篩選資料。

    SELECT pg_create_logical_replication_slot('replication_slot_name', 'pgoutput');
複製發佈者
  1. 使用 Amazon RDS 主控台建立來源執行個體的複製。反白顯示 Amazon RDS 主控台中的執行個體名稱,然後在 Actions (動作) 功能表中選擇 Create clone (建立複製)。

    將 Aurora MySQL 資料庫叢集從第 2 版就地升級至第 3 版
  2. 提供執行個體的唯一名稱。大部分的設定都是來源執行個體中的預設值。當您對新執行個體進行了必要的變更時,請選擇 Create clone (建立複製)。

    將 Aurora MySQL 資料庫叢集從第 2 版就地升級至第 3 版
  3. 當目標執行個體啟動時,寫入器節點的 Status (狀態) 資料欄會在 Status (狀態) 資料欄中顯示 Creating (建立中)。當執行個體準備就緒時,狀態會變更為 Available (可用)。

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

    SELECT aurora_volume_logical_start_lsn();
  2. 在查詢的回應中,您可以找到 LSN 號碼。您稍後在此程序中需要此號碼,因此請記下它。

    postgres=> SELECT aurora_volume_logical_start_lsn(); aurora_volume_logical_start_lsn --------------- 0/402E2F0 (1 row)
  3. 升級複製之前,請先捨棄複製的複寫槽。

    SELECT pg_drop_replication_slot('replication_slot_name');
將叢集升級至新的主要版本
  • 在複製提供者節點之後,請使用 Amazon RDS 主控台,在訂閱節點上啟動主要版本升級。反白顯示 RDS 主控台中的執行個體名稱,然後選取 Modify (修改) 按鈕。選取更新的版本和更新的參數群組,然後立即套用設定以升級目標執行個體。

    將 Aurora MySQL 資料庫叢集從第 2 版就地升級至第 3 版
  • 您也可以使用 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_superuser 許可的管理使用者名稱。

    • 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');
  2. 建立訂閱之後,請查詢 pg_replication_origin 檢視以擷取 roname 值,這是複寫來源的識別符。每個執行個體都有一個 roname

    SELECT * FROM pg_replication_origin;

    例如:

    postgres=> SELECT * FROM pg_replication_origin; roident | roname ---------+---------- 1 | pg_24586
  3. 提供您先前查詢發佈節點時所儲存的 LSN,以及從命令中訂閱節點 [INSTANCE] 傳回的 roname。此命令會使用 pg_replication_origin_advance 函數來指定日誌序列中進行複寫的起點。

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

    roname 是 pg_replication_origin 檢視傳回的識別符。

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

  4. 然後,使用 ALTER SUBSCRIPTION... ENABLE 子句開啟邏輯複寫。

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

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

    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_sizediff_bytes 值來監控複寫延遲。當這些值達到 0,複本即已跟上來源資料庫執行個體。

執行升級後任務

升級完成時,執行個體狀態會在主控台儀表板的 Status (狀態) 資料欄中顯示為 Available (可用)。在新執行個體上,建議您執行下列動作:

  • 重新導向您的應用程式以指向寫入器節點。

  • 新增讀取器節點以管理工作量,並在寫入器節點發生問題時提供高可用性。

  • Aurora PostgreSQL 資料庫叢集偶爾需要作業系統更新。這些更新可能會包含較新版本的 glibc 程式庫。在此類更新期間,建議您遵循 Aurora PostgreSQL 中支援定序 中所述指示。

  • 更新新執行個體上的使用者許可來確保存取權。

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