以 Aurora 使用 PostgreSQL 邏輯複寫 - Amazon Aurora

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

以 Aurora 使用 PostgreSQL 邏輯複寫

透過將 PostgreSQL 的邏輯複寫功能與 Aurora PostgreSQL 資料庫叢集搭配使用,您可以複寫和同步個別資料表,而不是整個資料庫執行個體。邏輯複寫會使用發佈與訂閱模型,將來源中的變更複寫到一或多個收件人。其運作方式為使用 PostgreSQL 預寫日誌 (WAL) 中的變更記錄。來源 (或發佈者) 會將所指定資料表的 WAL 資料傳送給一或多個收件人 (訂閱者),進而複寫變更,並讓訂閱者的資料表與發行者的表格保持同步。來自發佈者的變更集是使用發佈來識別的。訂閱者取得變更的方式為建立訂閱,定義與發佈者資料庫及其發佈的連線。複寫插槽是此結構描述中用來追蹤訂閱進度的機制。

對於 Aurora PostgreSQL 資料庫叢集,WAL 記錄會儲存在 Aurora 儲存體上。在邏輯複寫案例中做為發佈者的 Aurora PostgreSQL 資料庫叢集會從 Aurora 儲存體讀取 WAL 資料、將其解碼,然後將其傳送給訂閱者,以便可將變更套用至該執行個體上的資料表。發佈者會使用邏輯解碼器來解碼資料以供訂閱者使用。根據預設,Aurora PostgreSQL 資料庫叢集會在傳送資料時使用原生 PostgreSQL pgoutput 外掛程式。還有其他邏輯解碼器可供使用。例如,Aurora PostgreSQL 也支援將 WAL 資料轉換為 JSON 的 wal2json 外掛程式。

從 Aurora PostgreSQL 14.5、13.8、12.12 和 11.17 版起,Aurora 使用直接寫入式快取來擴增 PostgreSQL 邏輯複寫程序,以提升效能。WAL 交易日誌會在緩衝區中進行本機快取,以減少磁碟 I/O 的數量,亦即在邏輯解碼期間從 Aurora 儲存體進行讀取。每當您針對 Aurora PostgreSQL 資料庫叢集使用邏輯複寫時,預設會使用直接寫入式快取。Aurora 提供數個您可以用來管理快取的功能。如需詳細資訊,請參閱管理 Aurora PostgreSQL 邏輯複寫直接寫入式快取

所有目前可用的 Aurora PostgreSQL 版本都支援邏輯複寫。如需詳細資訊,請參閱《Aurora PostgreSQL 版本資訊》中的 Amazon Aurora PostgreSQL 更新

注意

除了在 PostgreSQL 10 中引進的原生 PostgreSQL 邏輯複寫功能之外,Aurora PostgreSQL 也支援 pglogical 延伸模組。如需詳細資訊,請參閱使用 pglogical 跨執行個體同步資料

如需 PostgreSQL 邏輯複寫的詳細資訊,請參閱 PostgreSQL 文件中的邏輯複寫邏輯解碼概念

在下列主題中。您可以找到有關如何在 Aurora PostgreSQL 資料庫叢集之間設定邏輯複寫的資訊。

針對 Aurora PostgreSQL 資料庫叢集設定邏輯複寫

設定邏輯複製需要 rds_superuser 權限。您的 Aurora PostgreSQL 資料庫叢集必須設定為使用自訂資料庫叢集參數群組,以便您可以依下列程序所述設定必要的參數。如需詳細資訊,請參閱使用資料庫叢集參數群組

