Postgresql

當 hot_standby_feedback 在 Postgres 12 上時如何在備用 postgres 伺服器上執行查詢

  • September 12, 2022

我正在嘗試將報告數據從我們的主伺服器移到 postgres 12 的從屬伺服器上。

我知道打開 hot_standby_feedback 允許這樣做,但是我需要注意其他參數嗎?

還有 2 個其他 postgres 功能可以調整。

max_standby_archive_delay

max_standby_streaming_delay

它們目前設置為預設 30 秒。

我們最初在我們的主伺服器上執行了一個平均需要 15 分鐘的報告查詢,它基本上是一個巨大的 SELECT 語句(讀取數據)。

通過 psql 直接執行時,查詢在從屬設備上執行良好(max_standby_archive_delay 設置為 30s,max_standby_streaming_delay 也設置為 30s)

但如果它通過 crontab 執行,我們會收到以下錯誤:

ERROR:  canceling statement due to conflict with recovery
DETAIL:  User was holding shared buffer pin for too long

為什麼會這樣?

我可以將上面提到的這兩個值設置為 20 分鐘,但只是好奇。

任何幫助深表感謝

如消息所述,由於複製衝突,查詢被取消。開啟hot_standby_feedback不會消除所有複製衝突(並且可能會導致主伺服器膨脹)。

你有兩個選擇:

  • 提高max_standby_streaming_delay待機
  • 重複查詢,直到你讓它執行而沒有錯誤

查詢取消沒有每個鎖定的寬限期。一旦重播過程落後超過 30 秒,那麼每個阻擋者都會被擊中,即使阻擋只持續了幾微秒,即使落後的大局原因與那個阻擋者無關。

回饋無法避免緩衝器引腳衝突。一旦元組足夠老可以被刪除(在任何有效的回饋下),進行刪除需要在將要刪除的塊上設置緩衝區清理鎖,並且需要在此處獲取鎖和現在,無論被刪除的元組的年齡如何。並且一旦在主伺服器上進行,就必須在副本上重播——不可能有任何條件。

所以這是最有可能的情況——當發現衝突時,回放已經落後。然後你的選擇是找出它落後的原因並解決這個瓶頸,增加 max_standby_*_delay 以便它很少落後於那個新的數量,或者學會忍受偶爾的取消。

也有可能您在副本上只有一個長壽命的緩衝引腳,它單槍匹馬地將重放延遲 30 秒,但我認為這不太可能。我只會打消這種可能性,除非您發現系統永遠不會落後 30 秒,除非是在取消之前。

另一種解決方案可能是破解系統,為緩衝引腳添加每個鎖定的寬限期,因為這些通常只是短暫的幫助。或者,只是升級主伺服器並停止嘗試將工作解除安裝到副本。

至於 cron 工作,基於 2 的樣本量,你不能說太多。你擲骰子兩次並得到不同的結果,沒有有效的教訓可以從中吸取。

引用自:https://dba.stackexchange.com/questions/316710