如何在隨機斷電的機器上儲存數據
我有一個在物理機主機上執行的虛擬機 (Debian)。虛擬機充當它經常通過本地網路接收的數據的緩衝區(此數據的周期為 0.5 秒,因此吞吐量相當高)。接收到的任何數據都儲存在虛擬機上,並通過 UDP 反復轉發到外部伺服器。一旦外部伺服器(通過 UDP)確認它已接收到數據包,原始數據就會從虛擬機中刪除,並且不會再次發送到外部伺服器。連接 VM 和外部伺服器的 Internet 連接不可靠,這意味著它可能一次中斷數天。
託管 VM 的物理機每天會隨機斷電數次。無法判斷何時會發生這種情況,也無法在系統中添加 UPS、電池或類似解決方案。
最初,數據儲存在虛擬機上基於文件的 HSQLDB 數據庫中。但是,頻繁的斷電最終導致數據庫腳本文件損壞(不是文件系統級別,即可讀,但HSQLDB無法理解),這導致了我的問題:
在可能而且確實經常發生斷電的環境中,應如何儲存數據?
我能想到的一個選擇是使用平面文件,將每個數據包保存為文件系統上的文件。這樣,如果文件由於斷電而損壞,可以忽略它,其餘數據保持不變。然而,這帶來了一些問題,主要與可能儲存在虛擬機上的數據量有關。每條數據間隔0.5s,10天生成1,728,000個文件。這至少意味著使用具有更多 inode 數量的文件系統來儲存此數據(目前文件系統設置在大約 250,000 條消息和 30% 的磁碟空間使用時耗盡了 inode)。此外,很難(並非不可能)管理。
還有其他選擇嗎?是否有在 Debian 上執行且不會因斷電而損壞的數據庫引擎?另外,應該為此使用什麼文件系統?ext3 是目前使用的。
在虛擬機上執行的軟體是使用 Java 6 編寫的,因此希望該解決方案不會不兼容。
老實說,您最好的方法是修復停電問題,或者在更好的位置部署不同的系統。
是的,有諸如 redis 之類的系統會將數據儲存在僅附加日誌中以進行重放,但是您可能會在較低級別上面臨損壞的風險-例如,如果您的文件系統被打亂,那麼磁碟上的數據可能會面臨風險。
我很感激任何改進都會對你有用,但考慮到你所概述的場景,這個問題實際上並不是一個可以解決的問題。
你的方法可以奏效。讓我建議對其進行一些改進。原子寫入文件時堆棧溢出存在問題。本質上,您將每個數據包保存到一個臨時文件中,然後將其重命名為其最終名稱。重命名是一種原子操作,可以避免電源故障。這樣,您就可以保證最終目的地中的所有文件都已正確保存而沒有損壞。
那麼你可以做些什麼來處理擁有數百萬個文件的問題。cron 是否是一項可能每小時執行一次的作業,它將所有文件超過一個小時,並再次使用原子文件操作將它們組合成一個大文件,以便即使在電源故障期間該作業也可以安全執行,然後刪除舊文件。有點像日誌輪換。一個小時的文件大約是 7,200 個文件。因此,在任何時候,磁碟上的文件都不應該超過 20,000 個。