當 hot_standby_feedback 在 Postgres 12 上時如何在備用 postgres 伺服器上執行查詢
我正在嘗試將報告數據從我們的主伺服器移到 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 的樣本量,你不能說太多。你擲骰子兩次並得到不同的結果,沒有有效的教訓可以從中吸取。