支援版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

19.6. 複製 #

這些設定控制內建串流複製功能的行為(請參閱第 26.2.5 節),以及內建邏輯複製功能(請參閱第 29 章)。

對於串流複製,伺服器將為主伺服器或備用伺服器。主伺服器可以傳送資料,而備用伺服器始終是複製資料的接收者。當使用串聯複製時(請參閱第 26.2.7 節),備用伺服器也可以是傳送者和接收者。參數主要用於傳送伺服器和備用伺服器,儘管某些參數僅在主伺服器上有意義。如果需要,叢集中的設定可能會有所不同,而不會出現問題。

對於邏輯複製發布者(執行CREATE PUBLICATION的伺服器)將資料複製到訂閱者(執行CREATE SUBSCRIPTION的伺服器)。伺服器也可以同時是發布者和訂閱者。請注意,以下各節將發布者稱為「傳送者」。有關邏輯複製組態設定的更多詳細資訊,請參閱第 29.11 節

19.6.1. 傳送伺服器 #

這些參數可以在任何要將複製資料傳送到一或多個備用伺服器的伺服器上設定。主伺服器始終是傳送伺服器,因此必須始終在主伺服器上設定這些參數。在備用伺服器成為主伺服器後,這些參數的角色和意義不會改變。

max_wal_senders (integer) #

指定來自備用伺服器或串流基本備份用戶端的並行連線的最大數量(即,同時執行的 WAL 傳送器程序的最大數量)。預設值為 10。值 0 表示已停用複製。串流用戶端突然中斷連線可能會留下孤立的連線插槽,直到達到逾時時間,因此此參數應設定為略高於預期的用戶端最大數量,以便中斷連線的用戶端可以立即重新連線。此參數只能在伺服器啟動時設定。此外,wal_level 必須設定為 replica 或更高,才能允許來自備用伺服器的連線。

執行備用伺服器時,您必須將此參數設定為與主伺服器相同或更高的值。否則,將不允許在備用伺服器中進行查詢。

max_replication_slots (integer) #

指定伺服器可以支援的最大複製插槽數量(請參閱第 26.2.6 節)。預設值為 10。此參數只能在伺服器啟動時設定。將其設定為低於目前現有的複製插槽數量的數值將阻止伺服器啟動。此外,wal_level 必須設定為 replica 或更高,才能允許使用複製插槽。

請注意,此參數也適用於訂閱者端,但含義不同。

wal_keep_size (integer) #

指定保留在 pg_wal 目錄中的過去 WAL 檔案的最小大小,以防備用伺服器需要擷取它們以進行串流複製。如果連線到傳送伺服器的備用伺服器落後超過 wal_keep_size MB,則傳送伺服器可能會移除備用伺服器仍然需要的 WAL 區段,在這種情況下,複製連線將會終止。下游連線最終也會因此而失敗。(但是,如果正在使用 WAL 封存,備用伺服器可以透過從封存擷取區段來恢復。)

這僅設定保留在 pg_wal 中區段的最小大小;系統可能需要保留更多區段用於 WAL 歸檔或從檢查點恢復。如果 wal_keep_size 為零(預設值),則系統不會為了備用目的而保留任何額外的區段,因此可用於備用伺服器的舊 WAL 區段數量取決於前一個檢查點的位置和 WAL 歸檔的狀態。如果指定此值時沒有單位,則預設為 MB。這個參數只能在 postgresql.conf 檔案或伺服器命令列中設定。

max_slot_wal_keep_size (integer) #

指定 複製槽 在檢查點時允許保留在 pg_wal 目錄中的 WAL 檔案的最大大小。如果 max_slot_wal_keep_size 為 -1(預設值),則複製槽可以保留無限量的 WAL 檔案。否則,如果複製槽的 restart_lsn 落後於目前的 LSN 超過給定的大小,則使用該槽的備用伺服器可能因為所需的 WAL 檔案被移除而無法繼續複製。您可以在 pg_replication_slots 中查看複製槽的 WAL 可用性。如果指定此值時沒有單位,則預設為 MB。這個參數只能在 postgresql.conf 檔案或伺服器命令列中設定。

wal_sender_timeout (integer) #

