按需保存來自 Postgres 的 stats_temp_directory 的統計數據
我們正在調查我們的一個虛擬機中的 I/O 負載以及優化它的可能性,結果表明大部分負載是由 PostgreSQL 的統計資訊收集器生成的。它在 3,5 和 6,5 MB/s 之間跳躍。我已經找到了一些關於這個主題的有趣資源,他們建議使用 tmpfs 將大部分統計資訊保存在記憶體中,這對我來說很有意義,並且具體的 VM 有足夠的可用 RAM 來支持這種情況。
來源 1 說明如下:
重新啟動後,PostgreSQL 會將文件複製到新位置(並在停止時返回)。
這與
temp
配置名稱中的stats_temp_directory
聲音相結合,就像數據被保存在其他地方一樣。那麼在 Postgres 程序不正常關閉的情況下臨時數據會發生什麼情況呢?如果該過程在上週執行而沒有任何問題,它是否完全失去了?還是 Postgres 在執行時定期將數據保存在臨時目錄之外?它可以在不干淨的關機後簡單地使用可用的臨時數據嗎?
我之所以問,是因為目前一旦寫入的數據會持久保存在本地文件系統中,並且寫入數據的操作似乎是原子的,但是如果我們改用 tmpfs,如果整個伺服器出現故障,可能會失去幾週的統計數據一些理由。
有沒有辦法讓 Postgres 定期保存 tmpfs 之外的數據,比如每隔幾個小時左右一次?
或者我是否需要使用一些覆蓋/堆疊/任何文件系統,將持久的文件系統安裝為較低的,將 tmpfs 安裝為較高的,並找到某種方法來手動同步一次?
謝謝!
PostgreSQL 沒有內置工具來定期保存收集器統計資訊。它們被認為是可更換的。請記住,分析器收集的表統計資訊與統計資訊收集器收集的統計資訊之間存在差異。後者是 stats_temp_directory 中的內容。
因此,您在這裡的答案將取決於您為什麼要在發生崩潰時保留它們。有兩個原因:
- 您不希望 Autovacuum 失去表,因為它失去了更新計數;
- 您在某處使用表更新計數作為監控的一部分。
我認為第一個原因可能無關緊要,除非您有某些原因導致 PostgreSQL 每天都意外關閉,在這種情況下您應該解決這個問題。此外,您可以通過在重新啟動 Postgres 後執行數據庫範圍的 VACUUM 來修復問題。
由於第二個原因,僅僅累積計數器本身並沒有那麼有用。我的意思是,如果一個表在其生命週期中有 100,000 次刪除,這是否意味著它在 100 天內每天有 1000 次刪除,或者是否意味著昨天有人剛剛刪除了一半的表?你不知道。因此,如果您關心這些計數,您應該每天或每小時對您的統計數據進行快照,以便您獲得時間和計數。您可能會看一下重振 pgStatsPack 的嘗試,該工具正是這樣做的。