物理マシンホストで実行されている仮想マシン(Debian)があります。仮想マシンは、ローカルネットワークを介して頻繁に受信するデータのバッファーとして機能します(このデータの期間は0.5秒であるため、かなり高いスループットです)。受信したデータはすべて仮想マシンに保存され、UDPを介して外部サーバーに繰り返し転送されます。外部サーバーが(UDPを介して)データパケットを受信したことを確認すると、元のデータは仮想マシンから削除され、外部サーバーに再度送信されることはありません。 VMと外部サーバーを接続するインターネット接続は信頼性が低いため、一度に数日間ダウンする可能性があります。
VMをホストする物理マシンは、ランダムに1日に数回停電します。これがいつ発生するかを知る方法はなく、UPSを追加することもできません。バッテリー、またはシステムの同様のソリューション。
元々、データは仮想マシン上のファイルベースのHSQLDBデータベースに保存されていました。ただし、頻繁な停電により、最終的にデータベーススクリプトファイルが破損します(ファイルシステムレベルではありません。つまり、読み取り可能ですが、HSQLDBはそれを理解できません)。これが私の質問につながります。
停電が頻繁に発生する可能性がある環境で、データをどのように保存する必要がありますか?
私が考えることができる1つのオプションは、フラットファイルを使用して、データの各パケットをファイルシステムにファイルとして保存することです。このようにして、電源の喪失によりファイルが破損した場合、そのファイルは無視され、残りのデータはそのまま残ります。ただし、これにはいくつかの問題がありますが、主に仮想マシンに保存される可能性のあるデータの量に関連しています。各データ間の0.5秒で、10日間で1,728,000個のファイルが生成されます。これは、少なくとも、このデータを格納するためにiノードの数を増やしたファイルシステムを使用することを意味します(現在のファイルシステムのセットアップでは、最大250,000メッセージと30%のディスク容量でiノードが不足しています)。また、管理するのは難しい(不可能ではない)。
他に選択肢はありますか?停電によって破損しないDebianで実行されるデータベースエンジンはありますか?また、これにはどのファイルシステムを使用する必要がありますか? ext3は現在使用されているものです。
仮想マシンで実行されるソフトウェアはJava 6を使用して記述されているため、ソリューションに互換性がないことを願っています。
正直なところ、ここでの最善のアプローチは、停電を修正するか、別のシステムをより適切な場所に展開することです。
はい、再生のためにデータを追加専用ログに保存するredisなどのシステムがありますが、より低いレベルで破損するリスクがあります。ファイルシステムがスクランブルされている場合、ディスク上のデータは潜在的に危険にさらされています。
どんな改善でもあなたに役立つことを感謝します、しかし実際にはあなたが概説したシナリオを考えると問題は解決できるものではありません。
あなたのアプローチはうまくいくことができます。それに対するいくつかの機能強化を提案させてください。 ファイルへのアトミック書き込み のスタックオーバーフローに質問がありました。基本的に、データの各パケットを一時ファイルに保存してから、名前を最終的な名前に変更します。名前の変更は、電源障害から安全なアトミック操作です。そうすれば、最終的な宛先にあるすべてのファイルが破損することなく正しく保存されていることが保証されます。
次に、何百万ものファイルがあるという問題に対処するために何ができるか。 cronは、おそらく1時間ごとに実行されるジョブであり、1時間より古いすべてのファイルを取得し、再びアトミックファイル操作を使用してそれらを1つの大きなファイルに結合します。これにより、このジョブは電源障害時でも安全に実行され、古いファイルが削除されます。ログローテーションのようなものです。 1時間分のファイルは、約7,200ファイルになります。したがって、どの時点でも、ディスク上に20,000を超えるファイルを置くべきではありません。
バッテリバックアップ式の書き込みキャッシュを備えたUPSまたはRAIDカードをシステムにインストールします そしてわずか49.95ドルで 、ソフトウェアだけでは達成できないことを達成します。
このサーバーをUPSまたはバッテリーに接続することはどういうわけか不可能であるというあなたの主張は...単に信じられないほどです。
すべてのデータを格納するブロックデバイスを除いて、システム全体を読み取り専用でマウントします。そのブロックデバイスを直接使用し、そのrawブロックデバイスを使用して独自のデータストレージメカニズムを実装します。