62

明確化された質問:

OS がセクタをディスクに書き込むコマンドを送信するとき、それはアトミックですか? つまり、新しいデータの書き込みは完全に成功するか、書き込みコマンドの直後に電源が落ちた場合、古いデータはそのまま残ります。複数のセクターの書き込みで何が起こるかは気にしません - 破れたページは許容されます。

古い質問:

ディスク上に古いデータ X があり、その上に新しいデータ Y を書き込むと、その書き込み中に木が電力線に落ちるとします。派手な UPS やバッテリーでバックアップされたディスク コントローラがなければ、ディスク上のデータが一部 X と一部 Y である破れたページになってしまう可能性があります。 、一部ゴミ?

私はデータベースのような ACID システムの設計を理解しようとしてきましたが、私の素朴な考えでは、先行書き込みログを使用しない firebird は、特定の書き込みが古いデータを破壊しないことに依存しているようです (X) -新しいデータを完全に書き込めないだけです (Y)。つまり、X の一部が上書きされた場合、保持しようとしている X の部分ではなく、上書きされている X の部分のみを変更できます。

明確にするために、これは、保持したい半分Y、半分Xで満たされたページサイズのバッファ、たとえば4096バイトがある場合、OSにそのバッファをXに書き込むように指示した場合、深刻なディスク以外の状況はないことを意味します保持したい半分の X が書き込み中に破損するという障害。

4

9 に答える 9

21

破れたページは問題ないと思います。私の知る限り、すべてのドライブには、停電時に現在のセクターの書き込みを完了するのに十分な電力が蓄えられています。

問題は、誰もが嘘をつくことです。

少なくとも、トランザクションがいつディスクにコミットされたかを知るデータベースに関しては、誰もが嘘をつきます。データベースは fsync を発行し、オペレーティング システムはすべての未処理の書き込みがディスクにコミットされた場合にのみ戻りますよね? そうでないかもしれない。特に RAID カードや SATA ドライブでは、すべてがコミットされた (つまり、fsync が返された) にもかかわらず、まだドライブにデータが残っていないことがプログラムに通知されることがよくあります。

Brad の diskcheckerを使用して、データベースに使用する予定のプラットフォームがプラグを抜いてもデータを失うことなく生き残ることができるかどうかを調べることができます。結論: diskchecker が失敗した場合、プラットフォームはデータベースを実行するのに安全ではありません。ACID を備えたデータベースは、トランザクションがいつバッキング ストアにコミットされたのか、いつコミットされなかったのかを知ることに依存しています。これは、データベースが先行書き込みログインを使用するかどうかに関係なく当てはまります (データベースが fsync を実行せずにユーザーに戻った場合、障害が発生した場合にトランザクションが失われる可能性があるため、ACID セマンティクスを提供すると主張するべきではありません)。 )。

Postgresqlメーリング リストには、耐久性について議論している長いスレッドがあります。最初は SSD について話していますが、その後、SATA ドライブ、SCSI ドライブ、およびファイル システムの話に入ります。データが損失にさらされる可能性があることを知って驚くかもしれません。これは、Postgresql を実行している人だけでなく、耐久性が必要なデータベースを使用しているすべての人に適したスレッドです。

于 2010-01-05T22:15:49.980 に答える
17

この質問に同意する人は誰もいないようです。そのため、最終的に答えが見つかるまで、さまざまな Google クエリを試すのに多くの時間を費やしました。

RedHat の従業員であり、Linux カーネル ファイルシステムおよび仮想メモリの開発者である Dr. Stephen Tweedie による ext3 (彼が開発した) に関する講演のトランスクリプトはこちら. 知っている人がいれば、それは彼だ。

「ジャーナルに何かを書き込むだけでは十分ではありません。なぜなら、ジャーナルには次のようなマークが必要だからです:まあ、(このジャーナル レコードは実際にあるのですか)このジャーナル レコードは実際にディスクとの完全な一貫性を表しているのでしょうか?そして、その方法は、そのトランザクションがディスク上で完了したことを示すアトミック操作を行うことです」[23m、14s]

「現在、最近のディスクは実際にこれらの保証を行っています。ディスクへの書き込み操作を開始すると、そのセクター書き込みの途中で電源が落ちたとしても、ディスクには十分な電力があり、実際にディスクから電力を盗むことができます。スピンドルの回転エネルギー; 現在書き込まれているセクターの書き込みを完了するのに十分な電力があります. すべての場合において、ディスクはそれを保証します. [23分41秒]

于 2010-01-15T00:29:48.013 に答える
10

いいえそうではありません。さらに悪いことに、ディスクは嘘をつき、データが実際にはデフォルト設定でディスク キャッシュにあるのに、データが書き込まれたと言うことがあります。パフォーマンス上の理由から、これは望ましいことかもしれませんが (実際の耐久性は最大で 1 桁遅くなります)、電源が失われ、ディスク キャッシュが物理的に書き込まれなくなった場合、データが失われることを意味します。

