0

特定のUSBキーが接続されたときに実行されるWindowsサービスを作成しています。それは簡単です。FTPサーバーに接続し、いくつかのファイルをダウンロードして、USB上の(暗号化された)アーカイブに保存します。アーカイブは、クライアントに提供されているツールを使用して読み取り専用で開くことができます(ただし、これは私の問題とは関係ありません)。

このサービスは、USBをマスターサーバーと同期させるために使用されます(Dropboxとほとんど同じですが、ダウンロードと同期されたフォルダーのみがリムーバブルメディア上にあります)。アーカイブは数ギガバイトまで大きくなる可能性があります。約400人のユーザーのキーで毎週約1GBのファイルが更新されます。

更新プロセス全体がユーザーに対して透過的であるため、データがアーカイブに書き込まれているときにUSBが抜かれる可能性は無視できません(私がなんらかの悲鳴を上げて派手な​​警告を出したとしても:抜かないでください)。アーカイブを破損すると、アーカイブ全体を再度ダウンロードする必要があります。つまり、すでにロードされているサーバーでかなりの帯域幅が浪費されています。

したがって、基本的には、アーカイブへの書き込みを処理する必要があります。コンテナを不整合な状態にしない限り、失敗しても問題ありません。ファイルが完全に書き込まれているか、そうでないかのどちらかです。コンテナが実際にファイルを「認識」していなくても、ファイルが部分的に書き込まれていても問題ありません。

質問はここにあります: データの一貫性を常に保証するにはどうすればよいですか?具体的には、IO操作をトランザクションとして機能させるにはどうすればよいですか?あなたは何を提案しますか?自分で何かを実装しませんか?または、この機能を提供するコンテナはすでにありますか?

これは私がこれまでに得たものです:

  • 新しいアーカイブを作成し、コミット時に名前を変更します。不可能です。アーカイブが大きすぎます。
  • Zip / Tar / 7z:不適切、書き込みに失敗するとアーカイブが破損します
  • Truecrypt:ファイルシステムドライバーが必要なため、不適切です(ユーザーがドットで持っていない管理者権限)。
  • ファイルシステムをファイルにマッピングする必要があるもの:不適切です。管理者でないとそれができないことは確かですが、可能であれば、それは素晴らしいことです。
  • SQLite DBへのファイルの保存:それはACIDなので、実際に解決策になる可能性があります。ただし、SQLiteのBLOB容量には制限があるため、ファイルを分割する必要があります。あまりエレガントではありませんが、私はそのように行く準備ができています。また、SQLiteのトランザクションジャーナルは、大きなBLOBを格納するときにかなり大きくなる可能性があります。
  • 自分で実装する:できるだけ避けたいのですが、恐れることはありません。トピックがかなり複雑だと思います。

この質問が一般的すぎる場合は、SUなどに移動してください。

4

3 に答える 3

1

暗号化された違いをダウンロードするには、svnやgitなどを使用してみてください。これらは通常、ファイルが破損した場合にローカルでファイルを再構築するために使用できます。または、差分をダウンロードし、パッチを使用して最新のファイルバージョンを生成します。

データの書き込み中にユーザーがフラッシュドライブのプラグを抜くと、他の問題が発生します。多くは信頼性が低く(ファイルシステムレベルではなくフラッシュブロックレベルで)、NTFSやEXT3などのジャーナリングファイルシステムが回復できないほど破損している可能性があります。詳細はこちら:https ://superuser.com/questions/290060/can-flash-memory-be-physically-damaged-if-power-is-interrupted-while-writing

于 2012-05-24T03:17:38.160 に答える
0

とても簡単です。一時的に書き込み、書き込みが終了した場合はマスターとして設定し、それ以外の場合は削除して再試行します。

于 2012-05-21T15:47:07.180 に答える
0

たぶん私たちのSolFS(Application Edition)は動作するでしょう。SolFSは、コンテナファイル内に仮想ファイルシステムを提供し、データ書き込みのジャーナルモードをサポートします。これにより、ファイルシステムの統合を維持できます。

于 2012-05-21T16:11:08.347 に答える