如果SLOG遺失,如何使ZFS與ZIL SLOG保持一致?

如果SLOG遺失,如何使ZFS與ZIL SLOG保持一致?

我的 HDD 上有 ZFS,SSD 上有 ZIL SLOG。

如果相關的話,我在 SSD 上還有一個 LARC 快取。

如何重新配置​​它以確保 SSD 故障不會導致資料不一致(不符合 POSIX 檔案系統呼叫結果規則,例如write()在單一執行緒中混合兩個操作的內容,一個接一個地執行)?

如果我在不還原 SSD 的情況下還原 HDD 的備份快照,我想確保 ZFS 上的 PosgreSQL DB 不會變得不一致。 (我確實採取了同步 PostgreSQL 的措施(假設 Postgre 沒有錯誤)POSIX 正確的檔案系統保證資料庫不會變得不一致。)

答案1

ZIL 僅假定包含短期內對穩定磁碟的未提交寫入。如果您同時發生電源故障和 SSD 故障,這可能會成為問題。但是,如果 SSD 在其他方面正常的情況下出現故障,則 zfs 應該從相當於 raid 寫回的模式轉換為 raid 直寫模式。效能可能會下降,但不會立即損壞任何內容。

ZIL 的要點是將更改快速寫入非揮發性存儲,以便可以快速告訴應用程式繼續。如果在將這些資料寫入穩定儲存(磁碟)之前斷電,則在通電後下次安裝 zfs 磁碟區時,它們將從 ZIL 複製到穩定儲存。

檔案系統快照的全部意義在於,您可以複製未主動寫入的檔案系統的穩定版本。這與 ZIL 無關,因為快照不應該是可寫入的,因此 ZIL 不會有任何掛起的寫入操作。

話雖如此,postgreSQL 可能並不樂意恢復檔案系統快照。除非 postgreSQL 也被告知在 ZFS 快照之前進行快照或暫停,否則 zfs 快照可能包含一些部分 postgreSQL 寫入,這可能是一個問題。您可能想問一個關於如何正確備份 postgreSQL 資料庫的單獨問題。 (......除非其他人想在這裡介紹這一點。)

答案2

SLOG 可以被認為是獨立於資料集的。這意味著一旦你的 pg 資料被刷新到磁碟,資料集就可以被快照和備份,並且快照可以被還原(到同一個池和/或到不同的池),無論它有日誌設備與否。

如果您打算從池中物理刪除log(SLOG) 或cache(L2ARC) 設備,您當然應該先從邏輯上刪除它:

zpool remove [poolname] [logdevice|cachedevice]

(看man zpool-remove

如果未正確刪除 SLOG,則池可能無法在下次重新啟動時匯入。從中恢復可能相當容易(如果 SLOG 中沒有未刷新的資料),或者在不接受資料損壞的情況下很難/不可能做到。通常建議添加兩個 SLOG 設備作為鏡像對,這是有原因的,這就是為了避免這個問題 - 即避免出現能夠損壞池的單點故障。


我仍然會定期進行pg_dump備份(到另一個具有自己的快照和備份計劃的資料集),因為我認為文字轉儲比二進位檔案更可靠- 特別是如果二進位快照是在postgresql 伺服器仍在運行時創建的(伺服器可能拍攝快照時,尚未將記憶體中的所有內容寫入磁碟...但關閉伺服器將使其寫入以相同狀態重新啟動所需的所有內容)。也因為對於重要資料來說,備份越多越好。

順便說一句,我幾年前寫了一個簡單的postgresql 備份腳本,它轉儲所有內容,然後是pg 全域變數(角色等),然後是每個資料庫和表的模式,然後是資料(如COPY . .. FROM),然後是資料再次插入作為列。我已經使用它的變體大約 20 年了。我在 ServerFault 上發布了它的一個版本:自動備份 PostgreSQL 資料庫的最佳方法是什麼?時間回到2009年。

該版本可能需要一些小的調整(尤其是DBS=( $($PSQL --list --tuples-only ...) )獲取資料庫清單的行。如果備份目錄是具有自己的快照計劃的 zfs 資料集,則不需要 YMD 子目錄或find ... -mtime +30 ...刪除另外,您不需要通過管道pg_dumppg_dumpall進入gzip,只需對備份資料集使用壓縮即可。

相關內容