終止閒置時間超過此時間量的複製連線。這對於發送伺服器檢測備用伺服器崩潰或網路中斷非常有用。如果指定此值時沒有單位,則預設為毫秒。預設值為 60 秒。值為零會停用逾時機制。

對於分佈在多個地理位置的叢集,每個位置使用不同的值可以在叢集管理中帶來更大的彈性。較小的值對於使用低延遲網路連線的備用伺服器來說,可以更快地檢測到故障;而較大的值則有助於更好地判斷位於遠端位置且具有高延遲網路連線的備用伺服器的健康狀況。

track_commit_timestamp (boolean) #

記錄交易的提交時間。這個參數只能在 postgresql.conf 檔案或伺服器命令列中設定。預設值為 off

synchronized_standby_slots (string) #

邏輯 WAL 發送程序將等待的串流複製備用伺服器槽名稱的逗號分隔清單。邏輯 WAL 發送程序僅在指定的複製槽確認收到 WAL 後,才會將解碼的變更傳送給外掛程式。這可確保邏輯複製容錯移轉槽不會在使用對應的實體備用伺服器收到並刷新這些變更之前消耗這些變更。如果邏輯複製連線打算在備用伺服器升級後切換到實體備用伺服器,則應在此處列出備用伺服器的實體複製槽。請注意,如果 synchronized_standby_slots 中指定的槽不存在或已失效,則邏輯複製將不會繼續。此外,複製管理函數 pg_replication_slot_advancepg_logical_slot_get_changespg_logical_slot_peek_changes,當與邏輯容錯移轉槽一起使用時,將會阻塞,直到 synchronized_standby_slots 中指定的所有實體槽都確認收到 WAL。

synchronized_standby_slots 中的實體複製槽對應的備用伺服器必須配置 sync_replication_slots = true,以便它們可以從主要伺服器接收邏輯容錯移轉槽變更。

19.6.2. 主要伺服器 #

這些參數可以在主要伺服器上設定,該伺服器將複製資料傳送到一個或多個備用伺服器。請注意,除了這些參數之外,還必須在主要伺服器上適當地設定 wal_level,並且可以選擇性地啟用 WAL 歸檔(請參閱 第 19.5.3 節)。這些參數在備用伺服器上的值無關緊要,儘管您可能希望在那裡設定它們,以準備備用伺服器成為主要伺服器的可能性。

synchronous_standby_names (string) #

指定可以支援同步複製的備用伺服器的清單,如 第 26.2.8 節 中所述。將會有一個或多個活動的同步備用伺服器;在這些備用伺服器確認收到其資料後,等待提交的交易將被允許繼續進行。同步備用伺服器將是那些名稱出現在此清單中,並且目前已連線並即時串流資料的伺服器(如 pg_stat_replication 檢視中的 streaming 狀態所示)。指定多個同步備用伺服器可以實現非常高的可用性和防止資料遺失。

為此目的的備用伺服器名稱是備用伺服器的 application_name 設定,如備用伺服器的連線資訊中所設定。對於實體複製備用伺服器,這應在 primary_conninfo 設定中設定;如果設定了 cluster_name,則預設為該設定,否則為 walreceiver。對於邏輯複製,這可以在訂閱的連線資訊中設定,預設為訂閱名稱。對於其他複製串流消費者,請查閱其文件。

此參數指定使用以下任一語法的備用伺服器清單

[FIRST] num_sync ( standby_name [, ...] )
ANY num_sync ( standby_name [, ...] )
standby_name [, ...]

其中 num_sync 是交易需要等待回覆的同步備用伺服器數量,standby_name 是備用伺服器的名稱。FIRSTANY 指定從列出的伺服器中選擇同步備用伺服器的方法。

關鍵字 FIRST 搭配 num_sync,指定以優先順序為基礎的同步複製,並使交易提交動作等待其 WAL 紀錄複製到 num_sync 個根據其優先順序選擇的同步備用伺服器。例如,設定 FIRST 3 (s1, s2, s3, s4) 將導致每個提交動作等待從備用伺服器 s1s2s3s4 中選出的三個較高優先順序備用伺服器的回覆。名稱在列表中較早出現的備用伺服器具有較高的優先順序,並將被視為同步。此列表中稍後出現的其他備用伺服器代表潛在的同步備用伺服器。如果任何目前的同步備用伺服器因任何原因斷線,它將立即被下一個最高優先順序的備用伺服器取代。關鍵字 FIRST 是可選的。

