1

アクティブ/パッシブ方式を使用して、アプリケーションの可用性を高めようとしています。現在、アプリケーションをTomcatサーバーにデプロイしています。このサーバーは、WindowsまたはLinuxプラットフォームでホストできます。

そこで、2台のTomcatサーバーにデプロイします。各サーバーは別々のマシンで実行されます。セッションレプリケーション(DBへの保存)を提供するTomcat構成を介して、Tomcatを同じクラスターに構成します。リクエストをリダイレクトするためにいくつかのWebサーバー/ロードバランサーを使用しています(まだ決定されていません)。

問題は、アプリケーションが現在ステートフルであるため、両方のTomcatで同時に実行できないことです(そして、ステートレスにするのはコストがかかりすぎます)。実際には、同時に1つのTomcatのみが起動する必要があります。または、少なくとも、Tomcatで開始されるアプリケーションは1つだけです。

要約すると、次のことができるソフトウェアが必要です。

  1. HTTPリクエストを介してアプリケーションの無効な状態を特定します(マシン/ Tomcatがダウンしているか、アプリケーションが応答しない)。
  2. 他のアプリケーションが無効であると識別されたら、TomcatインスタンスまたはアプリケーションをTomcatで起動します。
  3. 無効であると識別されたら、TomcatインスタンスまたはTomcat上のアプリケーションを停止します。
  4. LinuxとWindowsの両方のプラットフォームをサポートしています...

この製品は、JVMで使用されるライブラリである場合があり、Tomcatマシン上に存在し、相互に通信する個別の監視プロセスである場合があり、Tomcatと通信する場合は、DBを使用する場合があります。Webサーバーマシンを使用する場合があります...

私はそれを実行する既製の製品(Pacemaker / CoroSync / keepalived)を検索しましたが、すべてWindowsをサポートしていません(私が理解している限り)。

4

1 に答える 1

0

私は最終的に次のことをしました:

両方の Tomcat が常に開始されます。アプリケーションも両方の Tomcat で開始されます。

スペシャルsynchronization serviceは手書き。このサービスはアプリケーションの一部であり、アプリケーションの起動とともに開始されます。現在アクティブなノードと、どのノードをアクティブにするかを決定します

私のアプリケーションは、サービスのライフサイクルを管理するために Spring コンテキストを使用しました。wrapperSpring コンテキストと Spring コンテキストという 2 つの異なるコンテキストに分けましたchild

コンテキストは、アプリケーションのwrapper起動とともに開始され、常に利用可能で、両方の Tomcat で動作しています。同期サービスは、wrapperコンテキスト内の Bean として構成されました。

コンテキストにはchild、アプリケーションが外部クライアントに提供するすべてのサービスが実際に含まれていました。これは、現在のノードがアクティブなときにのみ開始し、パッシブになると停止するように指定したコンテキストです。

childアクティブ/パッシブのコンテキストのオン/オフはどのように切り替えられましたか?

このコンテキストは、アプリケーションの起動時に自動的に開始されませんでした。が現在のノードをアクティブにする必要があるsynchronization serviceと判断すると、イベントが発生してchildコンテキストが開始され、そのノードですべてのサービスが利用可能になりました。逆にsynchronization service、現在のノードがパッシブになると結論付けた場合、適切なイベントが発生し、childコンテキストがシャットダウンされ、そのノードですべてのサービスが利用できなくなりました。

追加されたもう 1 つの重要な機能は、interceptor着信要求用です。Tomcat の 1 つに到達する着信要求は、実際には、ロード バランサー/Web サーバーが、ターゲット ノードが現在使用可能なノードまたは優先ノードであると判断したことを意味します。このような場合、ターゲット ノードがたまたまパッシブ ノードであったとしても、アクティブになるはずです。したがって、interceprorは が行ったのと同じイベントを発生synchronization serviceさせ、再びchildコンテキストを開始し、そのノードでサービスを利用できるようにします (synchronization serivce両方の Tomcat の はスイッチを識別し、以前アクティブだったノードはパッシベートします)。

于 2013-07-29T00:20:33.530 に答える