Linux用のデータベースエンジンで作業しています。カーネルへのシステムコールを1回実行して多数のブロックを書き込むことに関する一貫性に関する質問があります。私はO_DIRECTでデバイスを開きます。O_DIRECTで多くのブロックを一貫して書き込む
デバイスは、ハードウェアに応じて、512,2048または4096のブロック単位でデータを書き込みます.1つのシステムコールで512バイトの2ブロックを書き込むとします。ディスクが1ブロックを書き込んだ後、システムが正確にシャットダウンされるとどうなりますか?通常の操作では、write()システムコールは書き込まれたデータのサイズを返します。したがって、2つの値が一致しない場合は比較してエラーを生成できますが、電源がシャットダウンすると複雑になります。カーネルがあなたが指示した順序でデバイスに書き込み要求を送るかもしれないので、さらに複雑です。要求の末尾が頭の前に書かれていて、電源が切れている可能性があります。
データベースエンジンがトランザクションログを書き込むとします。トランザクションは約4096バイトで、エンジンは512バイトの8ブロックを書き込む必要があります。突然電源遮断が発生し、要求の半分しか書かれませんでした。データベースがこれらの問題をどのように処理するか?この問題を回避するには、まずディスク上の別の場所に書き込みたいブロックの量を書き込む必要があります。正しい戻り値を受け取ったら、データを書き込むことができます。次に、確認を受け取った後、書き込みたいブロックがすべて実際に書き込まれたという情報を更新する別の書き込みをディスクに送信する必要があります。したがって、これは3回の書き込み操作を必要とし、カーネルが別のプロセスからのディスクへの書き込みを行っている場合は、3回のシークが発生します。あまりにも効率が悪い。
私は、ディスクへの書き込み操作が1つだけで多くのブロックの一貫した書き込みを実現する方法を探しています。 (1つのwrite()システムコール)これは可能ですか?
停電を検出してサーバーを正常に停止するのに十分なバッテリまたはコンデンサの充電がないのはなぜですか? –
@R ..、実際これは良いアイデアです。 UPSを持っているだけで、補助ディスクブロックをキャッシュし、1回のシークで実際のデータを書き込むことができます。誰にとってもうまくいかないかもしれませんが、緊急時に備えてバックアップを取っている間に、迅速な日々の操作を提供するための良い解決策です。 – Nulik