大家好,
我們在 Hostinger VPS 上運行自託管的 n8n 實例(v2.32.7),部署在生產環境中。
我們的實例每天執行超過 1,000 個工作流程(根據 Insights 儀表板顯示約 100k 生產執行),並且我們希望保留 至少 30 天的執行歷史記錄用於稽核和故障排除,包括執行資料(輸入、輸出和錯誤)。
我們了解執行修剪設定:
EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=720
EXECUTIONS_DATA_PRUNE_MAX_COUNT=10000
EXECUTIONS_DATA_PRUNE_INTERVAL=3600
我們的目標是保留大約一個月的執行資料,因此我們相應地增加了保留設定。但是在進行這些更改後,n8n 實例開始反覆崩潰(不到一小時內發生 4 次崩潰)。我們還原了配置以恢復穩定性。
一些其他背景資訊:
- 自託管在 Hostinger VPS 上
- 16 GB RAM
- n8n v2.32.7
- PostgreSQL 資料庫
- 生產環境,有許多活躍的工作流程
- 我們需要完整的執行資料以實現可觀測性和稽核(成功和失敗的執行)。
我的問題是:
- 運行高容量 n8n 實例的公司通常如何保留 30+ 天的執行日誌?
- 你們是直接將執行資料保留在 PostgreSQL 中,還是將其匯出到另一個可觀測性/日誌平台?
- 長期執行歷史記錄是否有推薦的架構?
- 在增加執行保留之前,應該考慮哪些環境變數或資料庫最佳化?
- 有人在增加執行保留後經歷過崩潰嗎?如果有,根本原因是什麼?
- 在 PostgreSQL 中存儲一個月的完整執行資料,在這個規模的 n8n 上是否被認為是反模式,還是常見的生產設置?
我們的目標是實現完整的可稽核性,同時不損害實例穩定性。
任何關於生產設置的建議或範例都將不勝感激。
謝謝!
嗨 @mellkadvescalavel
在您的執行量下,在 n8n 的運作 PostgreSQL 資料庫中儲存 30 天的完整執行酬載會導致嚴重的表膨脹,並在 UI/API 查詢期間造成記憶體耗盡 (OOM),這就是您的實例崩潰的原因;生產級解決方案是將短期運作保留與長期稽核記錄解耦。
你好 @mellkadvescalavel!你的設置規模很大!你的修剪計數設置為 10,000,所以即使在 30 天設置下,你大約每 10 天就會被修剪一次,大約每天 1000 次運行!不過在你提高或更改任何設置之前,當它崩潰時,是 n8n 容器內存不足還是 postgres 磁盤空間不足?
根據你的問題,以下是我的建議,另外只有 16GB 內存來處理每天 1000 次執行似乎相當緊張。
-
我不是公司,所以我不確定,但我看到很多人使用修剪和循環節點來處理限制。不要將其保存在 n8n 中,Postgres 可以保存 7-14 天的窗口用於調試,但任何超過此時間的內容都應該存儲到其他日誌記錄器或位置。
-
你應該導出、推送你需要的數據到另一個源。
-
你應該使用兩個層級,具有大量修剪的 postgres,然後將結果存儲到你自己的單獨存儲或位置。也許是一個 webhook 或類似的東西可以接收。
像 N8N_EXECUTION_DATA_STORAGE_MODE=s3 這樣的東西可以讓 postgres 保持較小的規模。
-
是的,這些有效 - EXECUTIONS_DATA_SAVE_ON_SUCCESS=none - 只保留錯誤。
-
對於崩潰,這是 postgres 或 OOM 錯誤。
-
按照你的規模,這可能是一個反模式,這會導致你的數據庫崩潰並造成更多問題。
這兩個保留設定相互衝突。EXECUTIONS_DATA_PRUNE_MAX_COUNT=10000 會將保留的執行限制在 10,000 個,即使設定了 EXECUTIONS_DATA_MAX_AGE=720。以每天約 1,000 次執行來計算,計數限制會在大約十天後生效。
我還不會稱崩潰表為臃腫或 RAM 故障。請分別檢查容器退出原因和 PostgreSQL 日誌。同時驗證可用磁碟空間。每個指標都指向不同的故障和不同的修復方案。
對於 30 天的審計日誌,在 n8n 中保持較短的診斷時間視窗,並從工作流本身寫入狹窄的審計記錄。包括執行 ID、工作流版本、時間戳、結果,以及追蹤操作所需的業務識別碼。只有在審計要求需要時才保留完整的有效負載,並移除秘密和個人資料。
測量一個正常日期的保留執行資料,然後將其投影至 30 天。單獨的執行計數無法告訴你這個 Postgres 實例和磁碟是否能承載該時間視窗。