TOP比較データ> はじめに
Javaアプリケーションサーバのクラスタリング機能比較
Javaアプリケーションサーバのクラスタリング機能比較

第3回:JBossによるクラスタリングの実現
著者:サンモアテック  小林 俊哉   2005/11/7
1   2  3  4  次のページ
はじめに

   今回と次回にわたってオープンソースでJ2EEに対応したアプリケーションサーバであるJBossのクラスタリングについて解説します。JBossのバージョン4はSunのJ2EE認定も受けており、機能面では商用のJ2EE対応のアプリケーションサーバにも引けを取らないといえます。

   JBossについての詳しい説明は割愛しますが、今回解説するクラスタリング(クラスタはJ2EEの仕様では規定されていませんが)についても、本番運用を見据えた高可用性を実現するに足る様々な機能を実装しています。

   今回は最新バージョン(2005年11月現在)であるJBoss 4.0.3SP1にフォーカスを当てて解説しますが、基本的には3.2.xでも同様の機能とアーキテクチャを持っています。

   第3回となる今回はJBossが持つクラスタ機能の概要とクラスタの基本セッティングおよびその動作確認、そしてHTTPセッションレプリケーションについて解説します。次回の第4回ではEJB/JMS/JNDIといったそのほかの要素のクラスタリング、そして使用にあたっての注意点を解説します。


JBossのインストール

   クラスタリングの解説の前にJBossのインストールについて説明します。

   インストールの方法は非常にシンプルです。まず以下のURLからJBoss 4.0.3SP1をダウンロードしてください。zipでもtar.gzでもアーカイブの内容は同じです。

JBoss.com - JBoss Application Server Downloads
http://www.jboss.com/products/jbossas/downloads

   続いてアーカイブを展開します。

Linuxでの例
$ tar zxf jboss-4.0.3SP1.tar.gz

   最後に環境変数を設定します。JAVA_HOMEにはJBossを実行するJDKのインストールディレクトリを、JBOSS_HOMEにはJBossのインストールディレクトリを指定します。

Linuxでの例
$ export JAVA_HOME=/usr/j2sdk
$ export JBOSS_HOME=/usr/local/jboss-4.0.3SP1
   以上です。とても簡単ですね。後はrun.sh(Windows環境ならrun.bat)を実行すればJBossが起動します。


JBossのクラスタリング概要

   JBossのクラスタリングは以下のような特徴を持ちます。

  1. クラスタノードの自動検出
  2. フェイルオーバーおよびロードバランシング
    • JNDI
    • RMI
    • Entity Bean
    • Stateless Session Bean
    • Stateful Session Bean(ステートのレプリケーションを含む)
  3. HTTPセッションのレプリケーション
  4. 動的なJNDI検索、JNDI treeのレプリケーション
  5. ファーミング(デプロイの共有)
  6. RMIロードバランシングポリシーのプラグイン

表1:JBossのクラスタリングの特徴

   まず"JBossインストールディレクトリ/server/all/deploy/
cluster-service.xml"を見てください。

<mbean code="org.jboss.ha.framework.server.ClusterPartition"
     name="jboss:service=${jboss.partition.name:DefaultPartition}">

     <!-- Name of the partition being built -->
     <attribute name="PartitionName">${jboss.partition.name:DefaultPartition}</attribute>

(省略)

     <!-- The JGroups protocol configuration -->
     <attribute name="PartitionConfig">
          <!--
          The default UDP stack:
          - If you have a multihomed machine, set the UDP protocol's bind_addr attribute to the
          appropriate NIC IP address, e.g bind_addr="192.168.0.2".
          - On Windows machines, because of the media sense feature being broken with multicast
          (even after disabling media sense) set the UDP protocol's loopback attribute to true
          -->
          <Config>
               <UDP mcast_addr="${jboss.partition.udpGroup:228.1.2.3}" mcast_port="45566"
                    ip_ttl="8" ip_mcast="true"
                    mcast_send_buf_size="800000" mcast_recv_buf_size="150000"
                    ucast_send_buf_size="800000" ucast_recv_buf_size="150000"
                    loopback="false"/>
               <PING timeout="2000" num_initial_members="3"
                    up_thread="true" down_thread="true"/>
               <MERGE2 min_interval="10000" max_interval="20000"/>
               <FD shun="true" up_thread="true" down_thread="true"
                    timeout="2500" max_tries="5"/>
               <VERIFY_SUSPECT timeout="3000" num_msgs="3"
                    up_thread="true" down_thread="true"/>
               <pbcast.NAKACK gc_lag="50" retransmit_timeout="300,600,1200,2400,4800"
                    max_xmit_size="8192"
                    up_thread="true" down_thread="true"/>
               <UNICAST timeout="300,600,1200,2400,4800" window_size="100" min_threshold="10"
                    down_thread="true"/>
               <pbcast.STABLE desired_avg_gossip="20000"
                    up_thread="true" down_thread="true"/>
               <FRAG frag_size="8192"
                    down_thread="true" up_thread="true"/>
               <pbcast.GMS join_timeout="5000" join_retry_timeout="2000"
                    shun="true" print_local_addr="true"/>
               <pbcast.STATE_TRANSFER up_thread="true" down_thread="true"/>
          </Config>

(省略)

     </attribute>
     <depends>jboss:service=Naming</depends>
</mbean>
   クラスタに関連したMBeanがいくつか定義されていますが、一番上の「name="jboss:service=${jboss.partition.name:DefaultPartition}"」と名づけられたMBeanがパーティション、つまり1つのクラスタグループを表しています。

   属性(「attribute」要素で表現されます)PartitionNameにより、各JBossは自分がどのパーティションに属するかを判別します。PartitionNameはシステム・プロパティ"jboss.partition.name"で指定可能で、デフォルトは"DefaultPartition"です。

   JBossはクラスタリングの通信バックボーンには、JGroupsを採用しています。JGroupsはUDP、TCP、そのほかのプロトコルを組み合わせることにより、信頼性の高いマルチキャスト通信を実現します。前述したMBeanの属性"PartitionConfig"の中で、JGroupsのプロトコルに関する細かい設定が可能です。

JGroups - The JGroups Project
http://www.jgroups.org

   同じネットワーク内に複数のパーティションを設ける場合は、"PartitionName"を区別することで実現できます(加えてJGroupsで使用するマルチキャストのアドレス/ポートをパーティションごとに区別する必要があります)。

複数のパーティションを設ける場合
図1:複数のパーティションを設ける場合

1   2  3  4  次のページ


株式会社サンモアテック 小林 俊哉
著者プロフィール
株式会社サンモアテック  小林 俊哉
株式会社サンモアテック 技術開発事業部
2001年入社。NOMAD(4GL言語)開発にはじまり、Webサービス、グリッドなどの新技術検証、またJBossやTomcatを含むオープンソース製品のサポートに従事。


INDEX
第3回:JBossによるクラスタリングの実現
はじめに
  クラスタセッティング
  JBossCache
  jbossweb-tomcat55.sar/META-INF/jboss-service.xml