使用 Amazon RDS for PostgreSQL 的僅供讀取複本 - Amazon Relational Database Service

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

使用 Amazon RDS for PostgreSQL 的僅供讀取複本

您可以將僅供讀取複本新增至執行個體,以擴展 Amazon RDS for PostgreSQL 資料庫執行個體的讀取。與其他 Amazon RDS 資料庫引擎一樣,RDS for PostgreSQL 使用 PostgreSQL 的原生複寫機制,讓僅供讀取複本與來源資料庫的變更保持最新狀態。如需僅供讀取複本與 Amazon RDS 的一般資訊,請參閱 使用資料庫執行個體僅供讀取複本

有關如何利用 RDS for PostgreSQL 處理僅供讀取複本,以下提供具體資訊。

僅供讀取複本上的邏輯解碼

RDS for PostgreSQL 支援使用 PostgreSQL 16.1 從待命進行邏輯複寫。這可讓您從唯讀待命建立邏輯解碼,以減少主要資料庫執行個體的負載。您可以為需要跨多個系統同步資料的應用程式實現更高的可用性。此功能可提升資料倉儲和資料分析的效能。

此外,特定待命上的複寫槽會持續將該待命提升為主要待命。這表示,如果主要資料庫執行個體容錯移轉或將待命提升為新的主要執行個體,複寫槽將保留,且之前的待命訂閱者不會受到影響。

在僅供讀取複本上建立邏輯解碼
  1. 開啟邏輯複寫 – 若要在待命時建立邏輯解碼,您必須在來源資料庫執行個體及其實體複本上開啟邏輯複寫。如需詳細資訊,請參閱使用 PostgreSQL 的僅供讀取複本組態

    • 若要開啟新建立 RDS for PostgreSQL 資料庫執行個體的邏輯複寫 – 建立新的資料庫自訂參數群組,並將靜態參數rds.logical_replication設定為 1。然後,將此資料庫參數群組與來源資料庫執行個體及其實體僅供讀取複本建立關聯。如需詳細資訊,請參閱將資料庫參數群組與 RDS 亞馬遜 Aurora 中的資料庫執行個體建立關聯

    • 若要開啟現有 RDS for PostgreSQL 資料庫執行個體的邏輯複寫 – 修改來源資料庫執行個體的資料庫自訂參數群組及其實體僅供讀取複本,將靜態參數設定為 rds.logical_replication 1。如需詳細資訊,請參閱修改 Amazon RDS Amazon 數據庫參數組中的參數

    注意

    您必須重新啟動資料庫執行個體,才能套用這些參數變更。

    您可以使用下列查詢來驗證來源資料庫執行個體及其實體僅供讀取複本wal_levelrds.logical_replication上 和 的值。

    Postgres=>SELECT name,setting FROM pg_settings WHERE name IN ('wal_level','rds.logical_replication'); name | setting -------------------------+--------- rds.logical_replication | on wal_level | logical (2 rows)
  2. 在來源資料庫中建立資料表 – 連線至來源資料庫執行個體中的資料庫。如需詳細資訊,請參閱連線至執行 PostgreSQL 資料庫引擎的資料庫執行個體

    使用下列查詢在來源資料庫中建立資料表,並插入值:

    Postgres=>CREATE TABLE LR_test (a int PRIMARY KEY); CREATE TABLE
    Postgres=>INSERT INTO LR_test VALUES (generate_series(1,10000)); INSERT 0 10000
  3. 建立來源資料表的發佈 – 使用下列查詢,在來源資料庫執行個體上建立資料表的發佈。

    Postgres=>CREATE PUBLICATION testpub FOR TABLE LR_test; CREATE PUBLICATION

    使用 SELECT 查詢來驗證在來源資料庫執行個體和實體僅供讀取複本執行個體上建立的發佈詳細資訊。

    Postgres=>SELECT * from pg_publication; oid | pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubtruncate | pubviaroot -------+---------+----------+--------------+-----------+-----------+-----------+-------------+------------ 16429 | testpub | 16413 | f | t | t | t | t | f (1 row)
  4. 從邏輯複本執行個體建立訂閱 – 建立另一個 RDS for PostgreSQL 資料庫執行個體做為邏輯複本執行個體。請確定 VPC 已正確設定,以確保此邏輯複本執行個體可存取實體僅供讀取複本執行個體。如需詳細資訊,請參閱Amazon VPC 和 RDSAmazon。如果您的來源資料庫執行個體閒置,可能會發生連線問題,且主要 不會將資料傳送至待命。

    Postgres=>CREATE SUBSCRIPTION testsub CONNECTION 'host=Physical replica host name port=port dbname=source_db_name user=user password=password' PUBLICATION testpub; NOTICE: created replication slot "testsub" on publisher CREATE SUBSCRIPTION
    Postgres=>CREATE TABLE LR_test (a int PRIMARY KEY); CREATE TABLE

    使用 SELECT 查詢來驗證邏輯複本執行個體上的訂閱詳細資訊。

    Postgres=>SELECT oid,subname,subenabled,subslotname,subpublications FROM pg_subscription; oid | subname | subenabled | subslotname | subpublications -------+---------+------------+-------------+----------------- 16429 | testsub | t | testsub | {testpub} (1 row) postgres=> select count(*) from LR_test; count ------- 10000 (1 row)
  5. 檢查邏輯複寫槽狀態 – 您只能查看來源資料庫執行個體上的實體複寫槽。

    Postgres=>select slot_name, slot_type, confirmed_flush_lsn from pg_replication_slots; slot_name | slot_type | confirmed_flush_lsn ---------------------------------------------+-----------+--------------------- rds_us_west_2_db_dhqfsmo5wbbjqrn3m6b6ivdhu4 | physical | (1 row)

    不過,在您的僅供讀取複本執行個體上,您可以看到邏輯複寫槽和confirmed_flush_lsn值隨著應用程式主動使用邏輯變更而變更。

    Postgres=>select slot_name, slot_type, confirmed_flush_lsn from pg_replication_slots; slot_name | slot_type | confirmed_flush_lsn -----------+-----------+--------------------- testsub | logical | 0/500002F0 (1 row)
    Postgres=>select slot_name, slot_type, confirmed_flush_lsn from pg_replication_slots; slot_name | slot_type | confirmed_flush_lsn -----------+-----------+--------------------- testsub | logical | 0/5413F5C0 (1 row)

