2012-07-17 44 views
6

我一直在使用MongoDB一段時間,看到fsync等待數據刷新到磁盤。好吧,所以我認爲這是數據安全的解決方案。什麼是MongoDB的fsync?

它很好地工作了很長時間,比SQL替代方案更長。然後我看到我可以將syncdelay設置爲0,然後速度回來了,但是我想,未來會有很多併發請求。所以我從更新中刪除了fsync選項並插入並刪除了syncdelay配置選項。

要測試數據是否正在寫入,我在更新數據之後迅速檢查了Rockmongo,並且數據實際上在那裏超快!

那麼真的,fsync是什麼,如果它使寫入緩慢,沒有它的寫入發生,反正呢?

回答

5

每蒙戈文檔:

fsync的主要用途是沖洗和鎖定用於備份數據庫。

的FSYNC操作阻塞其他所有的寫操作了一段時間運行。

堵塞似乎是原因。

4

fsync從技術上講是一個強制刷新所有數據到磁盤的管理命令。你不應該在你的代碼中使用它,至少不是。它用於鎖定數據庫進行備份等。

MongoDB中的數據安全來自複製/分片/日誌記錄,而不是強制寫入。這種打敗了事情的目的。

Java驅動程序在WriteConcern類中包裝了這個'寫入和同步'概念,我從來沒有真正喜歡過它。您不必決定數據的哪個部分更重要或更不重要,而只需要相信該工具可以完成其工作。

此外,如果您將syncdelay設置爲零,請確保您關閉日記功能。請參閱this

+0

我最大的擔憂是Mongo在同步延遲之後將內存中的數據存儲到磁盤,並且如果用戶收到成功的味精,但在同步之前硬件出現故障,基本上是一個很大的失敗。 對嗎?或者是否有解決方案? – Hadrian 2012-07-17 22:43:51

+0

再次,複製。MongoDB是分佈式數據存儲,而不是RDBMS。 MongoDB的一個實例基本上是_useless_,因爲你不能依靠它自己的持久性。一旦你有兩個實例,那麼你不需要擔心硬件失敗。 – kprobst 2012-07-17 22:45:41

+0

使用日記功能的單個實例對於耐久性來說很好,特別是對於日記編寫問題。 – MrKurt 2012-07-17 22:52:32

0

正如其他答案所說,fsync命令強制刷新,通常在鎖定數據文件以用於時間點快照之前正常使用。

​​上有一個「fsync」write concern option,它將等待返回到所有待處理數據已刷新到磁盤。您通常不會使用它,但「j」選項(一旦發生日誌記錄就會返回)返回的速度要快得多,並且仍然可以確保持久寫入。您可以通過更新/插入命令作爲選擇的驅動程序中的安全選項,讓它爲您自動運行​​命令。