負荷分散 HowTo

はじめに

ロードバランサは、Tomcatと直接通信しないワーカーです。代わりに、ロードバランサのメンバまたはサブワーカーと呼ばれる複数の「実」ワーカーの管理を担当します。

この管理には、以下が含まれます。

  • Webサーバーでのワーカーのインスタンス化。
  • ワーカーの負荷分散ファクターを使用して、重み付け負荷分散を実行する(ターゲットの定義された強度に応じて負荷を分散する)。
  • 同じセッションに属するリクエストを、同じTomcatで実行し続ける(セッションのスティッキー性)。
  • 障害が発生したTomcatワーカーを識別し、それらへのリクエストを一時停止し、代わりにロードバランサによって管理される他のワーカーにフェールオーバーする。
  • ステータスワーカーインターフェースを介して、ロードバランサ自体とすべてのメンバのステータスと負荷メトリックを提供する。
  • ステータスワーカーインターフェースを介して、負荷分散を動的に再構成できるようにする。

同じロードバランサワーカーによって管理されるワーカーは、(設定されたバランシングファクターと現在のリクエストまたはセッション負荷に基づいて)負荷分散され、同じロードバランサの他のメンバへのフェイルオーバーを提供することで、障害に対する保護も行われます。したがって、単一のTomcatプロセスの停止がサイト全体を「停止」させることはありません。

ロードバランサによって提供される機能の一部は、(負荷分散が不可能な)単一のメンバワーカーのみで作業する場合でも興味深いものです。

基本的なロードバランサのプロパティ

ワーカーのtypelbに設定することで、ワーカーはロードバランサとして構成されます。

次の表は、ロードバランサワーカーの構成に使用されるプロパティの一部を指定しています。

  • balance_workersは、ロードバランサのメンバワーカーの名前をカンマで区切ったリストです。これらのワーカーは、通常、ajp13タイプです。メンバワーカー自体は、worker.listプロパティに表示する必要はありません。そこにロードバランサを追加するだけで十分です。
  • sticky_sessionは、SESSION IDを持つリクエストを、セッションを作成した同じTomcatインスタンスにルーティングバックする必要があるかどうかを指定します。Tomcatが複数のTomcatインスタンス間でセッションデータを共有できるセッションマネージャを使用している場合、またはアプリケーションがステートレスの場合、sticky_sessionをfalseに設定できます。デフォルトでは、sticky_sessionはtrueに設定されています。
  • lbfactorは、メンバごとの個別の強度を構成するために、各メンバワーカーに追加できます。lbfactorの値が高いほど、そのワーカーにバランスされるリクエストが増えます。ファクターは整数で指定する必要があり、負荷は指定されたファクターに比例して分散されます。ファクターが高いほど、リクエストが増加します。
# The load balancer worker balance1 will distribute
# load to the members worker1 and worker2
worker.balance1.type=lb
worker.balance1.balance_workers=worker1, worker2
worker.worker1.type=ajp13
worker.worker1.host=myhost1
worker.worker1.port=8009
worker.worker2.type=ajp13
worker.worker1.host=myhost2
worker.worker1.port=8009
セッションのスティッキー性は、セッションの追跡テーブルを使用して実装されていません。代わりに、各Tomcatインスタンスは個別の名前を取得し、セッションIDの末尾に名前を追加します。ロードバランサがセッションIDを認識すると、Tomcatインスタンスの名前を見つけ、正しいメンバワーカーを介してリクエストを送信します。これを機能させるには、各Tomcatのserver.xmlのEngine要素でjvmRoute属性の値としてTomcatインスタンスの名前を設定する必要があります。Tomcatの名前は、対応するロードバランサメンバの名前と同じである必要があります。上記の例では、ホスト「myhost1」のTomcatにはjvmRoute="worker1"、ホスト「myhost2」のTomcatにはjvmRoute="worker2"が必要です。

ロードバランサのすべての設定属性の詳細については、ワーカーのリファレンスを参照してください。

高度なロードバランサワーカーのプロパティ

