監控 Aurora PostgreSQL 邏輯複寫的全部寫入快取和邏輯槽 - Amazon Aurora

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

監控 Aurora PostgreSQL 邏輯複寫的全部寫入快取和邏輯槽

監控邏輯複寫全部寫入快取並管理邏輯槽,以改善 Aurora PostgreSQL 資料庫叢集的效能。以下請見全部寫入快取和邏輯槽的詳細資訊。

監控 Aurora PostgreSQL 邏輯複寫全部寫入快取

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

全部寫入快取可將對 Aurora 儲存層的依賴降至最低。Aurora PostgreSQL 不會持續寫入此層和從中讀取,而是會使用緩衝區來快取邏輯 WAL 串流,以便在複寫過程中使用,進而減少對存取磁碟的需求。此緩衝區是邏輯複寫所使用的原生 PostgreSQL 快取,其會在 Aurora PostgreSQL 資料庫叢集參數中識別為 rds.logical_wal_cache

當使用邏輯複寫搭配 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 的值。考慮下列各項:

  • 停用 rds.logical_replication 參數時,rds.logical_wal_cache 會設定為零 (0)。

  • 啟用 rds.logical_replication 參數時,rds.logical_wal_cache 的預設值為 16 MB。

  • rds.logical_wal_cache 為靜態參數,且需要重新啟動資料庫執行個體,變更才能產生作用。系統會以 8 Kb 區塊為單位定義此參數。請注意,任何小於 32 Kb 的正值都會視為 32 Kb。如需 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');