web-dev-qa-db-ja.com

Webアプリケーションのファイルストレージ:ファイルシステムvs DB vs NoSQLエンジン

ユーザーが生成した多数のファイルを保存するWebアプリケーションがあります。現在、これらはすべてサーバーファイルシステムに保存されていますが、いくつかの欠点があります。

  • (アプリケーションで定義されているように)「フォルダー」を移動するときは、ディスク上のファイルも移動する必要があります(ただし、これは、ファイルシステムに保存する必要があるというよりも、元の開発者の奇妙な設計上の決定によるものです)。
  • ファイルシステムアクションのテストを作成するのは困難です。移動、削除などのアクションを実行せずにログに記録するモックファイルシステムクラスがあります。これは多かれ少なかれ仕事をしますが、テストに100%の信頼性はありません。
  • 他のサービスからファイルにアクセスして追加のタスク(Solrでのインデックス作成、サムネイルの生成、ムービー形式の変換など)を実行する必要がある他のジョブをいくつか追加するので、リモートでファイルにアクセスする必要があります。ネットワーク共有を介してこれを行うのは危険なようです...
  • 過去に時々私たちに問題を与えたファイルシステムのパーミッションを扱うことは、純粋なLinux環境に移動したので、これはそれほど問題ではないはずです。

だから、私の主な質問は

  • MySQLにファイルをBLOBとして保存することの欠点は何ですか?
  • CassandraのようなNoSQLシステムにも同じ問題がありますか?
  • 誰かが適切であるかもしれない他の提案がありますか? MogileFSなど?
32
El Yobo

直接的な回答ではありませんが、非常に興味深く、何らかの形で類似した質問へのポインタがあります(そうです、それらはブロブと画像に関するものですが、これはIMOに匹敵します)。

MySQLにファイルをBLOBとして保存することの欠点は何ですか?

CassandraのようなNoSQLシステムにも同じ問題がありますか?

PS:私は殺し屋になりたくはありませんが、NoSQLソリューションで問題を解決できるとは思いません(NoSQLはほとんどのビジネスには関係ありません)。

7
Pascal Thivent

多分ハイブリッドソリューション。

データベースを使用して各ファイルに関するメタデータを保存し、ファイルシステムを使用して実際にファイルを保存します。

「フォルダ」の再構築は、DBでモデル化し、実際のOSの場所から逆参照することができます。

3
Randy

Cassandraにファイルを1MB程度の列に分割することで、2GBまでのファイルを簡単に保存できます。これはかなり一般的です。

1つの大きな列として保存することもできますが、アクセスするときにすべてをメモリに読み込む必要があります。

2
jbellis

OSまたはアプリケーションがファイルにアクセスする必要がない場合は、ファイルをファイルシステムに保存する必要はありません。データベースのバックアップと同時にファイルをバックアップする場合は、ファイルをデータベースの外部に保存してもあまりメリットがありません。したがって、ファイルをデータベースに保存することは有効な解決策である可能性があります。

もう1つの欠点は、dbでファイルを処理すると、ファイルシステムレベルでファイルを処理するよりもオーバーヘッドが大きくなることです。ただし、長所が短所を上回り、あなたの場合はそうかもしれないと思われる限り、試してみることができます。

私の主な関心事は、ディスクストレージの管理です。データベースファイルが大きくなると、データベース全体の管理がより複雑になります。フライパンから出て火の中に入れたくありません。

0
Marcus Adams