2.4 クラスタリング

クラスタ環境でユーザアプリケーションを使用する場合、次の3つの点を考慮してください。

2.4.1 JBossのクラスタリング

クラスタとは、一連のサービスを提供するアプリケーションサーバノードの集まりです。クラスタの目的は、アプリケーションのパフォーマンスと信頼性を高めることにあります。一般的に、クラスタはエンタープライズアプリケーションに次の3つの利点をもたらします。

  • 高可用性
  • スケーラビリティ(容量の増加)
  • 負荷分散

高可用性とは、アプリケーションの信頼性が高く、展開されている間高い割合で使用できることを意味します。クラスタでは同じアプリケーションがすべてのノードで実行されるため、高可用性が実現します。1つのノードでエラーが発生しても、他のノードではアプリケーションが引き続き実行されています。Identity Managerユーザアプリケーションをクラスタで実行すると、高可用性の利点を享受できます。ただし、Identity Managerのユーザアプリケーションは、HTTPセッションのレプリケーションはサポートしていません。つまり、あるノードに処理中のセッションがあり、そのノードでエラーが発生すると、セッション情報は失われます。

負荷分散はクラスタのメンバー間で作業負荷を分散する方法です。負荷分散の目的は、パフォーマンスを向上させることです。負荷分散はさまざまな方法で実現できます(DNSラウンドロビン、ハードウェア負荷分散など)。負荷分散の各方法の詳細については、http://www.onjava.com/pub/a/onjava/2001/09/26/load.htmlを参照してください。どのような方法を取るにせよ、クラスタ設定には負荷分散機能を含めることをお勧めします。

JBossクラスタグループ

JBossクラスタはJGroupsという通信モジュールをベースにしています。JGroupsはJBossと同時にインストールされます(JBossがなくても使用できます)。JGroupsはグループ間の通信を提供し、これによって共通の名前、マルチキャストアドレス、およびマルチキャストポートを共有します。

クラスタ化されたJBossサーバをインストールすると、クラスタを管理するためのJGroupsグループがJBossによって2つ定義されます。1つはDefaultPartitionと呼ばれ、/deploy/cluster-service.xmlで定義されます。このクラスタグループはJBossによって使用され、核となるクラスタリングサービスを提供します。また、JBossは2つ目のクラスタグループとしてTomcat-Clusterを定義します。このクラスタグループは/deploy/tc-cluster-service.xmlで定義され、JBossの内部で実行されるTomcatサーバにセッションレプリケーションを提供します。

Identity Managerユーザアプリケーションは3番目のクラスタグループを使用します。このクラスタグループはUUID名を使用することで、ユーザがサーバに追加する他のクラスタグループとの衝突リスクを最小限に抑えます。デフォルトでは、クラスタグループはc373e901aba5e8ee9966444553544200という名前が付けられています。このクラスタはJBossサービスファイルを使用して設定されていません。その代わり、設定はディレクトリに存在し、ユーザアプリケーションの管理機能で設定できます。JGroupsおよびJBossのクラスタリングに精通しているユーザは、このインタフェースを使用してユーザアプリケーションのクラスタ設定を調整できます。クラスタ設定の変更をサーバノードに適用するには、そのサーバノードを再起動する必要があります。

ユーザアプリケーションのクラスタグループは、クラスタ環境でユーザアプリケーションのキャッシュを調整する目的でのみ使用されます。ユーザアプリケーションのクラスタグループは2つのJBossクラスタグループとは無関係で、それらのグループとは全く連携しません。ユーザアプリケーションのクラスタグループと2つのJBossグループは、異なるグループ名、マルチキャストアドレス、およびマルチキャストポートをデフォルトで使用するため、設定し直す必要はありません。

ユーザアプリケーションのクラスタグループの設定は、ディレクトリ設定を共有するIdentity Manager 3アプリケーションすべてと共有されます。ユーザアプリケーションの管理インタフェースにあるローカル設定オプションは、管理者がクラスタからノードを削除したり、クラスタ内のサーバのメンバーシップを変更したりできるようにする目的で用意されています。たとえば、クラスタリングを全体で無効にしてから、ディレクトリ設定を共有するサーバのサブセットに対してローカルでクラスタリングを有効にすることができます。

アプリケーションのファーミング

