TOP
>
設計・移行・活用
> クラスタリング/ファーミング
オープンソースJ2EE APサーバ JBossの可能性
第5回:JBossの固有機能
著者:
ダイテックC&D 高橋 康弘
2005/5/27
1
2
3
4
次のページ
クラスタリング/ファーミング
クラスタリングとは、主としてハードウェア障害が発生した場合であってもサービスを提供し続けることを目的とした技術です。具体的には、2台以上のサーバを用意して、サーバ群の一部がダウンした場合であっても残りのサーバがサービスを提供し続けるようなしくみを用意することになります。
このとき注意して欲しいのは、サーバの台数が増えるからといってパフォーマンス、例えばレスポンスタイムやスループットなどが向上するわけではないという点です。むしろ多くの場合、可用性が向上する代わりにパフォーマンスが低下します。
パフォーマンスを向上するためには、ロードバランスのためのしくみ(ハードウェア/ソフトウェア・ロードバランサの導入など)を別途用意するなどの対応が必要となります。ただし後ほど説明しますが、JBossの場合はこういった問題を回避しようという仕掛けがあります。
JBossのクラスタリング
JBossにはクラスタリングのしくみが標準で用意されていますので、手軽に可用性を高めることができます。JBossをクラスタリング構成で稼働させるには、「default」ではなく「all」の設定を使用します。つまり、下記のコマンドでJBossを起動します。
run -c all
これだけで、JBossはクラスタで動作する準備が整いました。
※補足:
もちろん、以前の連載で説明したように$JBOSS_HOME\server以下の「all」ディレクトリをまるごとコピーして、例えばmyAppAllなどとディレクトリ名をリネームした場合は「run -c myAppAll」となります。
LANの同一セグメント上に接続されている2台のPCを用意して、両方のPC上で上記のようにall設定を用いてJBossを起動すれば、自動的にお互いのサーバの検出および認識をし、クラスタに必要なサービスが開始されます。
ステート情報のレプリケーション
JBossのクラスタリングは、メモリ上のステート(状態)をレプリケーションすることによって実現されています。例えば、サーバAとサーバBがあり、サーバAに接続してログオンしたとします。その後、サーバAを停止させてサーバBへアクセスした場合、再度ログオンすることなしに、あたかもサーバAに接続しているかのように継続してサービスを利用することができます。
この動作をもう少し細かく見ていくと、クライアント(ブラウザ)がサーバAにアクセスした時点で、サーバAのメモリ上にセッションと呼ばれるオブジェクトが作成されます。このオブジェクトの中には様々なステート、例えばログオンしたかどうかのフラグなどが含まれています。こういったステート情報が自動的にサーバBにレプリケーションされます。
図1:ステート情報のレプリケーション
こういったステート情報のレプリケーション(コピー)はネットワークを通じて行われます。また、サーバAとBの間に親子の関係(プライマリ/スレーブなど)はありませんので、1アクセス毎に別々のサーバに接続してもお互いにステート情報がレプリケーションされます。
例としてHTTPセッションを取り上げましたが、このステート情報はステートフル・セッションBeanにおいても適用することができます。ちなみステートレス・セッションBeanの場合は、そもそもレプリケーションするステートが存在しません。
先に掲げた図にもある通り、JBoss単体ではアクセスを振り分けるしくみを提供していませんので、別途用意する必要があります。最も手軽かつ安価にこれを実現するには、Apache httpdサーバ+mod_jk 1.2.xを用いるなどの方法があります(注1)。もちろん、ハードウェア・ロードバランサやリバースプロキシなどを用いても構いません。
※注1:
下記URLを参照して下さい。
http://www.jboss.org/wiki/Wiki.jsp?page=UsingMod_jk1.2WithJBoss
1
2
3
4
次のページ
著者プロフィール
株式会社ダイテックC&D 高橋 康弘
入社以来Windowsを中心としたアプリケーション開発に従事。2000年頃からJavaを扱うようになり、2年ほど前からオープンソースを利用したシステム開発を開始。最近はJBoss+オープンソースの組み合わせでWEBアプリケーション開発に携わることが多い。
資格:JBoss認定コンサルタント
INDEX
第5回:JBossの固有機能
クラスタリング/ファーミング
クラスタリングの注意点
シリアライゼーションを低減させる
アスペクト指向プログラミングの例