web-dev-qa-db-ja.com

マルチサーバー/クラスター環境で注意する必要がある潜在的な問題は何ですか?

私はしばらくの間、クライアントとウェブサイトに取り組んでおり、サイト自体の人気が非常に高まっています。現在、サイトをホストしている1台のマシンがリクエストを処理するのに苦労しており、サイト自体を可能な限り最適化しています(キャッシュなど)。

現在、別のサーバーを追加して、私の質問につながる余分な負担を取る必要があります-Webファームまたはクラスターホスティングに移動するときに、サイトを認識またはテストする必要がある潜在的な落とし穴と注意点環境?

3
Wolfwyrd

考えられる警告がいくつかあります。

セッション

セッションがサーバー側に保存されている場合(つまりPHP)、bothサーバーは共有セッションストレージパスにアクセスする必要があります。そうしないと、ロードバランサーが1つのサーバーから別のサーバーにリクエストを送信するか、場合によっては(gasp)1人のユーザーに2つの一意のセッションがあるため、セッションが失われます。これは、AJAXで特にイライラする可能性があります。ロードバランサーによっては、「スティッキー」セッションも可能です。

一時ファイル

実際にリクエストの処理中に何らかの一時ファイルを使用する場合、両方のサーバーが同じ/ tmpディレクトリを共有する必要があります。これは、ダウンロード用に圧縮された一時アーカイブ、何かを追跡するフラットファイルDBである可能性があります。

SQLiteロック

SQLite3を使用している場合、特にNFSのようなものを使用してサーバー間でデータベースファイルを共有している場合は、これまでに表面化したことがないいくつかの癖に気付くことがあります。 NFSはこれが遅いため、他の何かを使用することをお勧めします。 Lustreのような分散ファイルシステムはセットアップが簡単で、GFS/OCFS2を使用することもできます。

SSL

おそらく、ロードバランサーにSSLハンドシェイクを処理させ、古い自己署名証明書を使用してバックエンドサーバーに要求を送信することをお勧めします。

一般的な注意事項:

  • 前述のように、ディレクトリの共有には高性能のファイルシステムを使用します。すべての共有ファイルは、Webサーバーの1つではなく、ネットワークストレージに存在する必要があります。それ以外の場合、一方がダウンすると、両方とも役に立たなくなり、一種の目的に反します。

  • サイトでRDBMSを使用する場合、2つのオプションがあります。両方のノードで実行して、マスターとマスターの同期を使用するか、DBサーバーを独自のホームに配置します。 2番目の方法をお勧めします。これにより、Webサーバーの操作スペースが大幅に増えます。

  • ロードバランサーにも冗長性が必要です。

ほとんどの場合、実際のサイト/アプリケーション自体をほとんどまたはまったく変更せずに、単一のサーバーから負荷分散ファームに移動できますが、すべてのノードが同じファイルを読み書きできることを確認する必要があります。これには、アプリ自体をロックするためのロジックを追加する必要がある場合があります。

1
Tim Post

セッション状態(問題の場合)は潜在的な問題です。ほとんどの負荷分散アプライアンスはスティッキーセッションを使用できます。つまり、通常はブラウザーメモリに保存されているCookieを使用して、SERVER1で開始するユーザーがSERVER1に残ります。唯一の注意点は、何らかの理由でSERVER1がオフラインになった場合、そのユーザーは別のサーバーに再度ログインする必要があることです。

サーバーファームでセッションを共有することで、アプリ(CFアプリ)でこれをバイパスし始めました。したがって、1台のマシンがダウンしても、ユーザーエクスペリエンスに影響はありません。

ファーム内のすべてのサーバーにコンテンツを正しく複製する際に直面した他の唯一の課題。これを行うためのソフトウェアがあります(ロボットコピー、NCHソフトウェアからのFlingは私が使用した2つです)が、同期が100%動作しない場合があります。

0
Milner

アプリケーションは状態を気にしますか?あるマシンが1つのリクエストを処理し、次に別のマシンが別のリクエストを処理する場合、それは重要ですか?リクエスト間で何らかの形の状態を維持する必要がある場合、すべてがより複雑になり、問題に対処するさまざまな方法があります。

状態について心配する必要がない場合は、サイトの構築はうまくいきます。 proxy といくつかのバックエンドサーバーを使用すれば、比較的大丈夫です。

状態を維持する必要がある場合は、プロキシを介してスティッキーセッションを作成するさまざまな方法があり、同じバックエンドサーバーが1人のユーザーからのすべてのリクエストを処理しますが、それらのセッションをスティッキーに保つのが難しくなるものもたくさんあります。

バックエンドの共通メディアに状態を保持することもできるため、各サーバーは同じユーザーに対して同じ状態をロードします。これは、データベース(遅すぎるかもしれません)または memcached のようなもので行うことができます。

データベースサーバーの数も増やしていますか?それは心配するべき問題の別の束をもたらします。

セッションの問題のいくつかは、スタックオーバーフローポッドキャストで説明されています Number 6

テストでは、同じクライアントから異なるバックエンドへの多くのリクエストが問題を抱えている可能性が高いため、リクエストが多くのサーバーに送信されたときにどのように動作するかを確認できるように、同様のテストクラスターを強くヒットするようにしてくださいテスト計画内の何かが原因で発生します。

Stack Overflowの network config について読むこともできます。

0
danivovich