Terracottaを使ったCASサーバ(CAS-3.4.2)のクラスタ化


CASサーバを本格的に運用しようとすると、サーバの保守・障害に対処するために複数のサーバを用いてCASサーバをクラスタ化する必要があります。ここではJava VMクラスタリング用ミドルウェアTerracottaを用いたCASサーバクラスタの構築方法を紹介します。

注:手元で一応動いてはいますが、動作を保証するものではありません


はじめに

CASサーバ自身はデータベースを使わないJ2EE準拠のWebアプリケーションなので簡単にクラスタ化できそうに思えますが、実はHTTPセッションをクラスタ化するだけでは不十分です。発行するチケットのIDが一意になることを保証する必要があり、また、発行済みチケットのキャッシュもクラスタ化する必要があります。

JA-SIGのページではTomcatのクラスタリング機能とCASサーバのbean設定を組み合わせてCASサーバのクラスタ化を実現する方法が紹介されています。

ただしbean設定を見ての通り、チケットに関連するクラスを他のクラスに置き換えたり、コンストラクタの引数を修正したりと、設定がうまくいったかどうかを確認するだけでも大変です。カスタマイズ内容がCASサーバの実装に依存するので、CASサーバのバージョン毎に設定内容が違うのもサーバの保守を難しくします。

Terracottaの場合は「クラスタ内のJava VM間でヒープの状態を同一に保つ」という方法でアプリケーションのクラスタ化を実現するので、CASサーバを構成するbeanのカスタマイズ方法をあれこれ考えずにクラスタ化が実現できます。
 

システム構成

今回は以下のソフトウェアを用いてCASサーバクラスタを構築しました。

  •     tomcat-5.5.X
  •     CAS-3.4.2
  •     Apache-2.2.X
  •     Terracotta-3.2.1

サーバ構成は例えば次のようになります。

  • Webサーバ(以下、apache.yourdomain)
    • Apacheをインストール
    • mod_proxy_ajp,mod_proxy_balancerを使い、複数Tomcat間でstickysession有りのフェイルオーバーを設定
  • CAS用Tomcatサーバ(以下、tomcatA.yourdomain,tomcatB.yourdomain)
    • AJPコネクタを設定
    • stickysession用にjvmRouteを設定
    • Terracottaをインストール
    • Terracottaサーバ(terracotta.yourdomain)のクライアントになるようtomcatを設定
    • 各Tomcat上でCASサーバ(Terracotta用の改変は不要)をデプロイ
  • Terracottaサーバ(以下、terracotta.yourdomain)
    • Terracottaをインストール
    • CAS認証に関係するクラスをクラスタ化するように設定

この構成では、tomcatA,tomcatBの一方が停止してもCASによるユーザ認証サービスを継続することができます。なお、Webサーバ、Terracottaサーバも二重化するのが望ましいのは言うまでもありません。

 

Terracottaのインストール

Terracottaのページからダウンロード・インストールします。ダウンロードしたjarファイルを次のように実行するとインストーラーが起動します。

        java -jar terracotta-3.2.1_2-installer.jar

GUI環境がないとインストーラーを操作できないので、リモートサーバーの場合はsshでX11ForwardingするかVNCあたりを使って作業します。以下、Terracottaのインストールディレクトリを$TERRACOTTAとします。

 

Terracottaサーバの設定

CAS認証に関係するクラスをクラスタ化するように設定ファイルを記述し、Terracottaサーバを起動します。設定ファイルはこれです。CAS-3.3で配布されているTerracottaの設定ファイルを元にしていますが、GoogleAppsのSAML認証に対応できるように変更してあります。なお、この設定ファイルではCASサーバをcas-server-webapp-3.4.2という名称でデプロイするものとしています。

$TERRACOTTA/bin/start-tc-server.sh -f $TERRACOTTA/etc/tc-config.xml

 

Terracottaクライアントの設定

tomcatがTerracottaのクライアントとして動作するよう、$CATALINA_HOME/bin/setnenv.shを記述します。設定ファイルはこれです(この設定ファイルではTerracottaが/usr/local/terracottaにインストールされているものとしています)。また、Terracotta用の追加モジュール(TIM)を次のようにしてインストールします。

  1. 適当なディレクトリ(例えば/tmp)にTerracottaサーバと同一内容の設定ファイル(tc-config.xml)を置きます。
  2. $TERRACOTTA/bin/tim-get.sh upgrade /tmp/tc-config.xmlを実行し、必要なTIMモジュールをダウンロード・インストールします。
  3. 上記作業をtomcatA,tomcatBの両方で行います

その他、Terracottaサーバと通信できるようにファイアウォールの設定を適宜行います。

 

CASサーバの起動

クラスタ化を行わない通常の設定を行ったCASサーバをtomcatA,tomcatBでデプロイします。$CATALINA_HOME/bin/startup.shとしてtomcatを起動します。startup.shから自動的にsetenv.shが呼び出され、tomcatがTerracottaクライアントとして起動されます。このとき、Terracottaサーバと通信ができないとTomcatが起動できないので注意してください。

 

Terracottaの動作確認

Terracottaサーバ、Tomcatを動作させた状態でTerracottaの管理コンソールを起動すると、どのクラスがクラスタ化されたかを確認できます。

Terracottaサーバ(terracotta.yourdomain)上で$TERRACOTTA/bin/dev-console.shを実行すると管理コンソールが表示されます。うまく動作していれば"Clustered heap"のところにある"Object browser"の項目が"(3 roots)"になっているはずです。また、"Object browser"の項目をクリックするとorg.jasig.cas.ticket.registry.DefaultTicketRegistry.cache,tc.session,org.jasig.cas.services.DefaultServicesManagerImpl.servicesの様子を見ることができます。

 

参考資料

    Clustering CAS
    https://wiki.jasig.org/display/CASUM/Clustering+CAS

    The Definitive Guide To Terracotta
    Apress(洋書)

    CAS 3.3用Terracotta設定ファイル
    https://source.jasig.org/cas3/trunk/etc/terracotta/sample-terracotta-con...

    Tomcatハンドブック第2版
    オライリー・ジャパン

    Clustering Web Applications with Terracotta Web Sessions
    http://www.terracotta.org/documentation/betadocs/web-sessions-intro.html...
    ※閲覧にはユーザ登録が必要
 

AttachmentSize
Plain text icon tc-config.xml_.txt8.36 KB
Plain text icon setenv.sh_.txt190 bytes