2012-05-24 55 views
7

如果一個人發出連續的一系列的Linux/Unix write(2)通過fdatasync(2)fsync(2)sync(2)是它保證了第一次寫入()將你的第二個寫之前提交到磁盤分隔() ?以下SO post似乎表示這樣的保證不能給出,因爲涉及多個緩存層。對於保證一致性的數據庫系統來說,這似乎很重要,因爲在WAL(預先寫入日誌記錄)恢復中,在實際更改數據之前,需要將日誌保留在磁盤上,以便在發生應用程序/系統故障時你可以恢復到你最後一個已知的一致狀態。這是如何在實際的數據庫系統中保證/實施的?擔保在預寫日誌實現

+0

我會看看SQLite網站上的解釋。它涵蓋了如何使用這些方法,因爲它提供了何時使用硬件(同步)刷新的概述等。 – 2012-05-24 04:17:45

回答

1

sync()系統調用是幾乎沒有任何幫助;它承諾安排寫入磁盤操作,但這是所有。

使用正常的技術是設置正確的選項,當你open()爲磁盤文件的文件描述符:O_DSYNCO_RSYNCO_SYNC。但是,fsync()fdatasync()變得非常接近相同的效果。你也可以看看O_DIRECTIO,它經常被支持,雖然它根本不是POSIX的標準。

最終,DBMS依賴於O/S進行的書面和同步的數據到一個磁盤是安全的。只要設備將總是返回DBMS上次寫入的內容,即使它由於緩存而不在實際磁盤上(因爲它是在非易失性緩存中備份的,或者類似的東西),那麼它並不重要。另一方面,如果你有NAS(網絡附加存儲),它不能保證你最後寫的東西(並且被告知在磁盤上是安全的)會在你讀到它時返回,那麼你的DBMS如果必須做復甦。因此,您應該謹慎選擇數據庫的存儲位置,確保存儲的運作合理。如果存儲不能像假想磁盤一樣工作,那麼最終會丟失數據。

+0

DirectIO不提供此問題要求提供的保證。但是,OSYNC標誌可以打開什麼是預期的,當然。 – ArekBulski

0

是,fsync內核的現代版本確實都閃速存儲器(高速緩存)的磁盤和磁盤硬件緩衝區拼盤。手冊頁說舊的內核過去只做第一件事。

說明FSYNC()傳輸(「沖洗」)中的所有修飾在覈心數據(即,經修飾的緩存頁)由文件descrip- TOR FD稱爲 到磁盤的文件 設備(或其他永久存儲設備),以便即使在系統崩潰或重新引導後也可以檢索所有更改的信息 。 這包括 寫入或刷新磁盤高速緩存(如果存在)。 調用塊,直到設備報告傳輸已完成 。它還將與文件關聯的元數據信息(參見stat(2))刷新爲 。

舊版內核中的fsync()實現和較少使用的 filesys不知道如何刷新磁盤緩存。在這些 案例中,需要使用hdparm(8)或 sdparm(8)禁用磁盤緩存以確保安全操作。

這是指應用程序可以要求什麼。 Fsync是文件系統提供給應用程序的接口,文件系統本身使用下面的其他內容。文件系統使用障礙,或者明確的沖洗和FUA請求來提交日誌。看看LWN post.