私はかなり重要なデータに対処するためのソフトウェアを書いており、耐久性を達成するために正確に何をする必要があるかを知る必要があります。Linuxで耐久性を持たせるには何が必要ですか?
どこでも私は矛盾した情報であるため、洞察に感謝します。
ディスクに書き込む方法は3つあります。
O_DIRECT | O_DSYNCとし、512バイト〜16MBのブロックを先読みしてからpwriteする。
O_DIRECTを使用して、512バイトブロックをプリロードしてからpwriteし、必要に応じて定期的にfdatasyncを呼び出します。
msync(...、MS_SYNC | MS_INVALIDATE)を必要に応じて定期的に呼び出すメモリマップファイルを使用します。
これはすべてデフォルトフラグでext4上にあります。
これらのすべてについて、データが失われたり(書き込みまたは同期が戻った後)、停電、パニック、クラッシュなどで破損する可能性はありますか?
私のサーバーがpwriteの中間、またはpwriteの開始からfdatasyncの終わりまで、または変更されたマップされたメモリとmsyncの間で死んでしまう可能性はありますか?古いデータと新しいデータが混在するそれはどちらか一方でしょうか?私は自分の個々のpwrite呼び出しをアトミックで順序付けしたい。これは本当ですか?複数のファイルにまたがっている場合はどうなりますか?だから私はO_DIRECTで書く場合| O_DSYNCをA、次にO_DIRECTを| O_DSYNCからBへ、私は、何が起こっても、データがBに入っていればそれもAであることを保証していますか?
fsyncはデータの書き込みを保証しますか? Thisは言っていませんが、それ以来変化しているかどうかはわかりません。
ext4のジャーナリングは、this SO answerが言う壊れたブロックの問題を完全に解決していますか?
私は現在、posix_fallocateを呼び出してからftruncateを呼び出すことによってファイルを増やしています。これらの両方が必要であり、十分ですか?私はftruncateが実際にthese issuesを避けるために割り当てられたブロックを初期化すると考えました。
ミックスに混乱を追加するには、EC2でこれを実行していますが、それが何かに影響を与えるかどうかはわかりません。どのように積極的にシャットダウンするかを制御できないため、テストするのが非常に難しくなります。
少なくともハードウェア(またはソフトウェア)の障害が原因で、データが常に失われる可能性があります。それをバックアップするか、少なくともチェックサムを計算する必要があります(それを検証または無効にするには)。私は、システムコールのトリックが十分であるかどうかはわかりません。私は重大なデータを複製してチェックサムを作成することに熱心に取り組み、おそらくトランザクションの観点から考えます。 –
@BasileStarynkevitchこれ以上の層では、2つのノードが確認したときにのみデータが書き込まれたとみなされ、毎日のスナップショットも取得されます。これは十分だと考えています。問題を確認する前にデータを実際にHDDに書き込むことを保証するだけです。 – Max