Top / JBoss / クラスタリング

JAVA PRESS Vol.38【特別企画】JBossのクラスタリング の記事を参考に、JBossのクラスタリングを試してみました。

JBossのクラスタリングのポイント・特長は

  • HA JNDI機能で、透過的に複数のEJBサーバからオブジェクトを取得できる(負荷分散機能)
  • ハートビートによるノードのフェールオーバ
  • ファーミング機能による、分散環境への自動デプロイ

ですね。

HA JNDIてのは、通常のJNDIではjndi.propertiesなどで接続先を指定してオブジェクトをlookupするところを、ブロードキャストして誰かが答えることによって、接続先を意識しないでオブジェクトをlookupすることができます(負荷分散)。さらに各EJBコンテナはハートビートによる生存確認も行っていて、あるコンテナが死んだときは別のコンテナが処理を続行します(フェールオーバ)。各EJBコンテナは常時メモリのレプリケーションを行って情報を共有し、実行中のコンテナが死んでも他のコンテナが処理を実行できるような仕組みになっています*1

EA2.png

ファーミングというのは、あるサーバにearをデプロイすると、他のサーバにも勝手にコピーされてデプロイされる、という感動的な機能です。ファーミングをONにするとデフォルトでは、

${install_root}/server/all/farm

に置いたファイルが勝手にコピー&デプロイされます。

準備

準備といってもほとんど設定の必要はなく、起動時に

run.sh -c all

とALLオプションで起動するだけです。これだけで、同じセグメント内のJBossプロセスの自動認識やSessionBean?のレプリケーション、JNDIのレプリケーションなどが自動的に行われるみたいです。あとファーミング機能もONになります。

流れ

一連の流れとしては

  • 各サーバで run.sh -c all で起動
  • Session Beanのクラスコメントで、クラスタ化するというXDocletタグを追加
  • ファーミング機能を使ってEarをデプロイ

となります。

WEBコンテナのクラスタリング / セッションレプリケーション

EJBコンテナのクラスタリング / レプリケーション

Stateless Session Beanの場合

さてStateless Session Beanからやってみましょう。といっても拍子抜けするくらい簡単です。SessionBean?のクラスコメントに

* @ejb.bean name="HelloEJB" display-name = "HelloEJB" jndi-name="HelloEJBHoge"
*           type = "Stateless" view-type = "remote"
* @ejb.interface remote-class="hello.ejb.Hello"
* @ejb.home remote-class="hello.ejb.HelloHome"
* @jboss.clustered <-これを追加

と @jboss.clustered を追加するだけでOKです。これでInitialContext?からのlookup時に、クラスター化されたEJBコンテナどれかが応答して、処理を実行してくれます。

ただ、EJBクライアントがただのクラスの場合はうまくいくんだけど、WEBコンテナにデプロイされたServlet上でlookupした場合は、ローカルのInitialContext?しか参照しないみたいですね。どっかに設定があるはずなんだけど。。。。

Stateful Session Beanの場合


この記事は

選択肢 投票
おもしろかった 9  
そうでもない 2  

Top / JBoss / クラスタリング

現在のアクセス:12409


*1 当然ラウンドロビンするより同じコンテナが処理した方が速いので、デフォルトでは同じコンテナが処理するようになっている模様。WebSphereではSession Affinityとか言う機能でしたね

添付ファイル: fileEA2.png 1315件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-03-15 (金) 15:05:16 (2096d)