ロードバランサは、複雑なトポロジとフェールオーバー構成をサポートしています。メンバ属性distanceを使用すると、メンバをグループ化できます。ロードバランサは、常に最も距離の小さいメンバにリクエストを送信します。これらのすべてが壊れている場合にのみ、次に高く構成された距離のメンバにバランスされます。これにより、異なるデータセンターの場所にあるTomcatインスタンス間で優先度を定義できます。

セッションレプリケーションまたは永続セッションマネージャ(たとえば、データベース経由)を使用してセッションを共有する場合、Tomcatファームをレプリケーショングループに分割することがよくあります。メンバに障害が発生した場合、ロードバランサは、どの他のメンバがセッションを共有するかを知る必要があります。これは、domain属性を使用して構成されます。同じドメインを持つすべてのワーカーは、セッションを共有すると想定されます。

メンテナンスのために、一部のメンバで新しいセッションを許可しないように、またはまったく使用しないようにロードバランサに指示できます。これは、メンバ属性activationによって制御されます。値Activeはメンバの通常の使用を許可し、disabledは新しいセッションを作成しませんが、スティッキーリクエストは引き続き許可され、stoppedはメンバにリクエストを送信しなくなります。メンテナンスの少し前にアクティベーションを「アクティブ」から「無効」に切り替えると、ワーカー上のセッションがドレインされ、中断が最小限に抑えられます。アプリケーションの使用パターンによっては、ドレインには数分から数時間かかる場合があります。メンテナンスの直前にワーカーを停止に切り替えると、mod_jkによる誤ったエラーのログ記録が減少します。

最後に、他のワーカーに追加された属性redirectと組み合わせて、disabledに設定されたactivationを使用して、ホットスペアワーカーを構成することもできます。

# The advanced router LB worker
worker.list=router
worker.router.type=lb
worker.router.balance_workers=worker1,worker2

# Define the first member worker
worker.worker1.type=ajp13
worker.worker1.host=myhost1
worker.worker1.port=8009
# Define preferred failover node for worker1
worker.worker1.redirect=worker2

# Define the second member worker
worker.worker2.type=ajp13
worker.worker2.host=myhost2
worker.worker2.port=8009
# Disable worker2 for all requests except failover
worker.worker2.activation=disabled

worker1のredirectフラグは、worker1に問題がある場合に、ロードバランサにリクエストをworker2にリダイレクトするように指示します。他のすべての場合、worker2はリクエストを受信しないため、ホットスタンバイのように機能します。

activationdisabledに設定することに関する最後の注意点:リクエストに付属するセッションIDは、リクエストURLの一部(;jsessionid=...)として、またはcookieを介して送信されます。長い間実行されているブックマークまたはブラウザを使用する場合、無効な古いセッションIDを運ぶリクエストを無効なメンバに送信することができます。ロードバランサには有効なセッションのリストがないため、リクエストを無効なメンバに転送します。したがって、ドレインには予想よりも時間がかかります。このような場合を処理するために、Webアプリケーションに、リクエスト属性JK_LB_ACTIVATIONをチェックするサーブレットフィルタを追加できます。この属性には、「ACT」、「DIS」、「STP」のいずれかの文字列が含まれています。「DIS」を検出して、リクエストのセッションがアクティブでなくなった場合は、セッションcookieを削除し、自己参照URLを使用してリダイレクトします。リダイレクトされたリクエストにはセッション情報が含まれなくなるため、ロードバランサは無効なワーカーに送信しません。リクエスト属性JK_LB_ACTIVATIONは、バージョン1.2.32で追加されました。

ステータスワーカーのプロパティ

ステータスワーカーは、Tomcatと通信しません。代わりに、ワーカー管理を担当します。特にロードバランサワーカーと組み合わせると便利です。

# Add the status worker to the worker list
worker.list=jkstatus
# Define a 'jkstatus' worker using status
worker.jkstatus.type=status

次に、リクエストをjkstatusワーカーにマウントします。Apache HTTP Serverの場合は、次を使用します。

# Add the jkstatus mount point
JkMount /jkmanager/* jkstatus 

より高いレベルのセキュリティを実現するには、次を使用します。

# Enable the JK manager access from localhost only
<Location /jkmanager/>
  JkMount jkstatus
  Require ip 127.0.0.1
</Location>