複数の水平drupalインスタンスの負荷分散


8

Servicesモジュールを使用してREST WebAPIを開発しました。正常に動作します。私は、Drupalインスタンスを水平方向にスケーリングする必要があると予測される使用法でそのAPIのクライアントを持っています。APIの性質上、大量のCPUおよびGPUリソ​​ースを必要とするため、クラウドサーバーを使用できないことに注意してください。また、私のAPIの性質上、DrupalインスタンスはWindows OSで実行する必要があります。(私のアプリケーションには、Win64でのみ利用可能なソフトウェアが必要です。)現在、同じ場所にかなり頑丈なサーバーがあり、この野心的なクライアントのために、次の方法でハードウェアを水平方向に拡張する予定です。

  • フロントエンドロードバランサーとしてHaProxyを実行している1つのCentOSサーバー
  • 最初に2つ、必要に応じてさらに追加して、DrupalをホストするWindows Server 2008 R2サーバー、
  • 複数のDrupalインスタンスに単一のデータベースを提供する1つのCentOSデータベースサーバー
  • DBサーバー1が停止した場合に備えて、レプリケーションモードで実行されている1つのCentOSデータベースサーバー。

私の質問は、HaProxyロードバランサーの動作に関係しています。Drupalインスタンスによって作成されたセッションIDは、互いに一意であると想定しています。ロードバランサーはsessionIdを確認し、すべての要求をそのsessionIdを生成した同じサーバーにルーティングしますか?負荷分散によって各API要求が別のサーバーに送信される場合、REST WebAPI通信はどのように機能しますか?同じリソースに対する複数のAPIリクエストが同じDrupalインスタンスにルーティングされることを保証できないため、WebAPIによって参照されるすべてのデータをデータベースに保存する必要がありますか?


非常に興味深い質問です。私はそれがDrupalについての厳密な質問よりも一般的な質問であると感じざるを得ません(正しく読んでいれば、セッション認証を使用するすべてのPHPベースのREST APIに当てはまる可能性があります)。その場合は、メインのSOサイトに移行するようにフラグを立てることでメリットが得られる可能性があります。ちょうど考え:)
クライヴ

他の場所でより多くの情報を見つけるための+1。Drupalで任意のPHPアプリケーションをスケーリングするためのアドバイスのほとんどを使用できます。私のコメントは少々長すぎたので、あなたが必要なものを見つけるのに役立つかもしれない回答を投稿しました。
rocketeerbkw 2012

あなたの洞察についてrocketeerbkwとBerdirに感謝します。これに関する継続的な調査で、HaProxyがスティッキーセッションでSSLを処理しないことを学びました。すべてのAPI通信はSSLを介しているため、SSLにはstunnelなどを使用する必要があります。ここでの私の次の動きを完全に理解するには、さらに調査が必要なようです。
Blake Senftner、2012

さらに多くの調査で、私の構成はtier1:ファイアウォールサーバーとstunnel、tier2:ロードバランサー、tier3:複数のdrupal Webサーバー、tier4:共有データベースサーバー、tier5:データベースサーバーの複製のようになる必要があることが示されているようです。そして、おそらくtier4とともに、複数のDrupalインスタンスの共有ファイルストレージ用のSAN。このようなものを設定する人々を説明する洞察、パンくず、またはWeb記事は大歓迎です。
Blake Senftner、2012

回答:


12

ロードバランサー/リバースプロキシの背後に複数のWebサーバーを配置することは、Drupalで非常に一般的であり、十分にサポートされています。Varnishは通常、Linuxの世界で使用されています。これは、実際にそれを使用できるときはめちゃくちゃ速いため、匿名の訪問者を意味します。これは明らかにあなたのサイトには当てはまりません。

セッションはデフォルトでデータベースに保存されるため、問題ありません。すべてのサーバー間で共有する必要がある他の唯一のものは、パブリックファイルディレクトリと、そのようなものを使用している場合はプライベートファイルなどです。より高度なアプローチがいくつかありますが、ほとんどの場合、NFSのような共有/分散ファイルシステムがこれに使用されます。私が関わっている1つのサイトには、DrupalサーバーのNFSマウントである別のサーバーによって提供されるファイルシステム(アクセスが遅いため)があり、Lighthttpdによって別のドメインで配布されています。しかし、繰り返しになりますが、多くの画像やcssファイルをサーバーで処理するつもりはないので、おそらくそれほど重要ではありません。

rocketeerbkwで述べたように、Memcache、Redisなどのキャッシュバックエンドがあります。これまでのところ、私はMemcacheのみを使用していましたが、最近Redisを調べ始めましたが、非常に有望に見えますが、Windowsで使用できるかどうかはわかりません。ただし、キャッシュ用に別のLinuxサーバーを設定することは可能です。Drupal 7はキャッシュに大きく依存しており、データベースからキャッシュを取得できることは2つの理由で非常に重要です。

  1. RedisやMemcacheなどのツールは、高速なキーベースのルックアップ用に設計されており、データを常にメモリに保持して、ルックアップを可能な限り高速にします。また、構成された制限に近づいた場合に、古いキャッシュデータを自動的にクリーンアップするサポートも組み込まれています。

  2. さらに重要なのは、データベースの負荷を軽減することです。基本的なセットアップが完了したら、Webサーバーを追加するのは簡単です。単一のデータベースサーバーの制限に達し始めると、状況はさらに複雑になり、マスター/マスターレプリケーションなどを調べる必要があります(Drupal 7は、マスター/スレーブ環境からあまりメリットを得られません)。

そのため、基本的には、自分で処理する必要がある独自のAPIです。可能であれば、すべてのサーバーから常にすべてが利用可能であることを確認する必要があります。データベース、ファイルシステムなどを使用できます(DrupalはMongoDBを使用して、フィールドなどの特定のデータを保存することもできます)。これがオプションでない場合は、スティッキーセッションを使用して、ユーザーが常に同じインスタンスで終了するようにする必要があります。ただし、サーバーの1つに障害が発生した場合、そのサーバー上にいたすべてのユーザーは別のサーバーに再接続する必要があり、データを失う可能性があるため、これは避けてください。


0

デフォルトでは、PHPはセッションをディスクに保存します。ユーザーがサーバー1にログインすると、サーバー2にヒットし、ログアウトされます。これを修正するためのいくつかのオプションがあります:

  1. セッションをディスクに保存しない
  2. ユーザーが常に同じサーバーにアクセスするようにする
  3. すべてのサーバーに共有ファイルシステムをマウントする

#2を実装し、HAProxyに関する質問に回答するには、最も基本的な設定では、TCPモードで実行し、「ソース」バランシングアルゴリズム(http://cbonte.github.com/haproxy-dconv/configuration-1.4.html#4-balance)を使用して、ユーザーが同じサーバー。ドキュメントを読んで、そのアプローチを使用することの欠点があるかどうかを判断する必要があります。

#1の場合、すべてのサーバーがセッションに接続してセッションを取得するRedisやMemecachedなどのキー/値ストアを使用できます。これにより、セッションのロード/保存が非常に速くなり、共有Drupalキャッシュとしても使用できます。


6
デフォルトでは、Drupalはセッションをファイルシステムではなくデータベースに格納します。
Berdir 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.