2012-10-20 23 views
7

我正在寫一些軟件來處理非常關鍵的數據,並且需要知道我到底需要做什麼來實現耐久性。需要什麼才能在Linux上持久?

無論我看到的是矛盾的信息,所以我會很感激任何見解。

我有三種寫入磁盤的方式。

  • 使用O_DIRECT | O_DSYNC,並預先寫入,然後寫入512字節 - 16 MB塊。

  • 使用O_DIRECT,預先寫入,然後寫入512字節塊,並根據需要定期調用fdatasync。

  • 使用內存映射文件,我必須定期調用msync(...,MS_SYNC | MS_INVALIDATE)。

這是所有的ext4默認標誌。

對於所有這些,是否有可能丟失數據(在寫入或同步返回之後)或由於電源故障,緊急情況,崩潰或其他原因而損壞?

如果我的服務器死於中間pwrite,或者在pwrite的開始和fdatasync的結束之間,或者正在更改的映射內存和msync之間,我可能會混合使用新舊數據,或者它會是一個還是另一個?我希望我的個人pwrite調用是原子的,並且是有序的。是這樣嗎?如果他們跨越多個文件,是這種情況嗎?所以,如果我用O_DIRECT |寫入O_DSYNC到A,然後是O_DIRECT | O_DSYNC到B,我保證,無論發生什麼,如果數據在B中,它也在A中?

fsync是否甚至可以保證數據的寫入? This說不,但是我不知道自那以後事情是否改變了。

ext4的日記完全解決了this SO answer說存在的損壞塊的問題嗎?

我目前正在通過調用posix_fallocate來生長文件,然後ftruncate。這些都是必要的,它們足夠嗎?我認爲ftruncate實際上會初始化分配的塊以避免these issues

爲了增加混淆,我在EC2上運行這個,我不知道這是否會影響任何東西。雖然它很難測試,因爲我無法控制它被關閉的程度。

+1

數據總是會丟失,至少是因爲硬件(或軟件)故障。您應該備份(即複製)它,或者至少計算一些校驗和(以便能夠驗證或使其無效)。我不確定玩系統調用技巧是否足夠。我會盡力複製和校驗關鍵數據,也許會考慮交易。 –

+2

@BasileStarynkevitch在上面的圖層中,數據僅在兩個節點已確認時纔會被視爲已寫入,並且我們還會每日拍攝快照。我們認爲這是足夠的,它只是確保在確認這是問題之前將數據實際寫入HDD。 – Max

回答

3

對於所有這些,數據是可能丟失(寫入或同步返回後)還是由電源故障,恐慌,崩潰或其他任何損壞?

絕對。

fsync是否甚至可以保證數據的寫入?這不說,但是我不知道自那以後事情是否改變了。

不是。答案是依賴於設備,可能依賴於文件系統。不幸的是,該文件系統可能是「實際」存儲設備上方的層和層。 (例如。md,lvm,fuse,loop,ib_srp等)。

雖然它很難測試,因爲我無法控制它被關閉的程度。

的確如此。但你可能仍然可以使用NMI或sysrq-trigger來創建一個非常突然的停頓。

相關問題