關鍵字 ANY 搭配 num_sync,指定以仲裁為基礎的同步複製,並使交易提交動作等待其 WAL 紀錄複製到 至少 num_sync 個列出的備用伺服器。例如,設定 ANY 3 (s1, s2, s3, s4) 將導致每個提交動作在 s1s2s3s4 中至少有三個備用伺服器回覆後立即繼續。

FIRSTANY 不區分大小寫。如果這些關鍵字被用作備用伺服器的名稱,則其 standby_name 必須用雙引號引起來。

第三種語法是在 PostgreSQL 9.6 版本之前使用的,但仍然支援。它與第一種語法相同,其中 FIRSTnum_sync 等於 1。例如,FIRST 1 (s1, s2)s1, s2 具有相同的含義:s1s2 被選為同步備用伺服器。

特殊條目 * 符合任何備用伺服器名稱。

沒有強制備用伺服器名稱唯一性的機制。如果存在重複項,則其中一個符合的備用伺服器將被視為具有較高的優先順序,但確切是哪一個是不確定的。

注意

每個 standby_name 應具有有效的 SQL 識別符號的形式,除非它是 *。如果需要,您可以使用雙引號。但請注意,standby_name 與備用應用程式名稱的比較不區分大小寫,無論是否用雙引號引起來。

如果此處未指定任何同步備用伺服器名稱,則不會啟用同步複製,並且交易提交動作將不會等待複製。這是預設配置。即使啟用同步複製,也可以將個別交易配置為不等待複製,方法是將 synchronous_commit 參數設定為 localoff

此參數只能在 postgresql.conf 檔案或伺服器命令列中設定。

19.6.3. 備用伺服器 #

這些設定控制了 備用伺服器接收複製資料的行為。它們在主要伺服器上的值無關緊要。

primary_conninfo (string) #

指定備用伺服器用於連接到傳送伺服器的連線字串。此字串的格式如 第 32.1.1 節所述。如果此字串中未指定任何選項,則會檢查相應的環境變數(請參閱 第 32.15 節)。如果也未設定環境變數,則使用預設值。

連線字串應指定傳送伺服器的主機名稱(或位址),以及連接埠號碼(如果它與備用伺服器的預設值不同)。還應指定與傳送伺服器上具有適當權限的角色相對應的使用者名稱(請參閱 第 26.2.5.1 節)。如果傳送者要求密碼驗證,則還需要提供密碼。可以在 primary_conninfo 字串中提供,也可以在備用伺服器上單獨的 ~/.pgpass 檔案中提供(使用 replication 作為資料庫名稱)。

對於複製槽同步(請參閱 第 47.2.3 節),還需要在 primary_conninfo 字串中指定有效的 dbname。這僅用於槽同步。它在串流中被忽略。

此參數只能在 postgresql.conf 檔案或伺服器命令列中設定。如果在 WAL 接收器程序執行時變更此參數,則會向該程序發出訊號以關閉,並預期使用新設定重新啟動(除非 primary_conninfo 是空字串)。如果伺服器未處於備用模式,則此設定無效。

primary_slot_name (string) #

可選地指定現有的複製槽,以便在透過串流複製連接到傳送伺服器時使用,以控制上游節點上的資源移除(請參閱 第 26.2.6 節)。此參數只能在 postgresql.conf 檔案或伺服器命令列中設定。如果在 WAL 接收器程序執行時變更此參數,則會向該程序發出訊號以關閉,並預期使用新設定重新啟動。如果未設定 primary_conninfo 或伺服器未處於備用模式,則此設定無效。

hot_standby (boolean) #

指定是否可以在復原期間連接並執行查詢,如 第 26.4 節中所述。預設值為 on。此參數只能在伺服器啟動時設定。它僅在封存復原或備用模式下有效。

max_standby_archive_delay (integer) #

當熱備用處於活動狀態時,此參數決定備用伺服器在取消與即將套用的 WAL 條目衝突的備用查詢之前應等待多長時間,如 第 26.4.2 節中所述。max_standby_archive_delay 適用於從 WAL 封存讀取 WAL 資料時(因此不是最新的)。如果指定此值時沒有單位,則將其視為毫秒。預設值為 30 秒。值 -1 允許備用伺服器永遠等待衝突查詢完成。此參數只能在 postgresql.conf 檔案或伺服器命令列中設定。