使用 PostgreSQL 的僅供讀取複本限制

下列為 PostgreSQL 僅供讀取複本的限制:

  • PostgreSQL 僅供讀取複本皆為唯讀。雖然僅供讀取複本不是可寫入資料庫執行個體,但您可將其提升為獨立的 RDS for PostgreSQL 資料庫執行個體。但此程序是不可逆的。

  • 若 RDS for PostgreSQL 資料庫執行個體執行早於 14.1 的 PostgreSQL 版本,則無法從另一個僅供讀取複本建立僅供讀取複本。RDS for PostgreSQL 僅支援 RDS for PostgreSQL 14.1 版和更新版本上的階層式僅供讀取複本。如需詳細資訊,請參閱使用具 RDS for PostgreSQL 的階層式僅供讀取複本

  • 若您提升 PostgreSQL 僅供讀取複本,則會成為可寫入資料庫執行個體。其會停止從來源資料庫執行個體接收預寫日誌 (WAL) 檔案,且不再是個唯讀執行個體。您可從提升的資料庫執行個體建立新的僅供讀取複本,如同對任何 RDS for PostgreSQL 資料庫執行個體所做的一樣。如需詳細資訊,請參閱提升僅供讀取複本為獨立的資料庫執行個體

  • 如果您從複寫鏈 (一系列串聯僅供讀取複本) 中提升 PostgreSQL 僅供讀取複本,則任何現有的下游僅供讀取複本都會繼續自動從提升的執行個體接收 WAL 檔案。如需詳細資訊,請參閱使用具 RDS for PostgreSQL 的階層式僅供讀取複本

  • 如果來源資料庫執行個體上未發生使用者交易,則 PostgreSQL 僅供讀取複本會回報最多五分鐘的複寫延遲。複本滯後的計算方式為 currentTime - lastCommitedTransactionTimestamp,亦即未處理任何交易時,複本滯後的值會增加一段時間,直到預寫日誌 (WAL) 區段切換為止。根據預設,RDS for PostgreSQL 每 5 分鐘切換一次 WAL 區段,這會導致交易記錄和報告的延遲減少。

  • 您無法為早於 14.1 的 RDS for PostgreSQL 版本開啟 PostgreSQL 僅供讀取複本的自動備份。RDS for PostgreSQL 14.1 及更新版本僅支援僅供讀取複本的自動備份。對於 RDS for PostgreSQL 13 及更早版本,若您想要備份僅供讀取複本,則請從僅供讀取複本建立快照。

  • 僅供讀取複本不支援時間點復原 (PITR)。您僅可使用具主 (寫入器) 執行個體的 PITR,而非僅供讀取複本。如需進一步了解,請參閱 將資料庫執行個體還原至 Amazon 的指定時間 RDS

  • PostgreSQL 第 12 版及更低版本的僅供讀取複本會在 60-90 天維護時段期間自動重新啟動,以套用密碼輪換。如果複本在排程重新啟動之前失去與來源的連線,仍會重新啟動以繼續複寫。對於 PostgreSQL 第 13 版及更新版本,僅供讀取複本可能會在密碼輪換過程中發生短暫的複寫中斷連線和重新連線。