書き込みごとに少なくとも 1 回、またはジャーナリング/元に戻すには 2 回以上の完全なローテーションを行う必要があるため、実際の耐久性は残念ながら難しく遅いものです。これにより、毎秒数百の DB トランザクションに制限され、かなり低いレベルで書き込みキャッシュを無効にする必要があります。

ただし、実際には、ほとんどの場合、違いはそれほど大きな問題ではありません。

見る:

于 2010-01-14T05:21:22.827 に答える
8

電源が落ちた場合にセクター書き込み中に何が起こるかについて、人々は同意していないようです。おそらく、使用されているハードウェアやファイルシステムに依存するためです。

ウィキペディアから ( http://en.wikipedia.org/wiki/Journaling_file_system ):

一部のディスク ドライブは、電源障害時の書き込みアトミシティを保証します。ただし、電源が失われた後、セクターの途中で書き込みを停止し、エラー修正コードと一致しないままになるものもあります。したがって、セクターは破損し、その内容は失われます。物理ジャーナルは、セクターの完全なコピーを保持し、次のマウント時に破損を再生できるため、このような破損を防ぎます。

一部のハードドライブはセクターの書き込みを完了しないことを示唆しているようですが、ジャーナリングファイルシステムは、xlog がデータベースを保護するのと同じ方法でデータ損失から保護できることを示唆しています。

ext3ジャーナリングファイルシステムに関するディスカッションのLinuxカーネルメーリングリストから:

いずれにせよ、不良セクタのチェックサムはハードウェアのバグです。セクター書き込みはアトミックであると想定されており、発生するかどうかのいずれかです。

私はウィキのコメントでそれを信じる傾向があります。実際、xlog のないデータベース (firebird) が存在するということは、セクター書き込みがアトミックであり、変更するつもりのないデータを上書きできないことを意味します。

ここでは、セクター書き込みの原子性についてかなりの議論がありますが、やはり合意はありません。しかし、反対している人は、複数セクターの書き込みについて話しているようです (最近の多くのハード ドライブではアトミックではありません)。

于 2010-01-06T17:58:11.947 に答える
5

最初の質問に対する答えは、関連するハードウェアによって異なります。少なくとも一部の古いハードウェアでは、答えは「はい」でした。電源障害により、ガベージがディスクに書き込まれる可能性があります。ただし、現在のほとんどのディスクには、ディスク自体に少しの「UPS」が組み込まれています。これは、ディスク上のキャッシュのデータをディスク プラッタに書き込むのに十分な時間、ディスクに電力を供給するのに十分な大きさのコンデンサです。また、電源がまだ良好かどうかを検出する回路も備えているため、電源が不安定になると、キャッシュ内のデータをプラッターに書き込み、受け取ったゴミを無視します。

「破損したページ」に関する限り、典型的なディスクは一度にセクター全体を書き込むコマンドのみを受け入れるため、通常、取得されるのは正しく書き込まれたセクターの整数であり、他のセクターは変更されません。ただし、単一セクターより大きい論理ページ サイズを使用している場合は、部分的に書き込まれたページになる可能性があります。

ただし、これは通常のムービング プラッター タイプのハード ドライブに直接接続する場合にほとんど当てはまります。他のほとんどのものでは、ルールが異なる可能性があり、多くの場合、異なる場合があります. 明らかな例として、ネットワーク経由で書いている場合、ほとんどの場合、使用中のネットワーク プロトコルに翻弄されます。TCP 経由でデータを送信する場合、CRC と一致しないデータは拒否されますが、UDP 経由で送信された同じデータは同じ破損で受け入れられる可能性があります。

于 2010-01-05T21:17:52.917 に答える
2

この仮定は間違っていると思います。

最新の HDD はデータをセクター単位でエンコードし、さらに ECC で保護します。したがって、すべてのセクター コンテンツをガベージしてしまう可能性があります。使用するエンコーディングでは意味がありません。

ますます普及しているSSDに関しては、状況はさらに悲惨です.ブロックは上書きされる前にクリアされるため、使用されているファームウェアと空き容量によっては、まったく関係のないセクターが破損する可能性があります.

ちなみに、OS がクラッシュしても、単一セクター内のデータが破損することはありません。

于 2010-01-05T21:09:01.670 に答える
0

1 つの破れたページは、X 部分、Y 部分、読み取り不能な部分で構成されていると思います。電源が落ちたときにヘッドがセクタへの書き込みの途中である場合、ドライブはヘッドをすぐに停止して、ドライブの残りの部分 (その 1 つのセクタを除く) が損傷を受けないようにする必要があります。

場合によっては、部分 X と部分 Y で構成されるいくつかの破れたページが予想されますが、1 つの破れたページだけに読み取り不能なセクターが含まれます。いくつかの破れたページの理由は、ドライブが内部で大量の書き込みをバッファリングできるためであり、書き込みの順序がさまざまなページのさまざまなセクターをインターリーブする可能性があります。

読み取り不能なセクターへの新しい書き込みが再び読み取り可能になるかどうかについて、矛盾する話を読んだことがあります。答えが「はい」であっても、それは X でも Y でもなく、新しいデータ Z になります。

于 2010-01-14T03:57:21.540 に答える