針對 Aurora PostgreSQL 資料庫叢集設定 PostgreSQL 邏輯複寫
  1. 登入 AWS Management Console,並開啟 Amazon RDS 主控台,網址為 https://console.aws.amazon.com/rds/

  2. 在導覽窗格中,選擇 Aurora PostgreSQL 資料庫叢集。

  3. 開啟 Configuration (組態) 索引標籤。在執行個體詳細資訊中找出參數群組連結,並於類型清單中選擇資料庫叢集參數群組

  4. 選擇連結以開啟與 Aurora PostgreSQL 資料庫叢集相關聯的連結。

  5. Parameters (參數) 搜尋欄位中,輸入 rds 以尋找 rds.logical_replication 參數。此參數的預設值為 0,表示預設為關閉。

  6. 選擇 Edit parameters (編輯參數) 以存取屬性值,然後從選取器中選擇 1 以開啟功能。根據您預期的使用情況,您可能也需要變更下列參數的設定。不過,在許多情況下,預設值就足夠了。

    • max_replication_slots – 將此參數設定為至少等於您規劃之邏輯複寫發佈與訂閱總數的值。如果您正在使用 AWS DMS,此參數至少應等於叢集中規劃的變更資料擷取任務,再加上邏輯複寫發佈和訂閱。

    • max_wal_sendersmax_logical_replication_workers - 將這些參數設定為至少等於您打算啟用的邏輯複寫槽數目,或用於擷取變更資料的作用中 AWS DMS 任務數目。讓邏輯複寫槽處於非作用中會導致清理無法從資料表移除已淘汰的元組,因此建議您監控複寫槽並視需要移除非作用中的複寫槽。

    • max_worker_processes – 將此參數設定為至少等於 max_logical_replication_workersautovacuum_max_workers、和 max_parallel_workers 值總計的值。在小型資料庫執行個體類別上,背景工作者程序可能影響應用程式工作負載,因此,如果您將 max_worker_processes 設為高於預設值,請監控資料庫的效能。(預設值是 GREATEST(${DBInstanceVCPU*2},8} 的結果,表示依預設,這是 8 或是資料庫執行個體類別對等 CPU 的兩倍,以較大者為準)。

    注意

    您可修改客戶建立的資料庫參數群組中的參數值;但無法變更預設資料庫參數群組中的參數值。

  7. 選擇儲存變更

  8. 重新啟動 Aurora PostgreSQL 資料庫叢集的寫入器執行個體,以便您的變更生效。在 Amazon RDS 主控台中,選擇叢集的主要資料庫執行個體,然後從 Actions (動作) 中選擇 Reboot (重新啟動)。

  9. 當執行個體可用時,您可以驗證邏輯複寫是否已開啟,如下所示。

    1. 使用 psql 連線到 Aurora PostgreSQL 資料庫叢集的寫入器執行個體。

      psql --host=your-db-cluster-instance-1.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
    2. 使用下列命令驗證是否已啟用邏輯複寫。

      labdb=> SHOW rds.logical_replication; rds.logical_replication ------------------------- on (1 row)
    3. 驗證 wal_level 是否已設為 logical

      labdb=> SHOW wal_level; wal_level ----------- logical (1 row)

如需使用邏輯複寫,讓資料庫表格與來源 Aurora PostgreSQL 資料庫叢集中的變更保持同步的範例,請參閱 範例:搭配 Aurora PostgreSQL 資料庫叢集使用邏輯複寫

關閉邏輯複寫

完成複寫任務之後,您應該停止複寫程序、捨棄複寫槽,並關閉邏輯複寫。在捨棄複寫槽之前,確定不再需要它們。無法捨棄作用中複寫槽。

關閉邏輯複寫
  1. 捨棄所有複寫槽。

    若要捨棄所有複寫槽,請連線到發佈者,然後執行下列 SQL 命令。

    SELECT pg_drop_replication_slot(slot_name) FROM pg_replication_slots WHERE slot_name IN (SELECT slot_name FROM pg_replication_slots);

    執行此命令時,複寫槽不能處於作用中。

  2. 針對 Aurora PostgreSQL 資料庫叢集設定邏輯複寫 所述,修改與發佈者相關聯的自訂資料庫叢集參數群組,但將 rds.logical_replication 參數設為 0。

    如需自訂參數群組的詳細資訊,請參閱 修改資料庫叢集參數群組中的參數

  3. 重新啟動發佈者 Aurora PostgreSQL 資料庫叢集,使 rds.logical_replication 參數的變更生效。

