2017-08-10 36 views
0

我最近一直在閱讀redis源代碼,我發現在flushAppendOnlyFile()中,編寫者使用fdatasync將數據更新到磁盤。我們知道,fdatasync()不會寫入元數據信息,而flushAppendOnlyFile()會更改aof文件的大小。所以如果在系統更新元數據之前發生崩潰,最新的aof數據會丟失嗎? 筆者在http://oldblog.antirez.com/post/fsync-different-thread-useless.html下面寫道如果在aof中使用fdatasync()時發生崩潰,數據將會發生什麼?

我能避免synching元數據沒有問題,但如果我理解這個正確的,在一個只添加的文件方面,是否未同步大小似乎等同於泄漏數據,如果發生崩潰我猜...所以這在我的情況下是不可能的。

我不明白爲什麼它不可能在redis上下文中。 任何人都可以幫助我嗎?

回答

0

這不是他在說的。 fdatasync確實更新的文件的元數據,如果大小發生了變化,如由該評論「kosaki」即Salvatore於響應所指出的,並作爲通過該說

fdatasync()是類似於手冊指出FSYNC(),但它不刷新修改的元數據除非需要,以允許隨後的數據檢索是正確的元數據處理

(重點煤礦)。所以使用fdatasync來同步AOF時不會丟失數據。

什麼kosaki暗示是一種不同步的同步方法,它確實從不會同步元數據,而Salvatore指出會在發生崩潰時丟失數據。什麼是「不可能的」是使用替代而不是fdatasync

+0

謝謝!我對fdatasync有一個錯誤的理解。 – petersunbag