2012-05-24 2 views
7

をログに記録します() ?以下のSO postは、複数のキャッシングレイヤが関係しているため、このような保証はできません。整合性を保証するデータベースシステムでは、WAL(Write Ahead Logging)リカバリでは、実際にデータを変更する前にログをディスクに保存しておく必要があるため、アプリケーション/システムに障害が発生した場合最後の既知の一貫性のある状態に戻すことができます。実際のデータベースシステムでは、これがどのように保証/実装されていますか?保証は先に実装

+0

私はSQLiteサイトの説明を見ていきます。これは、ハードウェア(同期)フラッシュが使用されている時の概要を提供するようにアプローチがどのように使用されたかをカバーします。 –

答えて

1

sync()システムコールは、事実上何の助けではありません。ディスクへの書き込み操作をスケジュールすることが約束されていますが、それはすべてについてです。

使用される通常の手法は、正しいオプションを設定するときにディスク・ファイルのためのあなたopen()ファイルディスクリプタ:O_DSYNCO_RSYNCO_SYNC。しかし、fsync()fdatasync()は、ほぼ同じ効果に近づきます。 POSIXで標準化されていないものの、しばしばサポートされているO_DIRECTIOも見ることができます。

最終的には、DBMSは、一枚のディスクに書き込まれ、同期されたデータが安全であることを約束するO/Sに依存しています。 DBMSが最後に書き込んだものをデバイスが返す限り、たとえキャッシュのために実際のディスクにいなくても(不揮発性キャッシュなどにバックアップされているため)、重要ではありません。もし、あなたが最後に書いたもの(そしてディスク上で安全だと言われていた)が保証されていないNAS(ネットワーク接続ストレージ)を持っていれば、DBMSはそれをしなければならない回復。したがって、DBMSを慎重に格納する場所を選択し、ストレージが分かりやすく動作するようにします。ストレージが仮想ディスクのように十分に機能しない場合、データが失われる可能性があります。

+0

DirectIOは、この質問が尋ねる保証を提供しません。しかし、OSYNCのフラグを立てると、何が期待されているのかが分かります。 – ArekBulski

0

はい、カーネルの最近のバージョンでfsyncは、プラッタのディスクとディスクハードウェアバッファにフラッシュメモリ(バッファキャッシュ)の両方を行います。マンページでは、古いカーネルは最初のことしかしていないと言います。

説明FSYNC()転送(「フラッシュ」)は、すべての(用すなわち、修飾されたバッファキャッシュページ)ディスクにファイルdescrip- TOR fdで 呼ばれるファイルの にコアデータを改変しますデバイス(または他のパーマネント 記憶装置)を使用して、システムがクラッシュまたは再起動した後でも、変更されたすべての情報を取得することができます( )。 これには、 が存在する場合にディスクキャッシュを介して書き込むか、またはフラッシュすることが含まれます。 が転送されたことをデバイスが報告するまで、 コールはブロックされます。また、ファイルには というメタデータ情報がフラッシュされます(stat(2)を参照)。

古いカーネルでfsync()の実装が使用されており、あまり使用されていない ファイルシステムでは、ディスクキャッシュをフラッシュする方法がわかりません。これら 例のディスクキャッシュでは、安全な動作を保証するためにはhdparm(8)または sdparm(8)を使用して無効にする必要があります。

これは、アプリケーションが要求することができるものを指します。 Fsyncは、ファイルシステムがアプリケーションに提供するインタフェースであり、ファイルシステム自体はその下に別のものを使用します。ファイルシステムは、障壁、あるいはジャーナルをコミットするためのむしろ明示的なフラッシュとFUA要求を使用します。Look at LWN post.

関連する問題