管理 Aurora PostgreSQL 邏輯複寫直接寫入式快取

根據預設,Aurora PostgreSQL 14.5、13.8、12.12 和 11.17 版,以及更高版本會使用直接寫入式快取來改善邏輯複寫的效能。若沒有直接寫入式快取,Aurora PostgreSQL 會在實作原生 PostgreSQL 邏輯複寫程序時使用 Aurora 儲存層。作法是將 WAL 資料寫入儲存體,然後從儲存體中讀回資料,以對其進行解碼並傳送 (複寫)到其目標 (訂閱者)。這可能會導致 Aurora PostgreSQL 資料庫叢集進行邏輯複寫期間產生瓶頸。

直接寫入式快取可減少使用 Aurora 儲存層的需求。Aurora PostgreSQL 並不總是從 Aurora 儲存層寫入和讀取,而是使用緩衝區來快取邏輯 WAL 串流,以便可在複寫程序期間使用它,而不是一律從磁碟提取。此緩衝區是邏輯複寫所使用的 PostgreSQL 原生快取,其會在 Aurora PostgreSQL 資料庫叢集參數中識別為 rds.logical_wal_cache。根據預設,此快取會使用 Aurora PostgreSQL 資料庫叢集的緩衝區快取設定 (shared_buffers) 的 1/32,但不小於 64kB,也不超過一個 WAL 區段的大小 (通常為 16MB)。

當使用邏輯複寫搭配 Aurora PostgreSQL 資料庫叢集 (適用於支援直接寫入式快取的版本) 時,您可以監控快取命中率,以查看其在您使用案例中的運作有多好。若要這麼做,請使用 psql 連線至 Aurora PostgreSQL 資料庫叢集的寫入執行個體,然後使用 Aurora 函數 aurora_stat_logical_wal_cache,如下列範例所示。

SELECT * FROM aurora_stat_logical_wal_cache();

此函數會傳回如下的輸出。

name | active_pid | cache_hit | cache_miss | blks_read | hit_rate | last_reset_timestamp -----------+------------+-----------+------------+-----------+----------+-------------- test_slot1 | 79183 | 24 | 0 | 24 | 100.00% | 2022-08-05 17:39... test_slot2 | | 1 | 0 | 1 | 100.00% | 2022-08-05 17:34... (2 rows)

為了可讀性,last_reset_timestamp 值已縮短。如需此函數狀態的詳細資訊,請參閱 aurora_stat_logical_wal_cache

Aurora PostgreSQL 提供下列兩個函數,用於監控直接寫入式快取。

如果發現自動調整的 WAL 快取大小無法滿足您的工作負載,您可以透過修改自訂資料庫叢集參數群組中的參數來手動變更 rds.logical_wal_cache 的值。請注意,任何小於 32kB 的正值都會將其視為 32kB。如需 wal_buffers 的詳細資訊,請參閱 PostgreSQL 文件中的預寫日誌

管理 Aurora PostgreSQL 的邏輯槽

pg_replication_origin_status 檢視中擷取串流活動。若要查看此檢視的內容,您可以使用 pg_show_replication_origin_status() 函數,如下所示:

SELECT * FROM pg_show_replication_origin_status();

您可以使用下面的 SQL 查詢,取得您的邏輯槽清單。

SELECT * FROM pg_replication_slots;

若要捨棄邏輯槽,請使用 pg_drop_replication_slot 搭配該槽的名稱,如下列命令中所示。

SELECT pg_drop_replication_slot('test_slot');

範例:搭配 Aurora PostgreSQL 資料庫叢集使用邏輯複寫

下列程序說明如何在兩個 Aurora PostgreSQL 資料庫叢集之間啟動邏輯複寫。發佈者和訂閱者都必須針對邏輯複寫進行設定,如 針對 Aurora PostgreSQL 資料庫叢集設定邏輯複寫 中所述。

