GridFSは、本番環境で十分な速度と信頼性を備えていますか?


86

新しいWebサイトを開発し、通常のファイルシステムストレージと比較して多くの利点があるため、すべてのユーザーアップロードのストレージとしてGridFSを使用したいと思います。

nginxが提供するGridFSのベンチマークは、nginxが提供する通常のファイルシステムほど高速ではないことを示しています。

nginxのベンチマーク

すでに実稼働環境でGridFSを使用している人、または新しいプロジェクトに使用する人はいますか?


1
私と同じような意図を持っていた将来の検索者のために、mongodbに画像を保存することに関するブログ投稿:menge.io/2015/03/24/storing-small-images-in-mongodb(GridFSを単にバイナリとしてドキュメントにスローすることと比較しますデータ)

MongoDBにバイナリデータを保存するかどうかを決定する際に考慮すべき多くのトレードオフがあります-参照:alexmarquardt.com/2017/03/02/…–
Alexander Marquardt

回答:


118

私は、価格比較Webサイトの一部であるサーバーの1つでgridfsを使用しており、トラフィックの統計情報は良好です(1日あたり約25,000人の訪問者)。サーバーにはRAM、2ギガがあまりなく、CPUもそれほど高速ではありませんが(Core 2 duo 1.8Ghz)、サーバーには十分なストレージスペースがあります:RAID 0構成で10Tb(sata)。サーバーが実行しているジョブは非常に単純です。

価格比較の各製品には画像があり(製品データベースによると約1,000万の製品があります)、サーバーの仕事は画像をダウンロードしてサイズを変更し、gridfsに保存して、訪問者のブラウザーに配信することです。 ..グリッドに存在しない場合...または...すでにグリッドに保存されている場合は、訪問者のブラウザに配信します。したがって、これは「従来のcdnスキーマ」と呼ぶことができます。

このサーバーが稼働して以来、400万枚の画像を保存して処理しました。サイズ変更と保存は単純なphpスクリプトで行われます...しかし確かに、pythonスクリプトやjavaのようなものの方が速いかもしれません。

現在のデータサイズ:11.23g

現在のストレージサイズ:12.5g

インデックス:5

インデックスサイズ:849.65m

信頼性について:これは非常に信頼性があります。サーバーが読み込まれず、インデックスサイズに問題がなく、クエリが高速です

速度について:確かに、ローカルファイルストレージほど高速ではなく、おそらく10%遅くなりますが、画像を処理する必要がある場合でもリアルタイムで使用できるほど高速です。この場合、これはphpに大きく依存します。メンテナンスと開発の時間も短縮されました。単一または複数のイメージを削除することが非常に簡単になりました。単純な削除コマンドでデータベースにクエリを実行するだけです。もう1つの興味深い点は、ローカルファイルストレージ(数千のフォルダーに数百万のファイル)がある古いサーバーを再起動すると、システムがファイルの整合性チェックを実行していたために数時間ハングすることがあります(これには実際に数時間かかりました...)。gridfsではこの問題はもう発生していません。画像は大きなmongodbチャンク(2GBファイル)に保存されるようになりました。

だから...私の考えでは...はい、gridfsは本番環境で使用するのに十分な速度と信頼性を備えています。


9
実稼働WebサイトにプライマリストレージとしてRAID0を使用する人がいることにショックを受けました。優れたバックアップを使用しても、ストレージ障害の可能性を高めることは、パフォーマンスの向上に見合うかなりの高額な代償です。
mikerobi

67
特定のケースでは、画像データが揮発性である可能性があるため、RAID0を使用します。マーチャントのウェブサイトから再度ダウンロードするため、画像が失われても問題ありません。実用的には、私たちのサーバーは単純な画像キャッシュサーバーであると考えることができます。
Manu Eidenberger

しかし、障害の可能性を積極的に増やしています(初期ドライブ障害係数にスピンドル数を掛けたもの)。RAID 10は、読み取りよりも多くの書き込みが必要な場合に理想的であり、書き込みよりも多くの読み取りが必要な場合は、RAID5 / 6が理想的です。
NeuroScr 2014

9
@ManuEidenberger MongoDBドキュメントに保存したい画像を保存するためにGridFSを使用しているのはなぜですか?16MBのドキュメントサイズ制限に達していないようです。また、MongoDBドキュメントの上にGridFSレイヤーが必要ないため、MongoDBドキュメント内に画像をBLOBとして保存する方が効率的です。
Arnaud Bouchez 2015年

1
@ArnaudBouchezの質問にも興味があります。単にバイナリデータとしてドキュメントに保存するよりも、GridFSを選択したメリットはありましたか?ありがとう!

12

前述のように、それは普通のファイルシステムほど高速ではないかもしれませんが、それは上であなたに男の利点を与える通常のファイルシステム、私はのためのビット速度をあきらめる価値があると思います。

最終的には、シャーディングを使用すると、通常のファイルシステムや単一ノードとは対照的に、GridFSストレージが実際に高速なオプションになるポイントに到達する可能性があります。


6

ただし、大規模なDBの修復については注意が必要です。開発中の新しいシステムであり、mongoは完全に終了しませんでした。また、7TBGridFSの修復には130時間かかるようです。

このため、OpenStackSwiftまたはCephへの切り替えを検討すると思います。それでも、それまでは良かったです。そして、nginx-gridfsモジュールは素晴らしいです。


では、どうやって行きましたか?
粘液2016

5

mdirolfのnginx-gridfsモジュールは素晴らしく、セットアップがかなり簡単です。私たちはpaint.lyの制作ですべての絵を提供するためにそれを使用しており、これまでのところ問題はありません。


3
paint.lyは利用できなくなったようです。:(
マリアン

2

何をしているのかわからない限り、gridfsの使用はお勧めしません。GridFSは、ファイルをチャンクに分割し、ファイルを2つのコレクションに格納する単なる抽象化レイヤーです。より多くのファイル-より多くのオーバーヘッド。ファイルのサイズがほぼ同じで、32M程度を超えないことが予想される場合は、正しい方法です。大きなファイルをgridfsに保存しようとしないでください。どうして?

  1. 異なる言語のドライバーは、ファイルのごく一部を読み取るときに、ファイル全体(チャンクなど)を読み取る場合があります。
  2. ファイルを変更すると、すべてのチャンクに影響し、データベースの負荷が増加する可能性があります。ファイルシステムが成長している場合は、gridfsをシャーディングすることを決定する必要があります。注意してください!シャーディングが初期化されているときは、一貫性は保証されません。

ロードされたプロジェクトの読み取りについて考える場合は、ファイルをドキュメントに直接ロードするか(16M以下のサイズの場合)、別のclusterfsを選択して、filename / inodeをロジックにリンクすることを検討してください。

お役に立てれば。


4
私はGridFSにかなり慣れていませんが、GridFSは、ファイル数を2倍にする単なる抽象化レイヤーではないことを理解しています。GridFSは、MongoDBのレプリケーションおよびシャーディング機能を利用する簡単な方法を提供します。他の人も、ファイルは2GBのチャンクに保存されていると言っていると思います。これにより、特に誰かが非常に大量の小さな画像を持っている場合、ファイルの総数が減ると思います。

+1あなたは正しいです。小さいファイルでも、GridFSで保存してもメリットはありません。ファイルをMongoDBドキュメントに保存できる場合(つまり、16 MBのサイズ制限未満)、ファイルをMongoDBドキュメント内のBLOBとして保存することをお勧めします。MongoDBストレージ上でGridFSを使用するオーバーヘッドをバイパスします。compose.io/articles/gridfs-and-mongodb-pros-and-cons
Arnaud Bouchez 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.