web-dev-qa-db-ja.com

何百万もの画像の保存とタグ付け

何百万もの画像を保存し、後でタグ付けする必要があるアプリケーションを構築しています。画像に起因するタグは、タグ付けシステムが進化するにつれて、時間とともに変化する可能性があります。画像はタグで検索されます。

ファイルの保存に関しては、RDBMSに保存するオプションを削除しました。私はこれを以前に試し、スケーリングとパフォーマンスの問題に遭遇しました。同様に、それらをファイルシステムに保存するオプションも排除しました。これも、パフォーマンス、スケーラビリティ、およびバックアップの問題をもたらしたからです。現在、NOSQLキー値データストアまたはAmazon S3などの使用を検討しています。 Key-Valueストアはこのタイプのデータに適切な選択ですか?

各画像のタグデータの保存に関しては、タグタイプは事前に不明であるため、NOSQLのスキーマレスな性質を活用し、ドキュメントデータストアまたはおそらく列プロファイルのいずれかを使用することを検討しています。使用するストアのタイプを決定する上で重要な要素は何でしょうか?他に検討すべきオプションはありますか?

最後に、画像データとメタデータを別々のストアに分割することは理にかなっていますか、それとも両方を実行できるテクノロジーはありますか?おそらく、メタデータの追加とメタデータに対するクエリを可能にするキー値ストアのようなものでしょうか?

更新:以前の回答を見ましたが、それらは数年前のものであり、現代のテクノロジーを活用していないようです。 RDBMS +ファイルシステムがこれを行うための最良の方法であるか、それとも彼らの新しく改善されたソリューションであるか、誰かがコメントしてくれませんか?.

3
ssc327

問題は規模の1つであり、ホストされる場所、コスト、および管理です。 AWSでホストするつもりなら、クラウドをよりスケーラブルにする分散性を利用できます。

最初の決定:セルフホストvsクラウド

古い回答(2014年頃)は、セルフホスティングが依然として優勢であったときの考え方を反映しています。ただし、RDBMSの外部でタグ関連のクエリを調べる必要がある理由があります。

ファイルシステムのホスティングでは、NASまたはSAN=自分で管理し、必要に応じてパフォーマンスと容量を改善するための十分なプロビジョニングと専門知識を持っていることを確認する必要があります。コストが複数のアプリケーション間で償却されない場合は高価です。

クラウドでは、AWS S3またはクラウドプロバイダーの同等のブロブストレージを使用できます。このソリューションは、使用するストレージの料金のみを請求します。クラウドBLOBストレージは、アプリケーションの成長に合わせてスケーリングするために必要なスケールとパフォーマンスの両方を提供します。

2番目の決定:RDBMSまたは検索

ドキュメントストアではなくリレーショナルデータベースにタグを保存する方法では、これらのタグに関連するレコードを取得するクエリが難しくなります。これは、タグ間の共通部分(つまり、2つ以上の同一のタグを持つドキュメント)を探している場合にはなおさらです。クエリは、複雑になるほど遅くなります。

ElasticSearch、SOLR、およびドキュメントストアを兼ねることができる同様の検索サーバーは、理想的な中間基盤を提供します。多くのクラウドプロバイダーは、この種の問題に対するホスティングソリューションを提供しています。それらは非常に大きなサイズにスケーリングし、非常に迅速に検索を実行するように設計されています。実際、このサイト(softwareengineering.stackexchange.com)はElasticSearchを使用してこのようなクエリを実行しています。注:ElasticSearchは、検索サーバーであるだけでなく、NoSQL DBでもあります。

文書検索をしているときは、関係用語で考えることができないので、学習曲線があります。

追加されたボーナスは、少なくともAWSでは、ElasticSearchは同じサイズのティアのRDBMSよりもコストが低いことです。

ボトムライン

何百万ものレコードは、今日のRDBMSにとって天文学的なものではありません。ただし、飽和点に達します。多くのWebサイトは、レコードのデータストレージにRDBMSを使用し、それを検索サーバーと同期して負荷をかけます。その決定は本当にこの質問の範囲外のものに依存します。

ElasticSearch/S3ルートはそれ以上に拡張されます。しかし、あなたの研究をしてください。あなたが比較検討しなければならないトレードオフがあります。私の場合、この選択は正しいものでした。

5
Berin Loritsch

ファイルを保存することは、最も簡単なオプションです。ただし、スケーラビリティが必要な場合は、GFSやHDFSなどの分散ファイルシステムに配置する必要があります。それらを保存しているときは、それらを事前スキャンして、

  1. 有効な画像ファイル
  2. sha256sumまたは512を取得すると、それぞれがやり過ぎであり、それをファイル名として使用できます。
  3. (オプション)画像ファイルの後に追加される非画像データを削除します。
  4. (オプション)ロスレスイメージを新しい形式に再エンコードします。

ファイルを保存するときは、すべてを1つのディレクトリに保存せず、代わりに2文字の16進パスでグループ化して、ディレクトリのスキャン速度を向上させます。

ファイルのsha256sumを実行することにより、正確なファイルの重複をすばやく排除できます。 #3、#4を実行すると、重複をさらに排除できます。

2