使用 PostgreSQL 的僅供讀取複本組態

RDS for PostgreSQL 會使用 PostgreSQL 原生串流複寫來建立來源資料庫執行個體的唯讀複本。此僅供讀取複本資料庫執行個體是個非同步建立之來源資料庫執行個體的實體複寫。此由將預寫日誌 (WAL) 資料從來源資料庫執行個體傳輸至僅供讀取複本的特殊連線所建立。如需詳細資訊,請參閱 PostgreSQL 文件中的串流複寫

PostgreSQL 會將資料庫變更非同步串流至此安全連接,如同其在來源資料庫執行個體上所進行般。您可透過將 ssl 參數設定為 1,對用戶端應用程式至來源資料庫執行個體或任何僅供讀取複本的通訊進行加密。如需詳細資訊,請參閱 將 SSL 與 PostgreSQL 資料庫執行個體搭配使用

PostgreSQL 會使用複寫角色來執行串流複寫。角色有優先權,但無法用來修改任何資料。PostgreSQL 使用單一程序來處理複寫。

您可在不影響來源資料庫執行個體的作業或使用者的狀況下建立 PostgreSQL 僅供讀取複本。Amazon RDS 會為來源資料庫執行個體和僅供讀取複本設定必要的參數和權限,而不會影響服務。將會拍攝來源資料庫執行個體的快照,而此快照會用來建立僅供讀取複本。如於未來的某個時間點刪除僅供讀取複本,則不會發生停機。

您可以從相同區域內的一個來源資料庫執行個體建立至多 15 個僅供讀取複本。從 RDS for PostgreSQL 14.1 開始,您還可從來源資料庫執行個體以鏈結 (階層式) 的形式建立最多三個層級的僅供讀取複本。如需詳細資訊,請參閱使用具 RDS for PostgreSQL 的階層式僅供讀取複本。在所有情況下,來源資料庫執行個體皆需設定自動備份。您可將資料庫執行個體上的備份保留期設定為 0 以外的任何值以進行此作業。如需詳細資訊,請參閱建立僅供讀取複本

您可於與來源資料庫執行個體相同的 AWS 區域 中,建立 RDS for PostgreSQL資料庫執行個體的僅供讀取複本。此稱為區域內複寫。您也可以在與來源資料庫執行個體 AWS 區域 不同的 中建立僅供讀取複本。此稱為跨區域複寫。如需設定跨區域僅供讀取複本的相關資訊,請參閱 在不同的 中建立僅供讀取複本 AWS 區域。支援「區域內」和「跨區域」複寫程序的各種機制會依 RDS for PostgreSQL 版本而略有不同,此說明於 串流複寫如何用於不同的 RDS for PostgreSQL 版本 中。

若希望複寫作業順利運作,每個僅供讀取複本具備的運算和儲存資源數量應與來源資料庫執行個體相同。若您擴展來源資料庫執行個體,也請務必擴展僅供讀取複本。

若 Amazon RDS 阻止僅供讀取複本啟動,則期將會覆寫僅供讀取複本上任何不相容的參數。舉例來說,假設在資料庫執行個體的 max_connections 參數值高於僅供讀取複本上的值。在此情況下,Amazon RDS 會更新僅供讀取複本上的參數為與來源資料庫執行個體上相同的值。

RDS for PostgreSQL 僅供讀取複本可存取外部資料庫,這些資料庫可經由來源資料庫執行個體上的外部資料包裝函式 (FDW) 取得。例如,假設 RDS for PostgreSQL 資料庫執行個體使用 mysql_fdw 包裝函式來存取 RDS for MySQL 的資料。若是如此,您的僅供讀取複本也可存取該資料。其他受支援的 FDW 包括 oracle_fdwpostgres_fdwtds_fdw。如需詳細資訊,請參閱與支持的外國數據包裝工作 SQL

使用具多可用區域組態的 RDS for PostgreSQL 僅供讀取複本

您可以從單一可用區域或多可用區域的資料庫執行個體建立僅供讀取複本。您可使用異地同步備份部署,利用備用複本來改善重要資料的耐用性和可用性。若來源資料庫進行容錯移轉,則備用複本是個可承擔工作負載的專用僅供讀取複本。您無法使用備用複本來提供讀取流量。但是,您可從高流量的多可用區域資料庫執行個體建立僅供讀取複本,藉此卸載唯讀查詢。若要進一步了解異地同步備份部署,請參閱 Amazon 的多可用區域資料庫執行個體部署 RDS