請注意,max_standby_archive_delay 與查詢在取消前可以執行的最長時間不同; 而是允許套用任何一個 WAL 片段資料的最大總時間。 因此,如果一個查詢在 WAL 片段的前面部分造成了顯著的延遲,後續衝突的查詢將只有更短的緩衝時間。

max_standby_streaming_delay (integer) #

當熱備援啟動時,此參數決定備援伺服器在取消與即將套用的 WAL 條目衝突的備援查詢之前,應等待多久,如第 26.4.2 節中所述。 max_standby_streaming_delay 在透過串流複製接收 WAL 資料時適用。 如果指定此值時沒有單位,則預設為毫秒。 預設值為 30 秒。 值為 -1 允許備援伺服器無限期地等待衝突查詢完成。 此參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。

請注意,max_standby_streaming_delay 與查詢在取消前可以執行的最長時間不同; 而是從主伺服器收到 WAL 資料後,允許套用 WAL 資料的最大總時間。 因此,如果一個查詢造成了顯著的延遲,後續衝突的查詢將只有更短的緩衝時間,直到備援伺服器再次趕上進度。

wal_receiver_create_temp_slot (boolean) #

指定當未設定要使用的永久複製槽(使用 primary_slot_name)時,WAL 接收器程序是否應在遠端實例上建立臨時複製槽。 預設值為關閉。 此參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。 如果在 WAL 接收器程序執行時變更此參數,則會向該程序發出訊號以關閉,並預期以新設定重新啟動。

wal_receiver_status_interval (integer) #

指定備援伺服器上的 WAL 接收器程序向主伺服器或上游備援伺服器發送有關複製進度的資訊的最小頻率,這些資訊可以使用 pg_stat_replication 檢視表來查看。 備援伺服器將報告它已寫入的最後一個預寫式日誌位置,它已刷新到磁碟的最後一個位置,以及它已套用的最後一個位置。 此參數的值是報告之間的最大時間量。 每次寫入或刷新位置變更時,都會發送更新,如果設定為非零值,則會按照此參數指定的頻率發送更新。 在忽略此參數的情況下,還會發送更新; 例如,當現有 WAL 的處理完成時,或當 synchronous_commit 設定為 remote_apply 時。 因此,套用位置可能略微落後於實際位置。 如果指定此值時沒有單位,則預設為秒。 預設值為 10 秒。 此參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。

hot_standby_feedback (boolean) #

指定熱備援是否將有關目前在備援伺服器上執行的查詢的回饋發送給主伺服器或上游備援伺服器。 此參數可用於消除由清除紀錄引起的查詢取消,但可能會導致主伺服器上的資料庫膨脹,對於某些工作負載。 發送回饋訊息的頻率不會高於每 wal_receiver_status_interval 一次。 預設值為 off。 此參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。

如果正在使用級聯複製,則回饋會向上游傳遞,直到最終到達主伺服器。 備援伺服器除了向上游傳遞之外,不會對收到的回饋進行其他使用。

wal_receiver_timeout (integer) #

終止閒置時間超過此時間量的複製連線。 這對於接收備援伺服器偵測主節點崩潰或網路中斷很有用。 如果指定此值時沒有單位,則預設為毫秒。 預設值為 60 秒。 值為零會停用逾時機制。 此參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。

wal_retrieve_retry_interval (integer) #

指定當從任何來源(串流複製、本地 pg_wal 或 WAL 封存)都無法取得 WAL 資料時,備援伺服器在再次嘗試取得 WAL 資料之前應等待多久。 如果指定此值時沒有單位,則預設為毫秒。 預設值為 5 秒。 此參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。

此參數在復原中的節點需要控制等待新 WAL 資料可用的時間量時很有用。 例如,在封存復原中,可以透過減少此參數的值,使復原在偵測新 WAL 檔案時更具回應性。 在 WAL 活動較低的系統上,增加它可以減少存取 WAL 封存所需的請求數量,這對於雲端環境很有用,例如在雲端環境中,會考慮基礎架構的存取次數。

在邏輯複製中,此參數也限制了失敗的複製套用工作程序將被重新產生的頻率。

