56

私は現在、ある種の画像ストレージも提供する必要がある Web ベースのアプリケーションのアーキテクチャを設計しています。ユーザーは、サービスの重要な機能の 1 つとして写真をアップロードできます。また、これらの画像を表示することも (Web 経由で) 主な用途の 1 つになります。

ただし、このようなスケーラブルなイメージ ストレージ コンポーネントをアプリケーションで実現する方法がわかりません。私はすでに別の解決策を考えましたが、経験が不足しているため、あなたの提案を聞くのを楽しみにしています. 画像とは別に、メタデータも保存する必要があります。ここに私の最初の考えがあります:

  1. HDFS のような (分散) ファイルシステムを使用し、アップロードされた画像とサービス要求を保存するために、専用の Web サーバーを「ファイルシステム クライアント」として準備します。画像のメタデータは、各画像のファイルパス情報を含む追加のデータベースに保存されます。

  2. HDFS の上に HBase のような BigTable 指向のシステムを使用し、画像とメタ データを一緒に保存します。繰り返しますが、ウェブサーバーは画像のアップロードとリクエストを橋渡しします。

  3. 画像とメタデータの両方を格納するために、CouchDB のような完全にスキーマレスなデータベースを使用します。さらに、HTTP ベースの RESTful API を使用して、データベース自体をアップロードおよび配信に使用します。(追加の質問: CouchDB は Base64 経由で blob を保存しますが、画像/jpeg などの形式でデータを返すことはできますか?)

4

11 に答える 11

46

そのためにCouchDBを使用しており、画像を「添付ファイル」として保存しています。しかし、1年後、数十GBのCouchDBデータベースファイルが頭痛の種であることが判明しました。たとえば、非常に大きなドキュメントサイズで使用する場合、CouchDBレプリケーションにはまだ問題があります。

そのため、画像情報にCouchDBを使用し、実際の画像ストレージにAmazon S3を使用するように、ソフトウェアを書き直しました。コードはhttp://github.com/hudora/huImagesで入手できます。

プロジェクトのオンサイトでAmazonS3互換のストレージサービスをセットアップすることをお勧めします。これにより、柔軟性が維持され、今のところ外部サービスを必要とせずにAmazonオプションを使用できます。Walrussは、最も人気がありスケーラブルなS3クローンになるようです。

また、優れたオープンソースのMogileFSPerlbal製品を備えたLivejournalのデザインを検討することをお勧めします。この組み合わせは、おそらく最も有名な画像提供の設定です。

また、Flickrアーキテクチャは、Livejournalのようにオープンソースソフトウェアを一般に提供していませんが、インスピレーションを与えることができます。

于 2009-12-26T22:39:29.793 に答える
14

「追加の質問: CouchDB は Base64 経由で blob を保存します。」

CouchDB はblob を Base64 として保存せず、ストレート バイナリとして保存します。JSON ドキュメントを取得するとき、JSON?attachments=trueに安全に追加するためにディスク上のバイナリを Base64 に変換しますが、それは単なるプレゼンテーション レベルのことです。

スタンドアロン アタッチメントを参照してください。

CouchDB は、保存されている content-type で添付ファイルを提供します。実際には、HTML、CSS、GIF/PNG/JPEG 添付ファイルを直接ブラウザにサーバーすることが可能です。

添付ファイルはストリーミングでき、CouchDB 1.1 では、Range ヘッダー (メディア ストリーミングおよび/または中断されたダウンロードの再開用) もサポートします。

于 2011-06-07T09:10:13.463 に答える
9

Facebook の干し草の山に関する論文の実装であるSeaweed-FS (以前は Weed-FS と呼ばれていました) を使用します。

Seaweed-FS は非常に柔軟で、基本にまで絞り込まれています。何十億もの画像を保存し、それらを高速に提供するために作成されました。

于 2012-06-17T08:05:06.423 に答える
3

MogileFS を使用しています。私たちは、8 TB 未満でファイル数が 5,000 万ほどの小規模なユーザーです。ファイル名とパフォーマンスをより適切に制御するために、数年前に Amazon S3 に保存することから切り替えました。

