ユーザーがアップロードしたコンテンツを複数の EC2 アプリケーション サーバー間で共有できるようにする必要があります。このデータをほぼリアルタイムで共有できる可能性のあるオプションとして、rsync、マウントされた NFS、および S3 を検討しました。アップロードおよびダウンロードされたユーザー ファイルは、ほとんどの場合 1 ~ 10 MB です。頻繁にアクセスされるファイルもあれば、一度だけアクセスされて削除されるファイルもあります。
私の最新のアプローチは、アプリケーション サーバーとは別に、EC2 インスタンスを厳密にファイル サーバーとして起動することです。このオプションでは、ユーザーがファイルをダウンロードする場合、ダウンロードするファイルに関するデータをデータベースに照会するアプリケーション サーバーの 1 つに接続されます。次に、ユーザーにダウンロードのプロンプトが表示され、ダウンロードのためにファイル サーバーに接続されます。
このオプションは他のオプションよりも高速になると思います。唯一の欠点は、ファイル サーバーを自動スケール アップ/ダウンできないことです。ただし、スケール アップして、ファイルがどのファイル サーバーにあるかを示す列をデータベースに作成することはできます。
これは良いアプローチでしょうか、それとも何か見落としているのでしょうか? また、サーバーの仕様と 1 ~ 10 MB のファイルに基づいて、ファイル サーバー上で同時にアップロード/ダウンロードできる数を判断する良い方法は何でしょうか。それとも、負荷テストから判断するのが最適なのでしょうか。
また、スケーリングの観点では、1 つのファイル サーバーにある特定のファイルが非常に人気になった場合、問題になりますか? CDN を使用すると、この問題は解決されますか?
答え1
CDN の方が適したオプションですが、CloudFront と S3 を使用するのもよいでしょう。私の推奨は、ユーザーが生成したコンテンツをアプリケーション サーバーから分散化することです。アーキテクチャ内でスケールアップまたはスケールダウンするときにサーバーを不安定な状態に保つことは、優れた設計方法です。
答え2
S3 と CloudFront が最初のオプションになりますが、レイテンシーが許容できない場合は、他のオプションもあります。
単一のファイルサーバーで十分機能している場合は、次のようなスケーラブルな分散ファイルサーバープラットフォームに移行できます。グラスターFSこれにより、複数の EC2 インスタンスにまたがってファイルを保存し、それらを単一のマウントとして表示できます。冗長性のために各ファイルのコピーを 2 つ作成するには、「レプリカ 2」オプションを使用できます。次に、可用性を高めるために、異なるアベイラビリティ ゾーンで 2 つのインスタンスを使用します。ファイル自体は、プロビジョニングされた IOPS を備えた EBS や SSD エフェメラル (以前にもこれを実行しました。Gluster の冗長性により、エフェメラルの揮発性はそれほど問題にならないため、重要なデータに対して SSD 高速 IO のメリットを得ることができます) を含む、EC2 がサポートするディスクに保存されます。
答え3
EC2 を設計する際には、固有のデータを持たないようにし、単純にコンピューティング マシンとして考えます。
いくつかの選択肢があります。
S3
ファイルの保存と取得のためのスケーラブルで信頼性の高いサービス。ファイル システムとしてはうまく機能しないため、大量の読み取りと書き込みを行う場合は最適なソリューションではありません。
クラウドフロント(CDN)
静的ファイル (css、js、画像) は CloudFront から提供できます (S3 または EC2 からデータを取得できます)。これによりパフォーマンスが大幅に向上するため、S3 を使用してファイルを取得し、CloudFront から提供することができます。
グラスターFS
EC2 のクラスターをネットワーク接続ストレージとして使用できます。もちろん、これによりセットアップが少し複雑になり、最速のソリューションにはなりません。
エラスティックアチェ / ミーメキャッシュ
独自の memecached をホストすることも、Elasticache サービスを使用することもできます。このソリューションはファイル ストレージではありませんが、高性能な分散メモリ オブジェクト キャッシュ システムとして役立ちます。