若異地同步備份部署的來源資料庫執行個體容錯移轉至備用複本,則相關聯的僅供讀取複本都會切換為使用備用複本 (現為主要複本) 作為其複寫來源。僅供讀取複本可能需要重新啟動,視 RDS for PostgreSQL 版本而定,如下所示:

  • PostgreSQL 13 及更新版本 – 無須重新啟動。僅供讀取複本將會自動與新的主要複本同步。但在某些狀況下,您的用戶端應用程式可能會快取僅供讀取複本的網域名稱服務 (DNS) 詳細資訊。若是如此,請將存留時間 (TTL) 值設定為少於 30 秒。這麼做可以防止僅供讀取複本保留過時的 IP 地址 (如此,可防止其與新的主要複本同步)。如需進一步了解有關此及其他最佳實務的詳細資訊,請參閱 Amazon RDS 基本操作指南

  • PostgreSQL 12 及所有早期版本 – 僅供讀取複本在容錯移轉至備用複本後會自動重新啟動,因為備用 (現為主要) 具有不同的 IP 地址和不同的執行個體名稱。重新啟動僅供讀取複本與新的主要複本同步。

如需進一步了解容錯移轉,請參閱 透過 Amazon 的多可用區域資料庫執行個體失敗 RDS。若要進一步了解僅供讀取複本如何在異地同步備份部署中運作,請參閱 使用資料庫執行個體僅供讀取複本

如要提供僅供讀取複本的容錯移轉支援,您可將僅供讀取複本建立為多可用區域資料庫執行個體,則 Amazon RDS 會在另一個可用區域 (AZ) 中建立您複本的待命複本。建立您的僅供讀取複本做為異地同步備份部署資料庫執行個體,與來源資料庫是否為異地同步備份部署資料庫執行個體無關。

使用具 RDS for PostgreSQL 的階層式僅供讀取複本

從 14.1 版開始,RDS for PostgreSQL 支援階層式僅供讀取複本。利用階層式僅供讀取複本,您可以擴展讀取,無須增加來源 RDS for PostgreSQL 資料庫執行個體的額外負荷。來源資料庫執行個體不會將 WAL 日誌的更新傳送至每個僅供讀取複本。反之,階層式系列中的每個僅供讀取複本都會將 WAL 日誌更新傳送至系列中的下一個僅供讀取複本。此會減少來源資料庫執行個體的負擔。

利用階層式僅供讀取複本,您的 RDS for PostgreSQL 資料庫執行個體會將 WAL 資料傳送至鏈結中的第一個僅供讀取複本。之後,該僅供讀取複本會將 WAL 資料傳送至鏈結中的第二個複本,依此類推。最終結果是鏈結中的所有僅供讀取複本皆具有來自 RDS for PostgreSQL 資料庫執行個體的變更,但並無僅在來源資料庫執行個體上的額外負荷。

您可從來源 RDS for PostgreSQL 資料庫執行個體的鏈結中建立一系列最多三個僅供讀取複本。例如,假設您有一個 RDS for PostgreSQL 14.1 資料庫執行個體 rpg-db-main。您可以執行下列作業:

  • rpg-db-main 開始,建立鏈結中的第一個僅供讀取複本 read-replica-1

  • 接下來,從 read-replica-1,建立鏈結中的下一個僅供讀取複本 read-replica-2

  • 最後,從 read-replica-2,建立鏈結中的第三個僅供讀取複本 read-replica-3

除了 rpg-db-main 系列中的第三個階層式僅供讀取複本之外,您無法建立另一個僅供讀取複本。從 RDS for PostgreSQL 來源資料庫執行個體至一系列階層式僅供讀取複本尾端的完整執行個體系列最多可包含四個資料庫執行個體。

若要使階層式僅供讀取複本正常運作,請開啟 RDS for PostgreSQL 上的自動備份。首先建立僅供讀取複本,然後開啟 RDS for PostgreSQL 資料庫執行個體上的自動備份。此程序與其他 Amazon RDS 資料庫引擎相同。如需詳細資訊,請參閱建立僅供讀取複本

