電源がランダムに切断されるマシンにデータを保存する方法


13

物理マシンホストで実行されている仮想マシン(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を使用して記述されているため、ソリューションに互換性がないことを願っています。


14
「VMをホストする物理マシンは、1日に数回ランダムに電源が切断されます。これがいつ発生するかを知る方法はなく、UPS、バッテリー、または同様のソリューションを追加することはできませんシステム。" 私は本当にそれがどのように可能か知りたいです。国際宇宙ステーションにあるので、UPSを送るために2,000万ドルが必要ですか?
ceejayoz

3
マシンには、少なくともバッテリーバックアップキャッシュを備えたRAIDコントローラーがありますか?
ゾレダチェ

4
この問題に対する非常に興味深く、創造的で、おそらく理論的に正しい解決策をお勧めできます。ただし、ホストで実行されているハイパーバイザーとハードウェアがわからないため、ディスクの書き込みが実際に書き込まれた、または正しい順序で書き込まれたという保証はありません...
pino42

5
@Sevasはあなたの電話ではないように聞こえますが、50個の基本的な安価なUPSは2500ドルの費用がかかり、メンテナンスが不要であることを指摘する価値があることをお勧めします)。ソフトウェアでこれを解決しようとするコストは、無料で働く多くのコーダーを知っていない限り、それよりもはるかに高くなります。経営陣に1時間あたり3桁の数十または数百の熟練工数ではなく、50ドル/ユニットでこれを解決させるのに役立つかもしれません。
HopelessN00b

9
これは実際には悪意のあるプログラムのように聞こえます。ユーザーは、自分のコンピューターで「VM」が実行されていることを知りません。ネットワーク全体からデータを盗み、1つの接続を通じてデータを漏えいして自分自身を隠しています。ユーザーがランダムに「コンピューターの電源を切ったり入れたりする」ため、UPSを追加することはできません。
ローレンス

回答:


23

正直なところ、ここでの最善のアプローチは、停電を修正するか、より良い場所に別のシステムを展開することです。

はい。redisなどのシステムは、再生専用の追加専用ログにデータを保存しますが、低レベルで破損するリスクがあります。たとえば、ファイルシステムがスクランブルされた場合、ディスク上のデータが危険にさらされる可能性があります。

どんな改善もあなたにとって有用であることを感謝しますが、実際にあなたが概説したシナリオを考えると、問題は解決できるものではありません。


8
+1正解は「それをしないでください」です
クリスS

6
+1最終的にランダムな停電はファイルシステムを破壊します。電化製品は、電源が落ちたときに予想外の奇妙なことをします。
グラント

-1(仮想-1)。このようなシステム、停電が時々発生するという前提で構築する必要があると思います。この仮定は、対処しなければならない現実の事実です。
イガルセルバン

11

あなたのアプローチは機能します。それにいくつかの機能強化を提案させてください。fileへのアトミック書き込みでスタックオーバーフローに問題がありました。基本的に、データの各パケットを一時ファイルに保存してから、最終的な名前に名前を変更します。名前の変更は、電源障害から安全な原子操作です。そうすれば、最終目的地のすべてのファイルが破損することなく正しく保存されることが保証されます。

次に、何百万ものファイルを持つ問題に対処するためにできること。cronは、おそらく1時間ごとに実行されるジョブです。1時間以上経過したすべてのファイルを取得し、再びアトミックファイル操作を使用して1つの大きなファイルに結合します。ログローテーションのようなもの。1時間分のファイルは約7,200ファイルです。そのため、どの時点でも、ディスク上に20,000個を超えるファイルを置かないでください。


1
悪い答えではありませんが、それ自体の問題は、書き込み自体がアトミック操作であると想定することです。そのため、間違った時間に停電が発生した場合でも、データやFSの破損が発生する可能性があります。おそらく、電源を固定したり、UPSに接続したりする以外の最良のオプションについては、+ 1です。
HopelessN00b


はい、一度書き込まれたファイルの名前の変更はアトミック操作です。そもそもファイルを書くことはそうではありません。
HopelessN00b

3
@ HopelessN00b新しいファイルが半分書き込まれていても壊れていても構いません。良好な状態の古いファイルがあります。システムを回復すると、半分書き込まれたファイルが破壊されます。
DJClayworth

2
@ HopelessN00bまさに!一時ディレクトリ内の一時ファイルのみが、半分しか書けないということができます。最終宛先ディレクトリ内のすべてのファイルは、常に破損して
おらず

7

バッテリバックアップ式の書き込みキャッシュを備えたUPSまたはRAIDカードをシステムにインストールすると、わずか49.95ドルで、ソフトウェアだけでは不可能なことを実現できます。

このサーバーをUPSまたはバッテリーに接続することはどういうわけか不可能だというあなたの主張は、単に信じられません。


9
官僚的な愚かさは常に信じられます。
ダンは、

3
@DanNeely My PHB won't let me hook this up to a UPS/batteryは、あまり面白く it is not possible to add a UPS, a battery, or a similar solution to the system. ないということとは非常に異なりますが、アプローチと利用可能なソリューションが変わるため、重要な違いです。
HopelessN00b

または、別の場所で述べたように、UPSのインストールを要求した場合、ハイジャックされたコンピューターのユーザーは驚くでしょう。それ以外の場合、状況は少し信じられません。適切なビジネスケースが与えられた場合、誰でも、理由の範囲内で、破損したデータに対するUPSを受け入れます。
WernerCD

@WernerCD CIOに会いたいです。誰かのコンピューターをハイジャックすることはこのユースケースの可能性があることに同意しますが、正当なものも考えることができるので、疑いの余地を与えます。組み込みシステムやコントローラー、またはRaspberry Piのようなものを考えてください。使用している「コンピューター」がUPSに接続するのにかかる50ドル未満の価値があることは間違いありません。
HopelessN00b

コンピューターの価値が50ドル未満のUPSであっても、実際に何かの価値があるのはコンピューター上のデータです。Googleは「価値のない」コンピューター上に構築されました。CPUのコストよりも重要なのは、データの損失、人的資源の損失(このプログラミングの冒険、データ破損の追跡、古いシステムのバグ追跡とこの新しい部分)、顧客の価値の損失(データの損失?)です。次の会社をお願いします。)など
-WernerCD

5

すべてのデータを保存するブロックデバイスを除き、システム全体を読み取り専用でマウントします。そのブロックデバイスを直接使用し、その未加工のブロックデバイスを使用して独自のデータストレージメカニズムを実装します。


3
...バッテリーでバックアップされたディスクコントローラーカードに投資し、ディスクに書き込みキャッシュがないことを確認します。
voretaq7

ここに来て、フラットCDソリューションで使用されるソリッドステートストレージを備えたLive-CDまたは同等のROMシステムから起動する必要があると言いました。
マークアレン

書き込みキャッシュは無効にできます。このアプローチは実行可能です。ストレージメカニズムのみを追加することをお勧めします。ブロックはアトミックに書き込まれます(私は仮定します)ので、新しい/ todoデータを持つセクションの開始と終了を指す2つの「ポインター」ブロックを持つことができます。ポインターは、データの書き込み/終了後に更新されます。NCQも無効にする必要があります。
sleeplessnerd
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.