我正在寫一些軟件來處理非常關鍵的數據,並且需要知道我到底需要做什麼來實現耐久性。需要什麼才能在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上運行這個,我不知道這是否會影響任何東西。雖然它很難測試,因爲我無法控制它被關閉的程度。
數據總是會丟失,至少是因爲硬件(或軟件)故障。您應該備份(即複製)它,或者至少計算一些校驗和(以便能夠驗證或使其無效)。我不確定玩系統調用技巧是否足夠。我會盡力複製和校驗關鍵數據,也許會考慮交易。 –
@BasileStarynkevitch在上面的圖層中,數據僅在兩個節點已確認時纔會被視爲已寫入,並且我們還會每日拍攝快照。我們認爲這是足夠的,它只是確保在確認這是問題之前將數據實際寫入HDD。 – Max