JBossではクラスタ全体にホットデプロイが可能です。これを行うには、クラスタ化されたJBossインスタンスのファームディレクトリにアプリケーションEAR、WAR、またはJARをコピーします。1台のコンピュータでホットデプロイを実行すると、そのコンポーネントはクラスタ内の全インスタンスに自動的に展開されます。その間、クラスタは実行を続けます。

JBossアプリケーションサーバのバージョン4.0.2 (このマニュアルの執筆時点でユーザアプリケーションのインストールプログラムに付属)には、使用法に関して未解決の問題があるため、このバージョンを使用したホットデプロイによるアプリケーション展開はお勧めできません。ただし、このマニュアルの発行後にこの技術が改善される可能性があるため、JBossファーミング技術を使用してユーザアプリケーションを正常に展開するために必要な手順について説明しています(JBossファーミングを使用したクラスタへのユーザアプリケーションの展開を参照)。

MySQLデータベース

ユーザアプリケーションのインストールプログラムは、ユーザアプリケーションで使用できるようにMySQLデータベースマネージャをインストールしてデータベースを作成するか、既存のOracle、Microsoft SQL Server、またはMySQLを使用します。データベースはデータの永続性を維持する役割を果たします。JBossクラスタのノードはすべて、同じデータベースインスタンスにアクセスする必要があります。ユーザアプリケーションは標準のJDBCコールを使用してデータベースのアクセスや更新を行います。ユーザアプリケーションは、JNDIツリーにバインドされたJDBCデータソースを使用してデータベースへの接続を開きます。ユーザアプリケーションのインストールプログラムを使用してJBossクラスタを作成した場合、データソースは自動的にインストールされます。JBossクラスタを手動で設定する場合は、クラスタ内の全ノードで展開ディレクトリにデータソースファイル(IDM-ds.xml)をコピーする必要があります。また、MySQLを使用している場合は、JBoss /server/IDM/libディレクトリにあるMySQL JDBCドライバ(mysql-connector-java-3.1.10-utf8-clob-fix-bin.jar)をJBossのserver/IDM/libディレクトリにコピーする必要があります。

ログ

クラスタのログを有効にするには、JBossサーバ設定の\confディレクトリ(例: \server\IDM\conf)にあるlog4j.xml設定ファイルを編集し、ファイルの最後の方にある次のようなセクションをアンコメントする必要があります。

<!--  Clustering logging --> - <!-- Uncomment the following to redirect the org.jgroups and org.jboss.ha categories to a cluster.log file.<appender name="CLUSTER" class="org.jboss.logging.appender.RollingFileAppender"> <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/> <param name="File" value="${jboss.server.home.dir}/log cluster.log"/> <param name="Append" value="false"/> <param name="MaxFileSize" value="500KB"/> <param name="MaxBackupIndex" value="1"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/> </layout> </appender> <category name="org.jgroups"> <priority value="DEBUG" /> <appender-ref ref="CLUSTER"/> </category> <category name="org.jboss.ha"> <priority value="DEBUG" /> <appender-ref ref="CLUSTER"/> </category> -->

cluster.logファイルは、JBossサーバ設定のlogディレクトリ(例: \server\IDM\log)にあります。

2.4.2 JBossクラスタへのユーザアプリケーションのインストール

クラスタにユーザアプリケーションをインストールする場合は、ユーザアプリケーションのインストールプログラムを使用してクラスタ内の各ノードにユーザアプリケーションをインストールすることをお勧めします。JBossファーミングを使用してクラスタにユーザアプリケーションを展開することはお勧めしませんが、代替手段としてその手順を説明しておきます。

クラスタ内の各ノードでのユーザアプリケーションのインストールプログラムの使用

JBossには、minimaldefault、およびallという3種類の既製のサーバ設定が付属しています。クラスタリングはallの設定でのみ有効になります。/deployフォルダにあるcluster-service.xmlファイルには、デフォルトのクラスタパーティションの設定が記述されています。ユーザアプリケーションのインストール時に、インストールプログラムでクラスタにインストールするよう指定すると、インストールプログラムはすべての設定のコピーを作成し、そのコピーにIDMという名前を付けます(これはデフォルト設定です。インストールプログラムを使用して名前を変更できます)。それからこの設定にユーザアプリケーションをインストールします。

