web-dev-qa-db-ja.com

スケーラブルなPHP / MySQLWebアプリケーションにNFSを使用する

状況は次のとおりです:

ユーザーのアップロード(pdfファイル)を受け入れるPHP/MySQLWebアプリケーションがあります。これらのPDFファイルのページから、プレビュー画像がその場で作成され、Webアプリのユーザーに表示されます。一部のPDFは大きい側にある可能性があり、ほとんどは50 MB未満になりますが、極端な場合には数百MBにもなる可能性があります。大きなPDFファイルのプレビュー画像を少し待つことは許容されますが、1分以内としましょう。今のところ、すべてが1つのサーバーで実行されていますが、まもなくアプリはストレージと処理能力の両方でサーバーの制限に達します。

問題を解決するための私の考え:

この状況に対処するために、必要に応じて1つ以上のPDF処理サーバーと、1つ以上のファイルストレージサーバーを用意することを考えました。これらの2種類のサーバーは、NFSを使用して実際のアプリが実行されるサーバーにマウントされます。その後、アプリはGearManを使用して、PDF処理タスクをこれらの処理サーバーに委任できます。処理サーバーは、ストレージサーバーをマウントし、そこに保存されているファイルを読み取り、処理して、その出力をそのサーバーに書き込むことができます。私が話しているサーバーはAmazonec2インスタンスになります。

Webアプリは、使用されたストレージサーバー上の結果のPDFプレビュー画像へのリンクを返します。これは、フロントエンドで使用してユーザーに画像を表示できます。

私の質問:

複数のサーバーを使用するアプリの経験はありませんが、このアイデアは実行可能ですか、それともより良い方法がありますか? NFSセットアップは、この状況に対して十分に高速で信頼性がありますか?

3
Asciiom

あなたは間違いなく正しい考えを持っていますが、私の経験では、仮想マシン上の共有ストレージがパフォーマンスを発揮することはめったにないので、この場合、実際にNFSルートをたどるとは思えません。

最大の欠点は、EBS上のNFSを取り巻く単一障害点であり、これを軽減するのは非常に難しい場合があります。非仮想データセンターでは、クラスター化されたNASアプライアンスを使用してフェイルオーバーNFSを処理します。EC2では、それをどのように行うかわかりません。

すでにワーカージョブにAmazonEC2を使用している場合は、アセットをS3バケットに保存してみませんか。パフォーマンスは良好で、バケットはHTTPaceessメソッドを使用して世界中のどこからでも利用できます。

あなたがする必要があるのは、S3にアップロードし、ワーカーにファイルを取得して処理させ、結果のアセットをS3にドロップすることだけです。

S3バケットをローカルにマウントすることもできます。 https://stackoverflow.com/questions/10801158/how-stable-is-s3fs-to-mount-Amazon-s3-as-a-local-directory

実際、Amazonスタックにさらに進んで、ギアマンの代わりに(またはギアマンと同様に)シンプルなメッセージングサービスを使用することもできます。

2
Tom O'Connor