作為指定發佈者的 Aurora PostgreSQL 資料庫叢集也必須允許存取複寫槽。若要這麼做,請根據 Amazon VPC 服務,修改與 Aurora PostgreSQL 資料庫叢集之虛擬公有雲端 (VPC) 相關聯的安全群組。將與訂閱者 VPC 相關聯的安全群組新增至發佈者的安全群組,以允許傳入存取。如需詳細資訊,請參閱 Amazon VPC 使用者指南中的使用安全群組控制到資源的流量

完成這些初步步驟後,您可以在發佈者上使用 PostgreSQL 命令 CREATE PUBLICATION,以及在訂閱者上使用 CREATE SUBSCRIPTION,如下列程序所述。

在兩個 Aurora PostgreSQL 資料庫叢集之間啟動邏輯複寫程序

這些步驟假設您的 Aurora PostgreSQL 資料庫叢集具有一個寫入器執行個體,其中包含可在其中建立範例資料表的資料庫。

  1. 在發佈者 Aurora PostgreSQL 資料庫叢集上

    1. 使用下列 SQL 陳述式建立資料表。

      CREATE TABLE LogicalReplicationTest (a int PRIMARY KEY);
    2. 使用下列 SQL 陳述式,將資料插入發佈者資料庫。

      INSERT INTO LogicalReplicationTest VALUES (generate_series(1,10000));
    3. 使用下列 SQL 陳述式,驗證資料是否存在於資料表中。

      SELECT count(*) FROM LogicalReplicationTest;
    4. 使用 CREATE PUBLICATION 陳述式建立此資料表的發佈,如下所示。

      CREATE PUBLICATION testpub FOR TABLE LogicalReplicationTest;
  2. 在訂閱者 Aurora PostgreSQL 資料庫叢集上

    1. 在訂閱者上建立您已在發佈者上建立的相同 LogicalReplicationTest 資料表,如下所示。

      CREATE TABLE LogicalReplicationTest (a int PRIMARY KEY);
    2. 驗證此資料表是否為空的。

      SELECT count(*) FROM LogicalReplicationTest;
    3. 建立訂閱以從發佈者取得變更。您必須使用有關發佈者 Aurora PostgreSQL 資料庫叢集的下列詳細資訊。

      • host – 發佈者 Aurora PostgreSQL 資料庫叢集的寫入器資料庫執行個體。

      • port – 寫入器資料庫執行個體正在聆聽的連接埠。PostgreSQL 的預設值為 5432。

      • dbname – 資料庫的名稱。

      CREATE SUBSCRIPTION testsub CONNECTION 'host=publisher-cluster-writer-endpoint port=5432 dbname=db-name user=user password=password' PUBLICATION testpub;
      注意

      指定此處所顯示提示以外的密碼,作為安全最佳實務。

      建立訂閱後,發佈者會建立一個邏輯複寫槽。

    4. 對於本範例,若要驗證初始資料已複寫在訂閱者上,請對訂閱者資料庫使用下列 SQL 陳述式。

      SELECT count(*) FROM LogicalReplicationTest;

發佈者發生的任何其他變更會被複寫到訂閱者。

邏輯複寫會影響效能。建議您在複寫任務完成後關閉邏輯複寫。

範例:使用 Aurora PostgreSQL 和 AWS Database Migration Service 進行邏輯複寫

您可以使用 AWS Database Migration Service (AWS DMS) 複寫資料庫或資料庫的一部分。使用 AWS DMS 將您的資料從 Aurora PostgreSQL 資料庫遷移到另一個開源或商業資料庫。如需 AWS DMS 的詳細資訊,請參閱 AWS Database Migration Service 使用者指南

以下範例顯示如何設定來自 Aurora PostgreSQL 資料庫 (發佈者) 的邏輯複寫,並使用 AWS DMS 進行遷移。本範例使用在 範例:搭配 Aurora PostgreSQL 資料庫叢集使用邏輯複寫 建立的同一個發佈者和訂閱者。

