20.3. HAPartition サービス

HAPartition は、Enterprise Application Platform クラスタリングでのさまざまなタスクに使用される汎用的なサービスです。要するに、HAPartition は、1 つまたは複数のクラスタメンバに対する RPC 呼び出しの実行/受信をサポートする JGroups Channel の上部に構築された抽象層です。 HAPartition を使用するサービスは単一の Channel や多重 RPC 呼び出しを共有できるため、設定を簡易化することができ、各サービスが独自の Channel を作成するランタイムオーバーヘッドが発生しなくなります。 また、HAPartition はどのクラスタリングサービスがどのクラスタメンバで実行されているかを記録する分散レジストリもサポートし、クラスタメンバーシップやクラスター化されたサービスレジストリが変更されたときに該当するリスナに通知します。さらに、HAPartition は、スマートなクライアントサイドクラスタプロキシ、EJB 2 SFSB レプリケーションおよびエンティティキャッシュ管理、ファーミング、HA-JNDI、HA シングルトンなどの、本書でこれから説明する多くの重要なクラスタリングサービスを形成します。
次のスニペットは標準の JBoss Enterprise Application Platform ディストリビューションにパッケージされた HAPartition サービスの定義を表しています。 この設定は、 server/production/deploy/cluster/hapartition-jboss-beans.xml ファイルにあります。
<bean name="HAPartitionCacheHandler" class="org.jboss.ha.framework.server.HAPartitionCacheHandlerImpl">
 <property name="cacheManager"><inject bean="CacheManager"/></property>
 <property name="cacheConfigName">ha-partition</property>
</bean>
<bean name="HAPartition" class="org.jboss.ha.framework.server.ClusterPartition">
 <depends>jboss:service=Naming</depends>
 <annotation>@org.jboss.aop.microcontainer.aspects.jmx.JMX
      (name="jboss:service=HAPartition,partition=${jboss.partition.name:DefaultPartition}", exposedInterface=org.jboss.ha.framework.server.ClusterPartitionMBean.class, registerDirectly=true)</annotation>
           
 <!-- ClusterPartition requires a Cache for state management -->
           
 <property name="cacheHandler"><inject bean="HAPartitionCacheHandler"/></property>
           
 <!-- Name of the partition being built -->
           
 <property name="partitionName">${jboss.partition.name:DefaultPartition}</property>
           
 <!-- The address used to determine the node name -->
           
 <property name="nodeAddress">${jboss.bind.address}</property>
           
  <!-- Max time (in ms) to wait for state transfer to complete. Increase for large states -->
           
 <property name="stateTransferTimeout">30000</property>
           
 <!-- Max time (in ms) to wait for RPC calls to complete. -->
           
 <property name="methodCallTimeout">60000</property>
           
 <!-- Optionally provide a thread source to allow async connect of our channel -->
           
 <property name="threadPool"><inject bean="jboss.system:service=ThreadPool"/></property>
 <property name="distributedStateImpl">
 <bean name="DistributedState" class="org.jboss.ha.framework.server.DistributedStateImpl">         
             
    <annotation>@org.jboss.aop.microcontainer.aspects.jmx.JMX
    (name="jboss:service=DistributedState,partitionName=${jboss.partition.name:DefaultPartition}", exposedInterface=org.jboss.ha.framework.server.DistributedStateImplMBean.class, registerDirectly=true)</annotation>
             
  <property name="cacheHandler"><inject bean="HAPartitionCacheHandler"/></property>                  
 </bean>
 </property>
</bean>
上記の多くは定型的な定義ですが、 次にエンドユーザーに適切な主なポイントについて説明します。 上記では、 HAPartitionCacheHandlerHAPartition の 2 つの Bean が定義されています。
HAPartition Bean は次の設定プロパティを公開します。
  • PartitionName はクラスター名を指定する任意の属性です。 デフォルト値は DefaultPartition です。-g (または --partition) コマンドラインスイッチを使用して、 サーバー起動時にこの値を設定します。

    注記

    MCBean:ServerConfig プロファイルサービスコンポーネントにあるpartitionName を使う場合、システムは当プロパティに対して null 値を返します。MCBean:HAPartition 管理のコンポーネントからのPartionName を使い正しい値を取得します。
  • nodeAddress は未使用のため、 無視しても問題ありません。
  • stateTransferTimeout は初期のアプリケーションステート転送のタイムアウト値 (ミリ秒単位) を指定します。 ステート転送は、 サービスの起動時にすでに実行されているクラスタメンバから初期のアプリケーションステートのシリアライズされたコピーを取得するプロセスを意味します。 デフォルト値は 30000 です。
  • methodCallTimeout は、 別のクラスターメンバーからグループ RPC への応答を取得する時のタイムアウト値( ミリ秒単位) を指定します。 デフォルト値は 60000 です。
