我在基於Linux的系統上運行2.6.3x內核x86的這一要求..恢復數據
我的過程中有一些動態數據(並不多,在幾分鐘兆字節範圍)已回收如果進程崩潰。顯而易見的解決方案是將數據存儲在共享內存中,並在進程重新啓動時再次讀取它。寫共享內存必須小心,這樣在更新過程中進程崩潰不會使共享內存中的數據損壞。
編碼之前,我只是想檢查是否有任何開源的程序/庫提供此功能..謝謝。
-Santhosh。
我在基於Linux的系統上運行2.6.3x內核x86的這一要求..恢復數據
我的過程中有一些動態數據(並不多,在幾分鐘兆字節範圍)已回收如果進程崩潰。顯而易見的解決方案是將數據存儲在共享內存中,並在進程重新啓動時再次讀取它。寫共享內存必須小心,這樣在更新過程中進程崩潰不會使共享內存中的數據損壞。
編碼之前,我只是想檢查是否有任何開源的程序/庫提供此功能..謝謝。
-Santhosh。
我不認爲你提出的設計是健全的。操作系統崩潰(例如電源故障等)可能會導致mmap'd區域被部分同步到光盤(也許這些頁面的寫入順序與您編寫的順序不同),這意味着您的數據結構將會得到以任意方式損壞。
如果你需要你的數據庫更改是持久的和原子的(也許一致性和完整性也不會傷害,對吧?),那麼我強烈建議使用支持ACID的現有數據庫系統或適當的子集。也許sqlite或Berkeley DB可以做到這一點。
原則上,你可以自己做,但不是按照你所描述的方式 - 你需要創建某種類型的日誌文件,這種日誌文件可以以原子方式讀回來,並且可以被自動讀取能夠從一些已知的快照等「重放」事件,這在技術上是具有挑戰性的。
記住:
我意識到,利用每一個讀或寫操作你的數據結構庫(例如BDB或源碼)是一種侵入性的變化,但如果你想這樣的魯棒性,我認爲這是必要的。
感謝您的建議。一個澄清儘管..我需要的數據才能恢復只有當我的進程重新啓動。如果操作系統崩潰,那麼我不需要。爲了寫入共享內存,我想在/ dev/shm中創建一個文件。任何寫入/ dev/shm(即:tempfs)的東西都不會寫入磁盤,不是嗎? – Manohar
我曾假設您的數據不僅僅存在應用程序崩潰,還存在操作系統崩潰,電源故障或其他硬件故障。建立一個不能這樣做的數據庫通常是毫無意義的,因爲「真正的系統」必須一直存在這樣的失敗。 – MarkR