跳至內容

如何解決 Amazon RDS for PostgreSQL 資料庫執行個體中的複寫延遲問題?

2 分的閱讀內容
0

我想要解決 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 資料庫執行個體中的複寫延遲問題。

簡短說明

如果 RDS for PostgreSQL 讀取複寫追不上主要執行個體,就會出現複寫延遲。

讀取複寫透過 PostgreSQL 原生串流複寫保持同步。讀取複寫上的 Write Ahead Log (WAL) 接收器會向主要執行個體請求 WAL 資料。如果主要執行個體上的 WAL 傳送程式找不到所請求的 WAL 資料,就會將錯誤傳送至次要執行個體。接著,RDS for PostgreSQL 會嘗試從 Amazon Simple Storage Service (Amazon S3) 復原封存的 WAL 資料。如果您從主要執行個體移除 WAL,複寫將無法繼續,因為 Amazon S3 不支援跨區域複本復原。

如需更多資訊,請參閱使用 Amazon RDS for PostgreSQL 的讀取複寫

**注意:**以下解決方法適用於串流複寫問題。如需邏輯複寫的資訊,請參閱如何使用邏輯複寫在 Amazon RDS for PostgreSQL 資料庫執行個體之間複寫資料表?

解決方法

找出複寫問題

若要判斷您的特定複寫問題,請檢閱以下指標:

  • Amazon CloudWatch 中的 ReplicaLag: 此指標會測量讀取複寫落後於來源資料庫執行個體的秒數。
  • Amazon Aurora 和 RDS 主控台中的複寫狀態: 如果複寫停止,此欄位會變更為錯誤
  • 在 PostgreSQL 14.1 版及更新版本中使用複寫插槽時的 oldestreplicationslotlag: 此指標會顯示延遲最久的複本尚未接收的 WAL 資料量 (以位元組為單位)。

您也可以檢閱控制 PostgreSQL 複寫的參數

當複寫延遲增加時,您可能會收到類似以下的事件訊息:

「Streaming replication has stopped.」 此錯誤表示主要執行個體與複本執行個體之間的串流複寫失敗。複寫會切換為從 Amazon S3 中的封存重播功能。

「Streaming replication has been terminated.」 此錯誤會在複寫連續停止 30 天後發生。Amazon RDS 會終止複寫,以避免儲存空間使用過量。

**注意:**複寫停止後,讀取複寫執行個體仍可使用,但您無法繼續複寫。若要從此狀態復原,請重新建立讀取複寫。

檢查組態不一致

最佳實務是將讀取複寫設定為符合或高於主要執行個體的規格。較小的執行個體類別或不同的儲存類型都可能造成延遲。複本必須處理與主要執行個體相同的寫入工作負載,也必須處理讀取查詢。如有需要,請修改讀取複寫執行個體

檢閱主要執行個體寫入負載與複本讀取負載

主要執行個體上的寫入作業會產生許多 WAL 檔案。若要識別寫入壓力,請監控以下 CloudWatch 指標與增強型監控值:

  • TransactionLogsDiskUsage
  • TransactionLogsGeneration
  • WriteIOPS
  • WriteThroughput
  • WriteLatency

檢查您的資料庫執行個體類別類型是否有輸送量瓶頸。若要避免問題,請將寫入活動分散到多個交易中。您可以針對 WriteLatencyWriteIOPS 設定 CloudWatch 警示,以識別來源執行個體上的大量寫入。

複本上的高讀取活動可能會拖慢 WAL 檔案重播。若要分析高工作負載並檢查資源爭用,請在複本執行個體上使用 CloudWatch 指標或增強型監控。如有需要,請將讀取流量分散到多個讀取複寫。

監控資料表鎖定

當您在主要執行個體上執行這些命令時,RDS for PostgreSQL 會處理 Access Exclusive 鎖定: 不搭配 CONCURRENTLYDROP TABLETRUNCATEREINDEXVACUUM FULLREFRESH MATERIALIZED VIEW。如需更多資訊,請參閱 PostgreSQL 網站上的明確鎖定

Access Exclusive 鎖定會在鎖定持有期間阻止其他交易存取該資料表。資料表會維持鎖定,直到交易結束。WAL 會記錄鎖定活動,讀取複寫則會重播並保留該活動。資料表在 Access Exclusive 鎖定下維持的時間越長,複寫延遲也會越久。

為避免此問題,最佳實務是定期查詢 pg_lockspg_stat_activity 目錄資料表。

若要監控鎖定,請執行以下命令:

SELECT pid, usename, pg_blocking_pids(pid) AS blocked_by, QUERY AS blocked_query FROM pg_stat_activity
WHERE cardinality(pg_blocking_pids(pid)) > 0;

輸出會顯示遭封鎖查詢及其遭封鎖程序的資訊。

檢查 RDS for PostgreSQL 複寫參數

若要避免複寫問題,請檢閱控制 RDS for PostgreSQL 複寫的參數。如有需要,請更新參數值。

若要容納您的複寫連線總數,您可以設定 max_replication_slots。預設值會依執行個體類別而有所不同。此值必須等於或大於您的複本總數。

複本執行個體上的 max_standby_streaming_delaymax_standby_archive_delay 參數可協助完成長時間執行的讀取查詢。如果在複本上執行的讀取查詢修改來源資料,這些參數會暫停 WAL 重播。如果您將值設定為 -1,WAL 重播會等到讀取查詢完成。不過,此暫停可能會無限期增加複寫延遲,並因 WAL 累積而導致來源端大量消耗儲存空間。

為了維持複寫穩定性,RDS for PostgreSQL 會自動管理多個參數:max_connectionsmax_worker_processesmax_wal_sendersmax_prepared_transactionsmax_locks_per_transaction。在您的複本上,RDS for PostgreSQL 會將這些參數設定為符合或高於主要執行個體值。

hot_standby_feedback 參數可讓複本向主要執行個體回報查詢衝突。RDS for PostgreSQL 預設會關閉此參數。如果您啟用此參數,主要執行個體上的資料表可能會發生膨脹。如果您收到以下錯誤訊息,請使用 hot_standby_feedback 參數:

「ERROR: canceling statement due to conflict with recover.Detail: User query might have needed to see row versions that must be removed」

檢閱 RDS for PostgreSQL 複寫與跨區域讀取複寫的最佳實務

您也可能因以下原因遇到複寫延遲:

如需這些案例的資訊,請參閱Amazon RDS PostgreSQL 複寫的最佳實務Amazon RDS for PostgreSQL 跨區域讀取複寫的最佳實務

監控交易

若要檢查主要執行個體上可能影響複寫的作用中交易,請執行以下命令:

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' OR state='idle in transaction';

輸出會顯示目前執行中的交易及其持續時間。長時間執行的交易可能會影響複寫效能。

若要停止有問題的查詢,請執行以下命令:

SELECT pg_terminate_backend(PID);

**注意:**將 PID 替換為您要停止的查詢處理程序 ID 編號。

相關資訊

PostgreSQL 網站上的複寫

使用邏輯複寫將受管 Amazon RDS for PostgreSQL 和 Amazon Aurora 複寫至自行管理的 PostgreSQL

AWS 官方已更新 7 個月前