Postgresql

archive_command 失敗導致 master 磁碟空間不足。有沒有優先考慮主人健康的命令

  • January 14, 2019

archive_command我在 postgresql.conf 中設置了一個簡單的複制:

archive_command = 'rsync -a %p _postgresql@serverip:/var/postgresql/wal_archive/%f'

在復製品出現故障之前,它工作了 2 年多。副本宕機後,歸檔命令反复失敗,因此 master 上的 pg_xlog 文件從未被刪除,master 的磁碟空間不足。

在我的案例中,副本很好,但不是那麼重要。然而,確保 master 始終可用是非常重要的,所以我想使用歸檔命令,在 master 出現問題之前犧牲副本。

我目前走到了另一個極端,將archive_command更改為:

archive_command = 'rsync -a %p _postgresql@serverip:/var/postgresql/wal_archive/%f || true'

但這似乎也不理想,因為即使是幾秒鐘的網路中斷也可能導致複製失敗。

理想情況下,我想將其更改為archive_command嘗試將 WAL 文件複製到副本一定次數的東西,如果失敗,放棄並刪除 pg_xlog 文件。對新的有什麼建議archive_command嗎?

(postgres 10.5)

我會推荐一種稍微不同的方法。與其測試失敗的數量,因為大量可能導致磁碟空間不足,而是直接測試磁碟空間不足。

archive_command = 'rsync -a %p _postgresql@serverip:/var/postgresql/wal_archive/%f || (df -P /var/data/pg_wal|awk "NR==2 && \$4< 400000 {exit 0}; NR==2 {exit 1}")'

但請注意,rsync 首先是一種危險的方法,因為它不能保證在本地返回成功之前寫入遠端端(以及該文件所在的目錄)的文件的成功 fsync。

或者完全不同的方法:將您的副本設置為流式副本,而不是日誌傳送副本。然後將“wal_keep_segments”設置為比為 pg_wal 保留的空間量略小的值。請注意,這僅適用於為 pg_wal 硬保留空間的情況,也就是說,沒有人可以“借用”一些空閒空間用於其他目的,例如臨時文件。

當然,如果您的副本停機了一段時間而您沒有註意到,那麼您可能還需要一個監控解決方案。

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