複数のWebサーバー間でアセットを共有する方法は?


16

ロードバランサーに複数のLinux Webサーバーが接続されており、これらのサーバー間でアセット(写真、ビデオ、その他のもの)を共有したいです。これを行う最良の方法は何ですか?

現在、私はすべてのWebサーバーのファイルサーバーにマウントしていますが、トラフィックが多くなるとダウンするのではないかと心配しています。これを防ぐにはどうすればよいですか?

前もって感謝します。


これは、Cassandra(NoSQLデータベース)のようなものが便利な場所です。
アレクシスウィルケ

渋滞時のパフォーマンスを改善するためにニスを使用することを検討しますか? en.wikipedia.org/wiki/Varnish_%28software%29
するThorbjörnRavnアンデルセン

回答:


12

ニーズに基づいてこれを行う方法は複数あります。

  • Webサーバーでfx NFSでマウントされた中央のファイルサーバーを使用する
  • 上記と同じですが、冗長であるため、一方がダウンした場合、他方が引き継ぎます
  • ある種の同期ツール(rsyncなど)を使用して、ファイルをWebサーバーでローカルにホストします。次に、cronjobをセットアップして、特定の間隔でサーバー間でファイルを同期します。
  • Amazon S3、AkamaiなどのCDNを使用します。

最初の2つは、多数の新しいファイルが来る場合に最適です。3番目の方法は、ユーザーがまだ同期されていない静的コンテンツで404を取得するため、頻繁にファイルを追加または変更しない場合の理想的なソリューションです。

最後のオプションは、多くの点で理想的かもしれませんが、4の中で最も高価であることが判明する可能性があります。これをサポートするには、Webサイトを書き直す必要もあります。


rsyncの大きな問題は、新しいデータをアップロードするときに404を取得する可能性が高く、rsyncがすぐに行われないことです...また、Cassandra(ポイント4)のようなシステムは無料ですが、もちろん10サーバーはありません無料...(それはそれをすべてを動作させるためにいくつかのプログラミングを必要としますが。)ので、多分私は余分な電荷を言うべきではない
アレクシス・ヴィルケ

@AlexisWilke-あなたはrsyncについて正しいです、そして私は答えの中でそれをちょっと言及しました。今の答えでそれを明らかにしました。
フレデリックニールセン

Re:#3、ファイルシステムウォッチャー(Facebookのウォッチマンなど)と高速同期ツール(csync2など)を使用すると、デプロイされた新しいアセットと同期された新しいアセット間の「デッドタイム」を最小限に抑えることができます。いいえ、遅延は決してゼロになることはありませんが、非常に最小限であり、他の選択肢よりも簡単に展開できる場合があります。
ペポルアン

2

Webサーバーの負荷を減らし、負荷分散を実行する別の優れた方法は、squid(つまりsquid3)を使用することです。キャッシングを使用してリバースプロキシとして設定します。そのように設定すると、写真などの静的コンテンツをHDD(デフォルト)またはRAM(高速で最適)にキャッシュします。特定のノードが過負荷になった場合、他のsquidサーバーへのラウンドロビンも可能です。


1
非常に動的なWebサイトが必要な場合、この種のキャッシュは失敗すると思います。ダイナミズムが重いため、多くのデータのために1つのメインバックエンドサーバーにアクセスする必要があるためです。ユーザーは代わりにバックエンドの作業を分割することを検討していると思います。
アレクシスウィルケ

1
潜在的に負荷を減らすことについてのあなたの答えは正しいですが、複数のサーバー間でアセットファイルを共有することについての質問には答えていません。

@AlexisWilkeは、squidが正しくセットアップされていないと失敗します。設定でキャッシュする方法(またはキャッシュする場合)を調整しますが、完全に動的なページはないことがわかります。キャッシュできるものは常にあります。また、アンドレは、タイトルが説明しているようにアセットを共有するのに非常に役立ちますが、ファイルを共有することはあまりありません。問題は、サイトが高負荷の下でダウンしないようにする方法でした。Squidはこれを行うのに優れています。
Aihngel Tech

1

通常、より多くのサーバーの必要性は、動的なWebサイト/ APを実行するために必要なリソースに由来するため、別のサブドメイン/ドメインで静的アセットをホストすることを検討してください。(static.yourdomain.comなど)

その後、別のサーバーを使用してそれらをホストできます。静的ファイルホスティングはあまりリソー​​スを使用しないため、静的コンテンツに必要なサーバーはかなり少なくなります。また、動的コンテンツ用にサーバー上のリソースをいくつか解放します。

ロードバランサーによっては、同じドメインでこれを行うこともできます。ロードバランサーは、どのサーバーをどのリクエストに使用するかを決定しますが、別のドメインを使用する場合は、静的アセットをCDNに簡単に配置できます。必要が生じるはずです!


1

私が採用したこの課題に対する1つの解決策は、共有NFSドライブにファイルのメインの読み取り/書き込みコピーを保持するだけでなく、各Webサーバーで読み取り専用コピーを保持して、NFSホストの障害によりファイルアクセスが行われるようにすることです完全に失うのではなく、読み取り専用モードで。

  • ファイルは中央ホストに存在し、NFSマウントを介してWebホストと共有されます
  • rsync 各Webホストの読み取り専用コピーを最新の状態に保つために15分ごとに実行されます。
  • check_linkbashスクリプトは、読み取り専用のコピーへのシンボリックリンクを交換してくださいNFSマウントがまだそこにあるそうでなければ作るために毎分を実行します。

詳細は、このシステムを最初にセットアップしたときからこの記事に記載されています。

利点:

  • ファイル読み取りは高可用性です
  • ファイル書き込みの競合状態はありません
  • 新しいファイルは、すべてのWebホストですぐに利用できます。

欠点:

  • 少し複雑です。
  • 読み取り専用コピーの数はWebホストの数に比例しますが、3つ以上ある場合は過剰になる可能性があります。
  • ファイル書き込みは高可用性ではありません。
  • 読み取り専用コピーに切り替える前に最大1分間のダウンタイムが発生する可能性があります。

0

NoSQLデータベースを検討することをお勧めします。それらはクラスターで動作し、最終的な一貫性を提供するように設計されています。ただし、ACIDではないことに注意してください。

ここだ導入あなたがあなたの目的のために必要かもしれないのNoSQLデータベースの種類を決めるのに役立ちます。

以下は、利用可能なNoSQLに関連するリソースのリストです


4
この回答はファイル同期の問題にどのように役立ちますか?
-titus

@titus NoSQLでは、ノードの1つに書き込みがあると、クラスター内の他のノードに書き込みが複製されます。Cassandra 書き込み一貫性レベルは、それを明確にするのに役立つかもしれません
Azzy

だから、行く方法はNoSQL dbにすべてのファイルを保存することですか?
-titus

@titusはできますが、NoSQLデータベースはファイルを保存するよりも多くのことができます。それはすべてニーズに依存します。
アジー

2
OP「は、特定の問題に対する解決策を求めた。これらのサーバ間(例えば写真、ビデオ、および他のものなど)を共有資産...ロードバランサに接続された複数のLinux Webサーバ、あなたの答えは非常に一般的である」あなたが提案することができますし、問題に対処するための特定のツール(およびできればその構成)を説明しますか?
kdbanman

0

DFSソリューションを試してみてください。それらは高レベルの冗長性を提供し、必要なだけボリュームを共有できます。Glusterは私のお気に入りであり、有名なLinuxディストリビューションでのインストールと設定が非常に簡単です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.