これは最も美しいソフトウェアではありませんが、非常に「フィールド テスト」されており、基本的にすべてのユーザーがあなたと同じように使用しています。

于 2010-09-29T06:29:53.267 に答える
3

アマゾン ウェブ サービスを検討したことがありますか? S3 は Web ベースのファイル ストレージであり、SimpleDB はキー -> 属性ストアです。どちらもパフォーマンスが高く、拡張性に優れています。独自のサーバーとセットアップを維持するよりも費用がかかりますが (人を雇わずに自分で行うと仮定すると)、起動して実行するまでの時間が大幅に短縮されます。

編集:私はそれを取り戻します-大量生産では長期的にはより高価ですが、少量生産ではハードウェアを購入する初期コストよりも優れています.

S3: http://aws.amazon.com/s3/ (ここに画像ファイルを保存できます。パフォーマンスのために、サーバーに画像キャッシュがある場合とない場合があります)

SimpleDB: http://aws.amazon.com/simpledb/ (メタデータはここに入れることができます: 保存したいデータへのイメージ ID マッピング)

編集 2: 私もこれについて知りませんでしたが、Amazon CloudFront ( http://aws.amazon.com/cloudfront/ ) という新しい Web サービスがあります。これは Web コンテンツの高速配信用であり、S3 とうまく統合されます。画像に関しては、Akamai のようなものです。画像キャッシュの代わりにこれを使用できます。

于 2009-12-25T13:58:02.497 に答える
2

Facebook hayStack の説明をご覧ください。

干し草の山の中の針: 数十億枚の写真を効率的に保存

于 2010-01-14T15:22:15.717 に答える
2

Cloudant の一部として、私は製品をプッシュしたくありません....しかし、BigCouch は私の科学アプリケーション スタックでこの問題を解決します (物理学 - Cloudant とは何の関係もありませんし、もちろん利益とも何の関係もありません!)。CocuhDB 設計のシンプルさと、単一サーバーの CouchDB に欠けている自動シャーディングおよびスケーラビリティを組み合わせます。私は通常、少数の大きなファイル (マルチ GB) と多数の小さなファイル (100MB 以下) を保存するために使用します。私は S3 を使用していましたが、実際には、繰り返しアクセスされる小さなファイルの取得コストが増え始めています。

于 2011-03-07T18:49:03.247 に答える
1

CouchDB ビュー サーバーで使用できる _update 機能のいくつかを Python ビュー サーバーで実験してきました。

私が行った非常に優れた機能の 1 つは、画像アップロードの更新機能でした。これにより、PIL を使用してサムネイルやその他の関連画像を作成し、それらが CouchDB にプッシュされたときにドキュメントに添付できるようになりました。

これは、画像操作が必要で、維持する必要があるコードとインフラストラクチャの量を削減したい場合に役立ちます。

于 2009-12-27T20:07:37.303 に答える
1

cassandra の上に image store を書きました。多くの書き込みがあり、ランダム読み取りの読み取り/書き込みは低くなっています。読み取り/書き込み比率が高い場合は、mongodb (GridFs) をお勧めします。

于 2010-09-29T06:18:51.363 に答える
1

わかりました、AWS のすべてが機能しない場合は、いくつかの考えがあります。

(3)まではバイナリデータをデータベースに入れれば同じデータが出てきます。それを jpeg にするのは、データベースが考えるものではなく、データの形式です。クライアント (Web ブラウザー) が jpeg であると判断するのは、Content-typeヘッダーを に設定した場合ですimage/jpeg。また、テキストのような別のもの (推奨されません) に設定することもできます。これは、ブラウザーがそれを解釈しようとする方法です。

オンディスク ストレージについては、シンプルな CouchDB が気に入っていますが、HDFS も確かに機能します。CouchDB からの画像コンテンツの提供に関する投稿へのリンクは次のとおりです: http://japhr.blogspot.com/2009/04/render-couchdb-images-via-sinatra.html

編集: これは、memcached でイメージをキャッシュすることと、linux/apache でディスクからイメージを提供することに関する有用なディスカッションへのリンクです。

于 2009-12-25T14:20:00.627 に答える