與任何僅供讀取複本一樣,您可提升作為階層式一部分的僅供讀取複本。從僅供讀取複本鏈結中提升僅供讀取複本將會從鏈結中移除該僅供讀取複本。例如,假設您想要將部分工作負載從 rpg-db-main 資料庫執行個體移至新的執行個體,僅供會計部門使用。假設範例中的三個僅供讀取複本鏈結,您決定提升 read-replica-2。該鏈或受到下列影響:

  • 提升 read-replica-2 會將其從複寫鏈結中移除。

    • 其現在是一個完整的讀取/寫入資料庫執行個體。

    • 這會持續複寫至 read-replica-3,就像在提升之前所做的一樣。

  • 您的 rpg-db-main 會持續複寫至 read-replica-1

如需提升僅供讀取複本的相關詳細資訊,請參閱 提升僅供讀取複本為獨立的資料庫執行個體

注意

對於階層式僅供讀取複本,RDS for PostgreSQL 在第一個複寫層支援每個來源資料庫執行個體 15 個僅供讀取複本,而在第二和第三複寫層支援每個來源資料庫執行個體 5 個僅供讀取複本。

使用 RDS for PostgreSQL 建立跨區域串聯僅供讀取複本

RDS for PostgreSQL 支援跨區域串聯僅供讀取複本。您可以從來源資料庫執行個體建立跨區域複本,然後從中建立同區域複本。您也可以從來源資料庫執行個體建立同區域複本,然後從中建立跨區域複本。

建立跨區域複本,然後建立同區域複本

您可以使用 RDS for PostgreSQL 資料庫執行個體搭配 14.1 版或更新版本 rpg-db-main來執行下列動作:

  1. rpg-db-main(US-EAST-1) 開始,在鏈中建立第一個跨區域僅供讀取複本 read-replica-1(US-WEST-2)。

  2. 使用第一個跨區域 read-replica-1(US-WEST-2),在鏈中建立第二個僅供讀取複本 read-replica-2(US-WEST-2)。

  3. 使用 read-replica-2,在鏈結中建立第三個僅供讀取複本 read-replica-3(US-WEST-2)。

建立同區域複本,然後建立跨區域複本

您可以使用 RDS for PostgreSQL 資料庫執行個體搭配 14.1 版或更新版本 rpg-db-main來執行下列動作:

  1. rpg-db-main(US-EAST-1) 開始,建立鏈結中的第一個僅供讀取複本 read-replica-1(US-EAST-1)。

  2. 使用 read-replica-1(US-EAST-1),在鏈結中建立第一個跨區域僅供讀取複本 read-replica-2(US-WEST-2)。

  3. 使用 read-replica-2(US-WEST-2),在鏈結中建立第三個僅供讀取複本 read-replica-3(US-WEST-2)。

建立跨區域僅供讀取複本的限制
  • 資料庫複本的跨區域串聯鏈最多可跨越兩個區域,最多四個層級。四個層級包括資料庫來源和三個僅供讀取複本。

使用串聯僅供讀取複本的優點
  • 改善讀取可擴展性 – 透過將讀取查詢分散到多個複本,串聯複寫有助於平衡負載。這可降低寫入器資料庫的負載,進而改善效能,特別是在讀取密集型應用程式中。

  • 地理分佈 – 串聯複本可以位於不同的地理位置。這可降低位於遠離主要資料庫的使用者延遲,並提供本機僅供讀取複本,進而提升效能和使用者體驗。

  • 高可用性和災難復原 – 在主要伺服器故障的情況下,複本可以提升為主要伺服器,以確保連續性。 串聯複寫透過提供多層容錯移轉選項來進一步增強這一點,從而改善系統的整體彈性。

  • 彈性和模組化成長 – 隨著系統成長,可以在不同層級新增新的複本,而不需要對主要資料庫進行重大重新設定。這種模組化方法允許複寫設定可擴展且可管理的增長。

如需使用複寫優點的詳細資訊,請參閱關於雲端 SQL 中的複寫

使用跨區域僅供讀取複本的最佳實務
  • 提升複本之前,請建立其他複本。這可節省時間,並提供工作負載的高效處理。

串流複寫如何用於不同的 RDS for PostgreSQL 版本

使用 PostgreSQL 的僅供讀取複本組態 中所討論,RDS for PostgreSQL 會使用 PostgreSQL 的原生串流複寫協定,從來源資料庫執行個體傳送 WAL 資料。此將來源 WAL 資料傳送至區域內和跨區域僅供讀取複本的僅供讀取複本。在 9.4 版中,PostgreSQL 引入了實體複寫槽,作為複寫程序的支援機制。

實體複寫槽會防止來源資料庫執行個體在所有僅供讀取複本使用 WAL 資料之前移除 WAL 資料。每個僅供讀取複本在來源資料庫執行個體上都有自己的實體槽。該插槽會追蹤複本可能需要的最舊 WAL (按邏輯序號,LSN)。在所有插槽和資料庫連接皆超出給定的 WAL (LSN) 之後,該 LSN 會成為下一個檢查點移除的候選項。