recovery_min_apply_delay (integer) #

預設情況下,備援伺服器會盡快從發送伺服器還原 WAL 紀錄。 擁有時間延遲的資料副本可能很有用,可提供更正資料遺失錯誤的機會。 此參數允許您將復原延遲指定的時間量。 例如,如果將此參數設定為 5min,則備援伺服器僅在備援伺服器上的系統時間至少比主伺服器報告的提交時間晚五分鐘時,才會重新執行每個交易提交。 如果指定此值時沒有單位,則預設為毫秒。 預設值為零,不增加任何延遲。

伺服器之間的複製延遲可能超過此參數的值,在這種情況下,將不會增加延遲。請注意,延遲的計算方式是主要伺服器上寫入的 WAL 時間戳記與待命伺服器上的目前時間之間的時間差。由於網路延遲或串聯複製配置導致的傳輸延遲可能會顯著縮短實際等待時間。如果主要伺服器和待命伺服器上的系統時鐘未同步,則可能導致復原提早套用記錄;但這不是主要問題,因為此參數的有用設定遠大於伺服器之間的典型時間偏差。

延遲僅在交易提交的 WAL 記錄上發生。其他記錄會盡可能快速地重播,這不是問題,因為 MVCC 可見性規則可確保在套用相應的提交記錄之前,它們的效果是不可見的。

延遲發生在復原中的資料庫達到一致狀態後,直到待命伺服器被提升或觸發為止。之後,待命伺服器將結束復原,不再等待。

WAL 記錄必須保留在待命伺服器上,直到它們準備好被套用。因此,更長的延遲將導致 WAL 檔案的更多累積,從而增加待命伺服器的 pg_wal 目錄的磁碟空間需求。

此參數旨在與串流複製部署一起使用;但是,如果指定了該參數,則除了崩潰復原之外,所有情況下都將遵守該參數。hot_standby_feedback 將因使用此功能而延遲,這可能導致主要伺服器上的膨脹;請謹慎使用兩者。

警告

synchronous_commit 設定為 remote_apply 時,同步複製會受到此設定的影響;每個 COMMIT 都需要等待套用。

此參數只能在 postgresql.conf 檔案或伺服器命令列中設定。

sync_replication_slots (boolean) #

它使實體待命伺服器能夠從主要伺服器同步邏輯故障轉移槽,以便邏輯訂閱者可以在故障轉移後從新的主要伺服器恢復複製。

預設情況下,它是停用的。此參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。

19.6.4. 訂閱者 #

這些設定控制邏輯複製訂閱者的行為。它們在發布者上的值無關緊要。有關更多詳細訊息,請參閱第 29.11 節

max_replication_slots (integer) #

指定可以同時追蹤多少個複製來源(請參閱第 48 章),從而有效地限制了可以在伺服器上建立的邏輯複製訂閱數量。將其設定為低於目前追蹤的複製來源數量(反映在pg_replication_origin_status 中)將阻止伺服器啟動。max_replication_slots 必須至少設定為將新增到訂閱者的訂閱數量,再加上為表格同步保留的一些數量。

請注意,此參數也適用於傳送伺服器,但具有不同的含義。

max_logical_replication_workers (integer) #

指定邏輯複製工作行程的最大數量。這包括領導者套用工作行程、平行套用工作行程和表格同步工作行程。

邏輯複製工作行程取自 max_worker_processes 定義的池。

預設值為 4。此參數只能在伺服器啟動時設定。

max_sync_workers_per_subscription (integer) #

每個訂閱的最大同步工作行程數。此參數控制訂閱初始化期間或新增新表格時,初始資料複製的平行程度。

目前,每個表格只能有一個同步工作行程。

同步工作行程取自 max_logical_replication_workers 定義的池。

預設值為 2。此參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。

max_parallel_apply_workers_per_subscription (integer) #

每個訂閱的最大平行套用工作行程數。此參數控制使用訂閱參數 streaming = parallel 進行中交易的串流處理的平行程度。

平行套用工作行程取自 max_logical_replication_workers 定義的池。

預設值為 2。此參數只能在 postgresql.conf 檔案中或在伺服器命令列上設定。

提交更正

如果您在文件中發現任何不正確、與特定功能的使用經驗不符或需要進一步說明的內容,請使用此表單報告文件問題。