若要使用 AWS DMS 建立邏輯複寫,您需要來自 Amazon RDS 的發佈者的和訂閱者的詳細資訊。尤其是關於發佈者的寫入器資料庫執行個體,以及訂閱者的資料庫執行個體的詳細資訊。

取得發佈者的寫入器資料庫執行個體的下列資訊︰

  • Virtual Private Cloud (VPC) 識別符

  • 子網路群組

  • 可用區域 (AZ)

  • VPC 安全群組

  • 資料庫執行個體 ID

取得訂閱者的資料庫執行個體的下列資訊︰

  • 資料庫執行個體 ID

  • 來源引擎

使用 AWS DMS 搭配 Aurora PostgreSQL 進行邏輯複寫
  1. 準備發佈者資料庫使用 AWS DMS。

    若要這麼做,PostgreSQL 10.x 和以上版本的資料庫要求您將 AWS DMS 包裝函式套用於發佈者資料庫。如需此步驟和稍後步驟的詳細資訊,請參閱 AWS Database Migration Service 使用者指南中的使用 PostgreSQL 10.x 和以上版本作為 AWS DMS 的來源

  2. 登入 AWS Management Console 並於 AWS DMS 開啟 https://console.aws.amazon.com/dms/v2 主控台。在右上角,選擇發佈者和訂閱者所在的同一個 AWS 區域。

  3. 建立 AWS DMS 複寫執行個體。

    選擇與發佈者的寫入器資料庫執行個體相同的值。這些值包括下列設定:

    • VPC 中,選擇與寫入器資料庫執行個體相同的 VPC。

    • 針對 Replication Subnet Group (複寫子網路群組),選擇值同於寫入器資料庫執行個體的子網路群組。必要時,建立新的子網路群組。

    • Availability zone (可用區域) 中,選擇與寫入器資料庫執行個體相同的區域。

    • VPC Security Group (VPC 安全群組) 中,請選擇與寫入器資料庫執行個體相同的群組。

  4. 為來源建立一個 AWS DMS 端點。

    使用下列設定,將發佈者指定為來源端點︰

    • Endpoint type (端點類型) 中,選擇 Source (來源)

    • 選擇 Select RDS DB Instance (選取 RDS 資料庫執行個體)

    • RDS Instance (RDS 執行個體) 中,選擇發佈者的寫入器資料庫執行個體的資料庫標識符。

    • Source engine (來源引擎) 中,選擇 postgres

  5. 為目標建立一個 AWS DMS 端點。

    使用下列設定,將發佈者指定為目標端點︰

    • Endpoint type (端點類型) 中,選擇 Target (目標)

    • 選擇 Select RDS DB Instance (選取 RDS 資料庫執行個體)

    • RDS Instance (RDS 執行個體) 中,選擇發佈者資料庫執行個體的資料庫識別符。

    • Source engine (來源引擎) 中選擇一個值。例如,如果訂閱者為一 RDS PostgreSQL 資料庫,則選擇 postgres。如果訂閱者是 Aurora PostgreSQL 資料庫,請選擇 aurora-postgresql

  6. 建立 AWS DMS 資料庫遷移任務。

    您使用資料庫遷移任務指定要遷移哪一個資料庫資料表,使用目標結構描述映射資料,並於目標資料庫上建立新資料表。至少將下列設定使用於 Task configuration (任務組態)

    • Replication instance (複寫執行個體) 中,選擇您在先前步驟中建立的複寫執行個體。

    • Source database endpoint (來源資料庫端點) 中,選擇您在先前步驟中建立的發佈者來源。

    • Target database endpoint (目標資料庫端點) 中,選擇您在先前步驟中建立的訂閱者目標。

    其餘的任務細節端視您的遷移專案而定。如需指定 DMS 任務所有細節的詳細資訊,請參閱 AWS Database Migration Service 使用者指南中的使用 AWS DMS 任務

AWS DMS 建立任務後,便會開始將資料從發佈者遷移到訂閱者。