2011-11-13 101 views
1

我在基於Linux的系統上運行2.6.3x內核x86的這一要求..恢復數據

我的過程中有一些動態數據(並不多,在幾分鐘兆字節範圍)已回收如果進程崩潰。顯而易見的解決方案是將數據存儲在共享內存中,並在進程重新啓動時再次讀取它。寫共享內存必須小心,這樣在更新過程中進程崩潰不會使共享內存中的數據損壞。

編碼之前,我只是想檢查是否有任何開源的程序/庫提供此功能..謝謝。

-Santhosh。

回答

0

我不認爲你提出的設計是健全的。操作系統崩潰(例如電源故障等)可能會導致mmap'd區域被部分同步到光盤(也許這些頁面的寫入順序與您編寫的順序不同),這意味着您的數據結構將會得到以任意方式損壞。

如果你需要你的數據庫更改是持久的和原子的(也許一致性和完整性也不會傷害,對吧?),那麼我強烈建議使用支持ACID的現有數據庫系統或適當的子集。也許sqlite或Berkeley DB可以做到這一點。

原則上,你可以自己做,但不是按照你所描述的方式 - 你需要創建某種類型的日誌文件,這種日誌文件可以以原子方式讀回來,並且可以被自動讀取能夠從一些已知的快照等「重放」事件,這在技術上是具有挑戰性的。

記住:

  • 的OS故障可能會導致通過的msync()或類似啓動的寫,將部分完成的持久光盤
  • MMAP並不能保證永遠不會寫回在其他時間數據,也就是說,當你還沒有調用msync()一段時間時
  • 頁面不一定以與修改頁面內存中的頁面相同的順序回寫 - 例如你可以寫入一個[0]然後一個[4096],並且在崩潰後沒有[4096]持久但是[0]。
  • 甚至衝個別頁面也不是絕對保證是原子的。

我意識到,利用每一個讀或寫操作你的數據結構庫(例如BDB或源碼)是一種侵入性的變化,但如果你想這樣的魯棒性,我認爲這是必要的。

+0

感謝您的建議。一個澄清儘管..我需要的數據才能恢復只有當我的進程重新啓動。如果操作系統崩潰,那麼我不需要。爲了寫入共享內存,我想在/ dev/shm中創建一個文件。任何寫入/ dev/shm(即:tempfs)的東西都不會寫入磁盤,不是嗎? – Manohar

+0

我曾假設您的數據不僅僅存在應用程序崩潰,還存在操作系統崩潰,電源故障或其他硬件故障。建立一個不能這樣做的數據庫通常是毫無意義的,因爲「真正的系統」必須一直存在這樣的失敗。 – MarkR