Amazon RDS 使用 Amazon S3 來封存 WAL 資料。對於區域內僅供讀取複本,您可於需要時使用此封存資料復原僅供讀取複本。若來源資料庫和僅供讀取複本之間的連接因任何原因而遭中斷,您可能會這麼做的範例。

於下表中,您可以找到 PostgreSQL 版本之間的差異,及 RDS for PostgreSQL 所使用之區域內和跨區域的支援機制摘要。

版本 區域內 跨區域
PostgreSQL 14.1 和更新版本
  • 複寫槽

  • Amazon S3 封存

  • 複寫槽

PostgreSQL 13 和更低版本
  • Amazon S3 封存

  • 複寫槽

如需詳細資訊,請參閱監控和調校複寫程序

了解控制 PostgreSQL 複寫的參數

下列參數影響複寫程序,並決定僅供讀取複本與來源資料庫執行個體保持於最新狀態的程度:

max_wal_senders

max_wal_senders 參數指定來源資料庫執行個體可透過串流複寫協定同時支援的最大連接數。RDS for PostgreSQL 13 版及更新版本的預設值為 20。此參數應設定為略高於僅供讀取複本的實際數量。若此參數對僅供讀取複本數量設定過低,則複寫會停止。

如需詳細資訊,請參閱 PostgreSQL 文件的 max_wal_senders

wal_keep_segments

wal_keep_segments 參數指定來源資料庫執行個體保存於 pg_wal 目錄中預寫日誌 (WAL) 檔案的數量。預設設定為 32。

wal_keep_segments 未對您的部署設定足夠大的值,則僅供讀取複本可能遠遠落後於串流複寫停止。若該狀況發生,Amazon RDS 會產生複寫錯誤,並開始在僅供讀取複本上進行復原。透過重複播放來自 Amazon S3 的來源資料庫執行個體的封存 WAL 資料來進行此作業。此還原程序會繼續進行,直到僅供讀取複本跟上進度,以繼續串流複寫。您可於 範例:僅供讀取複本如何從複寫中斷復原 中看到 PostgreSQL 日誌所擷取的這個程序。

注意

於 PostgreSQL 13 版中,wal_keep_segments 參數稱為 wal_keep_size。其用途與 wal_keep_segments 相同,但其預設值以 MB (2048 MB) 為單位,而非檔案數。如需詳細資訊,請參閱 PostgreSQL 文件中的 wal_keep_segmentswal_keep_size

max_slot_wal_keep_size

max_slot_wal_keep_size 參數控制保留於 pg_wal 目錄中 RDS for PostgreSQL 資料庫執行個體的 WAL 資料量來處理插槽。此參數用於使用複寫插槽的組態。此參數的預設值為 -1,這表示來源資料庫執行個體上保留的 WAL 資料量並無限制。如需監控複寫槽的相關資訊,請參 監控 RDS for PostgreSQL 資料庫執行個體的複寫槽

如需此參數的詳細資訊,請參閱 PostgreSQL 文件中的 max_slot_wal_keep_size

當提供 WAL 資料給僅供讀取複本的串流中斷時,PostgreSQL 將切換為復原模式。它會使用來自 Amazon S3 的封存 WAL 資料,或使用與複寫槽相關聯的 WAL 資料,來還原僅供讀取複本。此程序完成時,PostgreSQL 會重新建立串流複寫。

範例:僅供讀取複本如何從複寫中斷復原

於下列範例中,您可以找到示範僅供讀取複本復原程序的日誌詳細資訊。範例來自執行 PostgreSQL 12.9 版的 RDS for PostgreSQL PostgreSQL 資料庫執行個體,該執行個體與來源資料庫 AWS 區域 相同,因此不會使用複寫插槽。對於執行早於 14.1 版且具有區域內僅供讀取複本之 PostgreSQL 的其他 RDS for PostgreSQL 資料庫執行個體,復原程序是相同的。

當僅供讀取複本與來源資料庫執行個體失去連線時,Amazon RDS 會在日誌中將問題記錄為 FATAL: could not receive data from WAL stream 訊息與 ERROR: requested WAL segment ... has already been removed。如粗體行中所示,Amazon RDS 透過重複播放封存的 WAL 檔案來還原複本。