ユーザアプリケーションのインストールプログラムを使用して、クラスタ内の各ノードにユーザアプリケーションをインストールするには:

  1. 1番目のJBossノードでユーザアプリケーションの完全インストール(MySQL、JBoss、およびユーザアプリケーション)を実行します。ユーザアプリケーションのインストールプログラムを使用する際の詳細については、『Identity Manager 3インストールガイド』を参照してください。

    • ユーザアプリケーションのデータベースとしてMySQLを使用すると、ユーザアプリケーションのインストールプログラムによって、MySQLが新しくインストールされます。指定したMySQLのrootユーザのパスワードを記録しておきます。この情報は、クラスタ内の残りのノードにユーザアプリケーションをインストールするときに必要になります。
    • インストールプログラムの[IDM Configuration (IDM構成)]画面で、[clustering (all) (クラスタリング(すべて))]オプションを選択します。
    • 環境に合わせて、他のインストールオプションを選択します。
  2. MySQLがまだ実行されていない場合は、/IDM/mysqlディレクトリにあるstart-mysql.batファイルを使用してMySQLを起動します。

    メモ:Linuxでは、次のシェルコマンドを使用してMySQLデーモンが実行されているかどうかを判断できます。

    
    ps -A | grep mysqld
    

    このコマンドによりmysqldで終わる複数の行が返されれば、このデーモンは実行されています。

  3. IDMディレクトリにあるstart-jboss.bat (Windows)ファイルまたはstart-jboss.sh (Linux)ファイルを使用してJBossとユーザアプリケーションを起動します。

    説明:説明:図
  4. JBossクラスタ内に追加された各ノードに対して、ユーザアプリケーションのカスタムインストールを実行します。

    • ユーザアプリケーションだけを選択してインストールします。
    説明:説明:図
    • ユーザアプリケーションのデータベースをインストールするサーバのIPアドレスまたはホスト名を指定します。
    • ユーザアプリケーションデータベースのデータベースユーザ名とパスワードを指定します。MySQLを使用している場合は、ユーザ名はroot、パスワードはインストール処理中にステップ 1で指定したパスワードになります。
    • インストールプログラムの[IDM Configuration (IDM構成)]画面で、[clustering (all) (クラスタリング(すべて))]オプションを選択します。
    • 環境に合わせて、他のインストールオプションを選択します。
  5. IDMディレクトリにあるstart-jboss.bat (Windows)またはstart-jboss.sh (Linux)を使用してJBossクラスタの各ノードを起動します。

JBossファーミングを使用したクラスタへのユーザアプリケーションの展開

