Postgresql一次
一次 max_standby_archive_delay
和 max_standby_streaming_delay
的值為 -1 是否會導致重負載時複製停止?
在 aws RDS 上的 postgresql 主從複製方案上的複制伺服器中,我收到以下錯誤:
SQLSTATE[40001]: Serialization failure: 7 ERROR: canceling statement due to conflict with recovery
據我了解,原因是複制的發生類似於數據庫遷移。一系列查詢被寫入稱為 WAL 的東西,然後以 FIFO 序列執行。
另外,我了解到,一旦在執行 wal 時執行查詢,它可能會導致衝突,因為有時目前正在執行的查詢可能會導致獲取過時的數據。
因此,根據文件,存在允許首先執行目前查詢然後應用 wal 更改的延遲。這些是:
max_standby_archive_delay
max_standby_streaming_delay
但是在繁重的查詢(查詢執行時間> 30s)上將這些值設置為-1會導致副本長時間擁有陳舊數據嗎?
是的,就是這個想法。在複製衝突的情況下,PostgreSQL 只有兩個選項:
- 取消查詢
- 延遲複製更改的應用。
設置
max_standby_streaming_delay
為 -1 將無限期地延遲複製。有一些方法可以減少複製衝突:
- 設置
hot_standby_feedback = on
為刪除由VACUUM
. 您付出的代價是備用數據庫上長時間執行的查詢會使您的表膨脹。- 在您的工作負載中不要有任何諸如
DROP TABLE
、TRUNCATE
和ALTER TABLE
類似的語句會導致ACCESS EXCLUSIVE
鎖定。- 在 PostgreSQL v12 中,您可以設置
ALTER TABLE atable SET (vacuum_truncate = off);
禁用 autovacuum 截斷(這也會導致短
ACCESS EXCLUSIVE
鎖)。在舊版本中,只有粗略且未記錄的解決方法可以設置old_snapshot_threshold
為預設值以外的其他值。這一切都很複雜,可能會產生不良影響,所以最好的建議是:如果您想要一個不會超過必要延遲的備用伺服器,但您還想在備用伺服器上執行長時間執行的查詢,您應該使用兩台備用伺服器, 一個用於這些相互衝突的目的中的每一個。