4.3.3 可用性と耐障害性の向上
ミッションクリティカルな業務システムには,システムが提供するサービスをできるだけ停止することなく,安定して提供し続けられる仕組みが求められます。
例えば,提供するサービスの内容によっては,24時間連続稼働が求められるサービスや,障害が発生して業務システムが止まることで大きな損失が発生するサービスもあります。
このため,業務システムの基盤であるアプリケーションサーバには,まず,障害を未然に防ぐこと,そして,もし障害が発生しても,障害の影響範囲を局所的に抑え,業務システムを止めることなく運用し続けられることが求められます。また,障害が発生した個所は迅速に回復できることが必要です。
ここでは,アプリケーションサーバで実現できる,可用性と耐障害性の高いシステムの特長について説明します。
- 〈この項の構成〉
(1) FullGCの発生抑止
FullGCの発生を抑止することによって,システムが停止する回数を低減します。
FullGCは,JavaヒープのTenured領域のオブジェクトが増加することで発生します。Tenured領域には,長寿命なオブジェクト(利用期間が長いオブジェクト)が配置されます。アプリケーションサーバでは,FullGC発生の要因になる長寿命なオブジェクトのうち,利用期間が明確なオブジェクトを独自のメモリ空間に配置します。このメモリ空間をExplicitヒープといいます。ExplicitヒープはFullGCの対象にはならないため,これらのオブジェクトによるFullGC発生を抑止できます。
アプリケーションサーバでは,HTTPセッションに関するオブジェクトをExplicitヒープに配置します。
HTTPセッションに関するオブジェクトの場合のExplicitヒープを使用したFullGCの発生抑止の概要を次の図に示します。
New領域からTenured領域に昇格するオブジェクトの一部をExplicitヒープに移動します。これによって,Tenured領域のメモリサイズ増加を抑え,FullGC発生を抑止します。
このほか,ユーザアプリケーションの修正によって,アプリケーション内でFullGCの要因になっているオブジェクトを直接Explicitヒープに生成する実装もできます。
(2) 障害発生の未然防止
アプリケーションやリソースの稼働状態を監視して,障害の予兆を検知し,障害発生を予防できます。また,しきい値を設定して監視することで,しきい値を超えた場合に自動的に対処するためのアクションも定義できます。
例えば,リクエストの集中によってJavaVMでFullGCが多発する場合に,一定時間内に発生するFullGCの回数にしきい値を設定して監視できます。しきい値を超えた場合にリクエストの同時実行数を動的に減らすなどの処理を自動実行することで,システムのスローダウンを予防できます。
(3) 障害発生時の可用性向上
障害発生時の可用性を高めるためには,次の機能を使用できます。
-
クライアントとWebサーバ間,WebサーバとWebコンテナ間,EJBクライアントとEJBコンテナ間,EJBクライアントとネーミングサービス間などできめ細かくタイムアウトが設定できます。これによって,通信先のマシンに障害が発生している場合でも,数秒で障害を検知でき,無応答などによってサービスを停滞させません。
また,アプリケーション内のメソッドレベルの処理にもタイムアウトを設定できます。これによって,無限ループなどの問題がアプリケーション内で発生した場合に速やかにその処理をキャンセルして,業務を継続できます。
-
クラスタソフトウェアとの連携
クラスタソフトウェアと連携してアプリケーションサーバや運用管理用のサーバをクラスタ構成にすることで,障害発生時に速やかに系切り替えを実行し,サービスの停止を防げます(1:1クラスタ構成,相互切り替え構成,またはホスト単位管理モデルを対象とした切り替え構成)。
また,リソース使用中のアプリケーションサーバで障害が発生した場合に備え,1台の待機サーバを用意しておくことで,障害発生時にすぐにリソースを解放しトランザクション処理を決着できます(N:1クラスタ構成)。
-
Webシステムで,すでにクライアントからのセッションが確立されているサーバに障害が発生したときに,セッション情報をほかのサーバに引き継いで,サービスを継続できます。セッション情報はデータベースで管理できます。WebサーバやJ2EEサーバに障害が発生した場合も,データベースからセッション情報を回復し,サービスを継続します。
-
バックエンドシステムとの再接続
データベースなどのバックエンドシステムとの接続が異常終了した場合,自動再接続できます。
-
アプリケーションサーバでは,この製品のJavaVM(以降,JavaVMと呼びます)を提供しています。JavaVMは,Javaオブジェクトの状態に関する詳細なログを出力する機能を備えています。このログは,障害発生の要因分析や,性能向上のためのチューニングに活用できます。