串流複寫如何用於不同的 RDS for PostgreSQL 版本 - Amazon Relational Database Service

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

串流複寫如何用於不同的 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、14 和 15 版的預設值為 20。

  • 第 16 版和更高版本的預設值為 35。

此參數應設定為略高於僅供讀取複本的實際數量。若此參數對僅供讀取複本數量設定過低,則複寫會停止。

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

注意

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 版 AWS 區域 的 RDS for PostgreSQL 資料庫執行個體,因此不會使用複寫槽。 PostgreSQL 對於執行早於 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 因記憶體不足而將複本重新開機,我們建議採取滾動式重新開機的方式將參數變更套用至每個複本。當您設定參數時,必須套用下列規則:

  • 增加參數值:

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

  • 增加參數值:

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