2014-11-07 19:01:10 UTC::@:[23180]:DEBUG:  switched WAL source from archive to stream after failure 2014-11-07 19:01:10 UTC::@:[11575]:LOG: started streaming WAL from primary at 1A/D3000000 on timeline 1 2014-11-07 19:01:10 UTC::@:[11575]:FATAL: could not receive data from WAL stream: ERROR:  requested WAL segment 000000010000001A000000D3 has already been removed 2014-11-07 19:01:10 UTC::@:[23180]:DEBUG: could not restore file "00000002.history" from archive: return code 0 2014-11-07 19:01:15 UTC::@:[23180]:DEBUG: switched WAL source from stream to archive after failure recovering 000000010000001A000000D3 2014-11-07 19:01:16 UTC::@:[23180]:LOG:  restored log file "000000010000001A000000D3" from archive

當 Amazon RDS 在複本上重複播放足夠的封存 WAL 資料以補足空間,讓僅供讀取複本再次開始串流。恢復串流時,Amazon RDS 會將一個項目寫入日誌檔案中,類似下列內容。

2014-11-07 19:41:36 UTC::@:[24714]:LOG:started streaming WAL from primary at 1B/B6000000 on timeline 1

設定控制共用記憶體的參數

您設定的參數會決定用於追蹤交易 ID、鎖定和預備交易的共用記憶體大小。待命執行個體的共用記憶體結構必須等於或大於主要執行個體的共用記憶體結構。這樣可以確保前者在復原過程中不會耗盡共用記憶體。如果複本上的參數值小於主要複本上的參數值,Amazon RDS 將自動調整複本參數並重新啟動引擎。

受影響的參數包括:

  • max_connections

  • max_worker_processes

  • max_wal_senders

  • max_prepared_transactions

  • max_locks_per_transaction

為避免 RDS 因記憶體不足而將複本重新開機,我們建議採取滾動式重新開機的方式將參數變更套用至每個複本。當您設定參數時,必須套用下列規則:

  • 增加參數值:

    • 您應一律先增加所有僅供讀取複本的參數值,並執行所有複本的滾動式重新開機。然後再將參數變更套用至主要執行個體,並重新開機。

  • 增加參數值:

    • 您應該先減少主要執行個體的參數值,並執行重新開機。然後再將參數變更套用至所有相關聯的僅供讀取複本,並執行滾動式重新開機。

監控和調校複寫程序

我們強烈建議您定期監控 RDS for PostgreSQL 資料庫執行個體和僅供讀取複本。您需要確保您的僅供讀取複本與來源資料庫執行個體上的變更保持一致。當複寫程序發生中斷時,Amazon RDS 會通透地復原您的僅供讀取複本。但,最好完全避免需要復原。使用複寫槽進行復原比使用 Amazon S3 封存更快,但任何復原程序皆會影響讀取效能。

如要確定僅供讀取複本與來源資料庫執行個體保持一致的程度,可執行下列作業:

  • 檢查來源資料庫執行個體和複本間的 ReplicaLag 數量。複本延遲指的是讀取複本落後於其來源資料庫執行個體的時間量 (以秒為單位)。此指標會報告下列查詢結果。

    SELECT extract(epoch from now() - pg_last_xact_replay_timestamp()) AS "ReplicaLag";

    複本延遲可表示僅供讀取複本與來源資料庫執行個體保持一致的程度。這是來源資料庫執行個體與特定讀取執行個體之間的延遲量。複本延遲值較高可能表示來源資料庫執行個體與其僅供讀取複本所使用的資料庫執行個體類別或儲存體類型 (或兩者) 不相符。資料庫來源執行個體和所有僅供讀取複本的資料庫執行個體類別和儲存體類型應該相同。

    複本延遲也可為儲存體類型連線問題的結果。您可以在 Amazon CloudWatch 中透過檢視 Amazon RDS ReplicaLag 指標來監控複寫延遲。如需進一步了解 ReplicaLag 和 Amazon RDS 的其他指標,請參閱 Amazon RDS 的 Amazon CloudWatch 指標

  • 檢查 PostgreSQL 日誌,以取得可用來調整設定的資訊。PostgreSQL 日誌會在每個檢查點擷取回收的交易日誌檔案數量,如下列範例所示。

    2014-11-07 19:59:35 UTC::@:[26820]:LOG:  checkpoint complete: wrote 376 buffers (0.2%); 0 transaction log file(s) added, 0 removed, 1 recycled; write=35.681 s, sync=0.013 s, total=35.703 s; sync files=10, longest=0.013 s, average=0.001 s

    您可以使用這些資訊來確定指定時段內會回收多少個交易檔案。隨後,您可視需要變更 wal_keep_segments 的設定。例如,假設 PostgreSQL 日誌在 checkpoint complete 中顯示 35 recycled,間隔為 5 分鐘。於本案例中,wal_keep_segments 預設值 32 不足以跟上串流活動的進度,因此您應提高此參數的值。

  • 使用 Amazon CloudWatch 來監控可預測複寫問題的指標。您可使用 Amazon CloudWatch 檢查已收集的指標,而非直接分析 PostgreSQL 日誌。例如,您可以檢查 TransactionLogsGeneration 指標值,來查看來源資料庫執行個體所產生的 WAL 資料量。在某些狀況下,資料庫執行個體上的工作負載可能會產生大量 WAL 資料。若是如此,您可能需要變更來源資料庫執行個體和僅供讀取複本的資料庫執行個體類別。使用具有高 (10 Gbps) 網路效能的執行個體類別可減少複本延遲。