HAPartitionCacheHandler は HAPartition とJBoss Cache の統合を手助けする小さなユーティリティサービスです (「JBoss Enterprise Application Platform の CacheManager サービス」 を参照)。 HAPartition はJBoss Cache を使用する DistributedState と呼ばれる子サービスを公開します (「DistributedState サービス」参照)。 HAPartitionCacheHandler は、 DistributedState のキャッシュが使用する JGroups Channel と HAPartition が直接使用する Channel 間の設定が一貫性を保つようにします。
  • cacheConfigName は、 HAPartition 関連のキャッシュに使用する JBoss Cache 設定の名前になります。 HAPartition が使用するべきである JGroups プロトコルスタック設定の名前も間接的に指定します。 JGroups プロトコルスタックの設定方法は、 「JGroups の統合」 を参照してください。
ノードがクラスターを形成するには、 ノードの PartitionName が同じでなければなりません。 また、 HAPartitionCacheHandlercacheConfigName が同じ JBoss Cache 設定を指定しなければなりません。 どちらかの要素を一部のノードで変更すると、クラスターが適切に動作しなくなります。
ご使用のブラウザーでクラスター内いずれかの JBoss インスタンスの JMX コンソール (http://hostname:8080/jmx-console/ など) にアクセスしてから jboss:service=HAPartition,partition=DefaultPartition MBean (-g 起動スイッチを使用する場合はご使用のパーティション名が反映されるよう MBean 名を変更) をクリックすると現在のクラスタ情報を表示することができます。 現在のクラスターメンバーの IP アドレス一覧は CurrentView フィールドに表示されます。

注記

1 つの JBoss サーバーインスタンスを複数の HAPartitions に同時に置くことは技術的には可能ですが、 管理が複雑になるため一般的には推奨されません。

20.3.1. DistributedReplicantManager サービス

DistributedReplicantManager (DRM) サービスは、 HAPartition.getDistributedReplicantManager() メソッドにより HAPartition ユーザーが使用できる HAPartition サービスのコンポーネントの 1 つです。 通常、 JBoss Enterprise Application Platform のユーザーは直接 DRM を利用することはありません。 ここでは、 Enterprise Application Platform のクラスタリング内部がどのように動作するかを詳しく知りたいユーザー向けに説明します。
DRM は HAPartition ユーザーが特定のキーでオブジェクトを登録できるようにします。 これにより、 クラスターのメンバーによりそのキーで登録したオブジェクトのセットを呼び出し側が利用できるようにします。 DRM は通知のメカニズムも提供するため、 レジストリの内容が変更された時にリスナへ通知を行うこともできます。
JBoss Enterprise Application Platform の DRM には主に 2 つの使用法があります。
  • クラスター化されたスマートプロキシ
    クラスター化された EJB の名前など、クラスター化されたスマートプロキシを必要とするサービスの名前がキーとなります (「クライアント側インターセプターアーキテクチャー」 を参照)。 各ノードが DRM に保存する値オブジェクトは「ターゲット」と呼ばれます。 スマートプロキシのトランスポート層はこのターゲットを使用してノードへコンタクトします (RMI スタブ、 HTTP URL、 JBoss Remoting の InvokerLocator など)。 クラスター化されたスマートプロキシを構築するファクトリが DRM にアクセスして、プロキシに挿入するべきである「ターゲット」のセットを取得し、クラスター内のすべてのノードと通信できるようにします。
  • HASingleton
    高可用シングルトンとして機能する必要があるサービスの名前がキーとなります (HASingleton の章を参照)。 各ノードが DRM に保存する値オブジェクトは、 トークンとして動作するストリングで、 ノードにサービスがデプロイされていることを示します。 そのため、 HA シングルトンサービスの「マスター」ノードの候補になります。
両方の場合で、 オブジェクトが登録されたキーが特定のクラスタ化サービスを識別します。 クラスタ内のすべてのノードがすべてのキーでオブジェクトを登録する必要はありません。 特定ノードにデプロイされたサービスのみがサービスのキーを用いて登録を行います。 サービスがクラスター全体で均一にデプロイされる必要はありません。 そのため、 サービスがデプロイされたノードの認識など、 DRM はクラスター関連のサービスの「トポロジ」を理解するメカニズムとして有用です。