問題が発生するおそれがあるため、JBossバージョン4.0.2以前ではJBossファーミングを使用しないでください(詳細については、http://jira.jboss.com/jira/browse/JBAS-1899を参照してください)。ユーザアプリケーションのインストールプログラムを使用して、クラスタ内の各ノードにユーザアプリケーションをインストールすることをお勧めします(詳細については、この章のクラスタ内の各ノードでのユーザアプリケーションのインストールプログラムの使用を参照してください)。ただし、JBoss 4.0.3以降でファーミングを使用してJBossクラスタにユーザアプリケーションを展開する場合は、次の手順に従います。

メモ:次の内容は、自己責任で試験的にJBoss 4.0.3を使用することを望むユーザのための手順です。公式にサポートされているバージョンは4.0.2です。

JBossファーミングを使用してクラスタにユーザアプリケーションを展開するには:

  1. JBossクラスタノードの1つに対してユーザアプリケーションのカスタムインストールを実行します。ユーザアプリケーションとMySQL (MySQLを使用している場合。それ以外の場合はユーザアプリケーションのみ)をインストールするよう選択します。インストールはノード内のクラスタがすべて実行されている状態で実行できますが、ユーザアプリケーションはクラスタで最初に開始されるノードにインストールしてください。

  2. /server/IDM/libディレクトリにあるJDBCドライバファイル(たとえば、MySQLを使用している場合、JDBCドライバファイルはmysql-connector-java-3.1.10-utf8-clob-fix-bin.jar)をクラスタの各ノードにある対応するディレクトリにコピーします。

  3. ユーザアプリケーションと同時にインストールされたcacertsファイルをJREの/lib/securityディレクトリから、クラスタの各ノードにあるJREの/lib/securityディレクトリにコピーします。

  4. IDM.warファイルとIDM-ds.xmlデータソースファイルを、サーバ設定ディレクトリの/deployディレクトリから、サーバ設定ディレクトリの/farmディレクトリに移動します。ファイルは実際に移動してください。元のファイルを/deployディレクトリに残さないでください。

  5. ユーザアプリケーションのデータベースを起動します(付属のMySQLを使用する場合は、/IDM/mysqlディレクトリにあるstart-mysql.batファイルを使用してMySQLを起動します)。

  6. ユーザアプリケーションとユーザアプリケーションのデータベースをインストールしたノードのIDMディレクトリにあるstart-jboss.bat (Windows)またはstart-jboss.sh (Linux)を使用してJBossとユーザアプリケーションを起動します。

  7. クラスタ内の他のノードを起動します。

2.4.3 ユーザアプリケーションクラスタグループのキャッシング設定

JGroupsおよびJBossクラスタリングに精通しているユーザは、ユーザアプリケーションの管理ユーザインタフェースを使用してクラスタグループのキャッシング設定を変更できます(セクション 13.3.5, クラスタのキャッシュ設定を参照してください)。クラスタ設定の変更をサーバノードに適用するには、そのサーバノードを再起動する必要があります。

2.4.4 クラスタリング用のワークフローの設定

ワークフローエンジンのクラスタリングは、ユーザアプリケーションのキャッシュフレームワークとは無関係に動作します。クラスタ環境でワークフローエンジンを正常に動作させるには、いくつかの手順を実行する必要があります。

  • クラスタ内のサーバはすべて同じデータベースをポイントしている必要があります。これには、推奨された方法を使用してクラスタにユーザアプリケーションをインストールした場合(クラスタ内の各ノードでのユーザアプリケーションのインストールプログラムの使用を参照)、インストールプロセス中に、そのユーザアプリケーション用のデータベースをインストールしたサーバのIPアドレスとホスト名を指定します。ファーミングを使用してクラスタノードにユーザアプリケーションを展開した場合(JBossファーミングを使用したクラスタへのユーザアプリケーションの展開を参照)は、/deployディレクトリのデータソースファイル(IDM-ds.xml)を、ユーザアプリケーションを最初にインストールしたノードにある/farmディレクトリに移動します。これにより、クラスタ内のすべてのノードにデータソースが展開されます。
  • クラスタ内の各サーバは固有のエンジンIDで起動する必要があります。このために、サーバの起動時にcom.novell.afw.wf.engine-idのシステムプロパティを設定します。たとえば、JBossを起動して、サーバのワークフローエンジンにエンジンIDとしてENGINE1を割り当てる場合は、次のコマンドを使用します。

    run.sh -Dcom.novell.afw.wf.engine-id=ENGINE1 (Linux)

    run.bat -Dcom.novell.afw.wf.engine-id=ENGINE1 (Windows)

特定のサーバで実行されているワークフローエンジンによりワークフロープロセスのインスタンスが起動されると、ワークフロープロセスはそのサーバでのみ実行および完了できます。これにより、ワークフロープロセスが安全に実行されます。ただし、プロセスインスタンスのフェールオーバーはサポートされていません。クラスタ内のサーバがクラッシュした場合、同じIDを持つエンジンが再起動されるまでプロセスインスタンスは再起動されません。

ハードウェアやソフトウェアに深刻な問題が発生したためにサーバコンピュータが再起動できない場合は、別のコンピュータでアプリケーションサーバを起動できます。この場合は復旧できないコンピュータで使用されていたのと同じワークフローエンジンIDを使用します。エンジンIDは論理名であり、エンジンが実行されていた物理コンピュータに対する直接マッピングではないため、中断されたプロセスインスタンスは代わりのコンピュータで正常に完了します。

プロセスインスタンスは、プロセスを起動したエンジンが所有しています。ただし、ユーザがクラスタ内の任意のユーザアプリケーションにログオンして、プロセスの詳細を表示したり、プロセスを一時停止したり、またはプロセスに割り当てられたタスクを完了したりできます。プロセスを所有しないエンジン上で一時停止されたプロセスや完了されたタスクは保留状態になり、それらを所有するエンジンによって検出されると実行が再開されます。