監控 RDS for PostgreSQL 資料庫執行個體的複寫槽

RDS for PostgreSQL 的所有版本皆會對跨區域僅供讀取複本使用複寫槽。RDS for PostgreSQL 14.1 版和較新版本皆會對區域內僅供讀取複本使用複寫槽。區域內僅供讀取複本還會使用 Amazon S3 來封存 WAL 資料。換言之,若您的資料庫執行個體和僅供讀取複本執行 PostgreSQL 14.1 版或更新版本,則複寫槽和 Amazon S3 封存皆可用於復原僅供讀取複本。使用其複寫槽復原僅供讀取複本比從 Amazon S3 封存復原更快。因此,我們建議您監控複寫槽和及相關的指標。

您可檢視 RDS for PostgreSQL 資料庫執行個體上的複寫槽,方法是查詢 pg_replication_slots 檢視,如下所示。

postgres=> SELECT * FROM pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn | wal_status | safe_wal_size | two_phase ---------------------------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------+------------+---------------+----------- rds_us_west_1_db_555555555 | | physical | | | f | t | 13194 | | | 23/D8000060 | | reserved | | f (1 row)

reserved 值的 wal_status 表示插槽持有的 WAL 資料量在 max_wal_size 參數的範圍內。換言之,複寫槽的大小合適。其他可能的狀態值如下:

  • extended – 插槽超過 max_wal_size 設定,但會保留 WAL 資料。

  • unreserved – 插槽不再具有所有必要的 WAL 資料。其中一些將於下一個檢查點移除。

  • lost – 部分必要 WAL 資料已遭移除。該插槽不再可用。

unreservedlost 狀態只會wal_statusmax_slot_wal_keep_size為非負時顯示。

pg_replication_slots 檢視顯示了複寫槽的目前狀態。如要評估複寫槽的效能,您可使用 Amazon CloudWatch 並監控下列指標:

  • OldestReplicationSlotLag – 列出延遲最多的插槽,也就是落後主要插槽最多的插槽。此延遲可與僅供讀取複本相關聯,但亦可與連線相關聯。

  • TransactionLogsDiskUsage – 顯示 WAL 資料正在使用多少儲存空間。僅供讀取複本大幅延遲時,此指標的值可能會顯著提高。

若要進一步了解如何使用 Amazon CloudWatch 及其用於 RDS for PostgreSQL 的指標,請參閱 使用 Amazon 監控 RDS 指標 CloudWatch。如需有關監視 RDS for PostgreSQL 資料庫執行個體上串流複寫的詳細資訊,請參閱 AWS 資料庫部落格上的 Amazon RDS PostgreSQL 複寫的最佳實務

RDS for PostgreSQL 僅供讀取複本的故障診斷

您可以在下面找到一些常見 RDS for PostgreSQL 僅供讀取複本問題的疑難排解想法。

終止導致僅供讀取複本延遲的查詢

在資料庫中長時間執行處於作用中或閒置狀態的交易,可能會干擾 WAL 複寫程序,進而增加複寫延遲。因此,請務必使用 PostgreSQL pg_stat_activity 檢視來監控這些交易的執行時間。

在主要執行個體上執行類似下列的查詢,以尋找長時間執行的查詢程序 ID (PID):

SELECT datname, pid,usename, client_addr, backend_start, xact_start, current_timestamp - xact_start AS xact_runtime, state, backend_xmin FROM pg_stat_activity WHERE state='active';
SELECT now() - state_change as idle_in_transaction_duration, now() - xact_start as xact_duration,* FROM pg_stat_activity WHERE state = 'idle in transaction' AND xact_start is not null ORDER BY 1 DESC;

識別查詢的 PID 之後,您可以選擇結束查詢。

在主要執行個體上執行類似下列的查詢,以終止長時間執行的查詢:

SELECT pg_terminate_backend(PID);